From f81e4ed350c4a442854b1d2f21f43fa4f2cfef98 Mon Sep 17 00:00:00 2001 From: diPhantxm Date: Fri, 23 Jun 2023 20:35:22 +0300 Subject: [PATCH] flat structures --- ozon/analytics.go | 108 ++-- ozon/brands.go | 30 +- ozon/cancellations.go | 58 +- ozon/categories.go | 120 ++-- ozon/certificates.go | 296 +++++---- ozon/chats.go | 256 ++++---- ozon/fbo.go | 344 +++++----- ozon/fbs.go | 1198 ++++++++++++++++++---------------- ozon/finance.go | 376 ++++++----- ozon/invoices.go | 10 +- ozon/products.go | 1434 ++++++++++++++++++++++------------------- ozon/promotions.go | 446 +++++++------ ozon/rating.go | 214 +++--- ozon/reports.go | 416 ++++++------ ozon/returns.go | 168 ++--- ozon/strategies.go | 142 ++-- ozon/warehouses.go | 152 ++--- 17 files changed, 3120 insertions(+), 2648 deletions(-) diff --git a/ozon/analytics.go b/ozon/analytics.go index 10d8883..72125c1 100644 --- a/ozon/analytics.go +++ b/ozon/analytics.go @@ -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 diff --git a/ozon/brands.go b/ozon/brands.go index a03f502..e7ab3fe 100644 --- a/ozon/brands.go +++ b/ozon/brands.go @@ -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 diff --git a/ozon/cancellations.go b/ozon/cancellations.go index fce21e7..ad7f0d5 100644 --- a/ozon/cancellations.go +++ b/ozon/cancellations.go @@ -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" diff --git a/ozon/categories.go b/ozon/categories.go index 6963b0e..f9ea6ca 100644 --- a/ozon/categories.go +++ b/ozon/categories.go @@ -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. diff --git a/ozon/certificates.go b/ozon/certificates.go index e60475c..8fb76e3 100644 --- a/ozon/certificates.go +++ b/ozon/certificates.go @@ -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) { diff --git a/ozon/chats.go b/ozon/chats.go index 4a7bd63..6648f36 100644 --- a/ozon/chats.go +++ b/ozon/chats.go @@ -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 diff --git a/ozon/fbo.go b/ozon/fbo.go index 950c41d..8c018b0 100644 --- a/ozon/fbo.go +++ b/ozon/fbo.go @@ -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" @@ -475,34 +495,42 @@ type GetWarehouseWorkloadResponse struct { core.CommonResponse // Method result - Result []struct { - // Workload - Schedule struct { - // Data on the products quantity supplied to the warehouse - Capacity []struct { - // Period start, local time - Start time.Time `json:"start"` + Result []GetWarehouseWorkloadResult `json:"result"` +} - // Period end, local time - End time.Time `json:"end"` +type GetWarehouseWorkloadResult struct { + // Workload + Schedule GetWarehouseWorkloadResultSchedule `json:"schedule"` - // Average number of products that the warehouse can accept per day for the period - Value int32 `json:"value"` - } `json:"capacity"` + // Warehouse + Warehouse GetWarehouseWorkloadResultWarehouse `json:"warehouse"` +} - // The closest available date for supply, local time - Date time.Time `json:"date"` - } `json:"schedule"` +type GetWarehouseWorkloadResultSchedule struct { + // Data on the products quantity supplied to the warehouse + Capacity []GetWarehouseWorkloadResultScheduleCapacity `json:"capacity"` - // Warehouse - Warehouse struct { - // Warehouse identifier - Id string `json:"id"` + // The closest available date for supply, local time + Date time.Time `json:"date"` +} - // Warehouse name - Name string `json:"name"` - } `json:"warehouse"` - } `json:"result"` +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 diff --git a/ozon/fbs.go b/ozon/fbs.go index 72a305a..c00f501 100644 --- a/ozon/fbs.go +++ b/ozon/fbs.go @@ -49,25 +49,9 @@ type ListUnprocessedShipmentsResult struct { } type FBSPosting struct { - Addressee struct { - Name string `json:"name"` - Phone string `json:"phone"` - } `json:"addressee"` + Addressee FBSPostingAddressee `json:"addressee"` - AnalyticsData struct { - City string `json:"city"` - DeliveryDateBegin time.Time `json:"delivery_date_begin"` - DeliveryDateEnd time.Time `json:"delivery_date_end"` - DeliveryType string `json:"delivery_type"` - IsLegal bool `json:"is_legal"` - IsPremium bool `json:"is_premium"` - PaymentTypeGroupName string `json:"payment_type_group_name"` - Region string `json:"region"` - TPLProvider string `json:"tpl_provider"` - TPLProviderId int64 `json:"tpl_provider_id"` - Warehouse string `json:"warehouse"` - WarehouseId int64 `json:"warehouse_id"` - } `json:"analytics_data"` + AnalyticsData FBSPostingAnalyticsData `json:"analytics_data"` Barcodes FBSBarcode `json:"barcodes"` @@ -92,7 +76,7 @@ type FBSPosting struct { Products []PostingProduct `json:"products"` - // The parameter is only relevant for bulky products + // The parameter is only relevant for bulky products // with a delivery by a third-party or integrated service PRROption PRROptionStatus `json:"prr_option"` @@ -104,6 +88,26 @@ type FBSPosting struct { TrackingNumber string `json:"tracking_number"` } +type FBSPostingAddressee struct { + Name string `json:"name"` + Phone string `json:"phone"` +} + +type FBSPostingAnalyticsData struct { + City string `json:"city"` + DeliveryDateBegin time.Time `json:"delivery_date_begin"` + DeliveryDateEnd time.Time `json:"delivery_date_end"` + DeliveryType string `json:"delivery_type"` + IsLegal bool `json:"is_legal"` + IsPremium bool `json:"is_premium"` + PaymentTypeGroupName string `json:"payment_type_group_name"` + Region string `json:"region"` + TPLProvider string `json:"tpl_provider"` + TPLProviderId int64 `json:"tpl_provider_id"` + Warehouse string `json:"warehouse"` + WarehouseId int64 `json:"warehouse_id"` +} + type FBSBarcode struct { LowerBarcode string `json:"lower_barcode"` UpperBarcode string `json:"upper_barcode"` @@ -152,19 +156,7 @@ type PostingProduct struct { } type FBSCustomer struct { - Address struct { - AddressTail string `json:"address_tail"` - City string `json:"city"` - Comment string `json:"comment"` - Country string `json:"country"` - District string `json:"district"` - Latitude float64 `json:"latitude"` - Longitude float64 `json:"longitude"` - ProviderPVZCode string `json:"provider_pvz_code"` - PVZCode int64 `json:"pvz_code"` - Region string `json:"region"` - ZIPCode string `json:"zip_code"` - } `json:"customer"` + Address FBSCustomerAddress `json:"customer"` CustomerEmail string `json:"customer_email"` CustomerId int64 `json:"customer_id"` @@ -172,6 +164,20 @@ type FBSCustomer struct { Phone string `json:"phone"` } +type FBSCustomerAddress struct { + AddressTail string `json:"address_tail"` + City string `json:"city"` + Comment string `json:"comment"` + Country string `json:"country"` + District string `json:"district"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + ProviderPVZCode string `json:"provider_pvz_code"` + PVZCode int64 `json:"pvz_code"` + Region string `json:"region"` + ZIPCode string `json:"zip_code"` +} + type MarketplaceServices struct { DeliveryToCustomer float64 `json:"marketplace_service_item_deliv_to_customer"` DirectFlowTrans float64 `json:"marketplace_service_item_direct_flow_trans"` @@ -187,25 +193,27 @@ type MarketplaceServices struct { } type FinancialDataProduct struct { - Actions []string `json:"actions"` - ClientPrice string `json:"client_price"` - CommissionAmount float64 `json:"commission_amount"` - CommissionPercent int64 `json:"commission_percent"` - CommissionsCurrencyCode string `json:"commissions_currency_code"` - ItemServices MarketplaceServices `json:"item_services"` - CurrencyCode string `json:"currency_code"` - OldPrice float64 `json:"old_price"` - Payout float64 `json:"payout"` - Picking struct { - Amount float64 `json:"amount"` - Moment time.Time `json:"moment"` - Tag string `json:"tag"` - } `json:"picking"` - Price float64 `json:"price"` - ProductId int64 `json:"product_id"` - Quantity int64 `json:"quantity"` - TotalDiscountPercent float64 `json:"total_discount_percent"` - TotalDiscountValue float64 `json:"total_discount_value"` + Actions []string `json:"actions"` + ClientPrice string `json:"client_price"` + CommissionAmount float64 `json:"commission_amount"` + CommissionPercent int64 `json:"commission_percent"` + CommissionsCurrencyCode string `json:"commissions_currency_code"` + ItemServices MarketplaceServices `json:"item_services"` + CurrencyCode string `json:"currency_code"` + OldPrice float64 `json:"old_price"` + Payout float64 `json:"payout"` + Picking FinancialDataProductPicking `json:"picking"` + Price float64 `json:"price"` + ProductId int64 `json:"product_id"` + Quantity int64 `json:"quantity"` + TotalDiscountPercent float64 `json:"total_discount_percent"` + TotalDiscountValue float64 `json:"total_discount_value"` +} + +type FinancialDataProductPicking struct { + Amount float64 `json:"amount"` + Moment time.Time `json:"moment"` + Tag string `json:"tag"` } func (c FBS) ListUnprocessedShipments(params *ListUnprocessedShipmentsParams) (*ListUnprocessedShipmentsResponse, error) { @@ -290,16 +298,18 @@ type GetFBSShipmentsListResponse struct { core.CommonResponse // Array of shipments - Result struct { - // Indicates that the response returned not the entire array of shipments: - // - // - true — it is necessary to make a new request with a different offset value to get information on the remaining shipments; - // - false — the entire array of shipments for the filter specified in the request was returned in the response - HasNext bool `json:"has_next"` + Result GetFBSShipmentsListResult `json:"result"` +} - // Shipment details - Postings []FBSPosting `json:"postings"` - } `json:"result"` +type GetFBSShipmentsListResult struct { + // Indicates that the response returned not the entire array of shipments: + // + // - true — it is necessary to make a new request with a different offset value to get information on the remaining shipments; + // - false — the entire array of shipments for the filter specified in the request was returned in the response + HasNext bool `json:"has_next"` + + // Shipment details + Postings []FBSPosting `json:"postings"` } // Returns a list of shipments for the specified time period: it shouldn't be longer than one year. @@ -353,18 +363,20 @@ type PackOrderResponse struct { core.CommonResponse // Additional information about shipments - AdditionalData []struct { - // Shipment number - PostingNumber string `json:"posting_number"` - - // List of products in the shipment - Products []PostingProduct `json:"products"` - } `json:"additional_data"` + AdditionalData []PackOrderAdditionalData `json:"additional_data"` // Order packaging result Result []string `json:"result"` } +type PackOrderAdditionalData struct { + // Shipment number + PostingNumber string `json:"posting_number"` + + // List of products in the shipment + Products []PostingProduct `json:"products"` +} + // Divides the order into shipments and changes its status to awaiting_deliver. // // Each element of the packages may contain several instances of the products. One instance of the products is one shipment. Each element of the products is a product included into the shipment. @@ -421,22 +433,26 @@ type ValidateLabelingCodesResponse struct { core.CommonResponse // Method result - Result struct { - // Products list - Products []struct { - // Error code - Error string `json:"error"` + Result ValidateLabelingCodesResult `json:"result"` +} - // Product items data - Exemplars []FBSProductExemplar `json:"exemplars"` +type ValidateLabelingCodesResult struct { + // Products list + Products []ValidateLabelingCodesResultProduct `json:"products"` +} - // Product identifier - ProductId int64 `json:"product_id"` +type ValidateLabelingCodesResultProduct struct { + // Error code + Error string `json:"error"` - // Check result. true if the labeling codes of all product items meet the requirements - Valid bool `json:"valid"` - } `json:"products"` - } `json:"result"` + // Product items data + Exemplars []FBSProductExemplar `json:"exemplars"` + + // Product identifier + ProductId int64 `json:"product_id"` + + // Check result. true if the labeling codes of all product items meet the requirements + Valid bool `json:"valid"` } // Method for checking whether labeling codes meet the "Chestny ZNAK" system requirements on length and symbols. @@ -465,76 +481,82 @@ type GetShipmentDataByBarcodeResponse struct { core.CommonResponse // Method result - Result struct { - // Analytical data - AnalyticsData struct { - // Delivery city - City string `json:"city"` + Result GetShipmentDataByBarcodeResult `json:"result"` +} - // Delivery method - DeliveryType string `json:"delivery_type"` +type GetShipmentDataByBarcodeResult struct { + // Analytical data + AnalyticsData GetShipmentDataByBarcodeResultAnalyticsData `json:"analytics_data"` - // Indication that the recipient is a legal entity: - // - true — a legal entity - // - false — a natural person - IsLegal bool `json:"is_legal"` + // Shipment barcodes + Barcodes FBSBarcode `json:"barcodes"` - // Premium subscription availability - IsPremium bool `json:"is_premium"` + // Cancellation reason identifier + CancelReasonId int64 `json:"cancel_reason_id"` - // Payment method - PaymentTypeGroupName string `json:"payment_type_group_name"` + // Date and time when the shipment was created + CreatedAt time.Time `json:"created_at"` - // Delivery region - Region string `json:"region"` - } `json:"analytics_data"` + // Financial data + FinancialData GetShipmentDataByBarcodeResultFinancialData `json:"financial_data"` - // Shipment barcodes - Barcodes FBSBarcode `json:"barcodes"` + // Start date and time of shipment processing + InProcessAt time.Time `json:"in_process_at"` - // Cancellation reason identifier - CancelReasonId int64 `json:"cancel_reason_id"` + // Order identifier to which the shipment belongs + OrderId int64 `json:"order_id"` - // Date and time when the shipment was created - CreatedAt time.Time `json:"created_at"` + // Order number to which the shipment belongs + OrderNumber string `json:"order_number"` - // Financial data - FinancialData struct { - // Identifier of the cluster, where the shipment is sent from - ClusterFrom string `json:"cluster_from"` + // Shipment number + PostingNumber string `json:"posting_number"` - // Identifier of the cluster, where the shipment is delivered to - ClusterTo string `json:"cluster_to"` + // List of products in the shipment + Products []PostingProduct `json:"products"` - // Services - PostingServices []MarketplaceServices `json:"posting_services"` + // Date and time before which the shipment must be packaged. + // If the shipment is not packaged by this date, it will be canceled automatically + ShipmentDate time.Time `json:"shipment_date"` - // Products list - Products []FinancialDataProduct `json:"products"` - } `json:"financial_data"` + // Shipment status + Status string `json:"status"` +} - // Start date and time of shipment processing - InProcessAt time.Time `json:"in_process_at"` +type GetShipmentDataByBarcodeResultAnalyticsData struct { + // Delivery city + City string `json:"city"` - // Order identifier to which the shipment belongs - OrderId int64 `json:"order_id"` + // Delivery method + DeliveryType string `json:"delivery_type"` - // Order number to which the shipment belongs - OrderNumber string `json:"order_number"` + // Indication that the recipient is a legal entity: + // - true — a legal entity + // - false — a natural person + IsLegal bool `json:"is_legal"` - // Shipment number - PostingNumber string `json:"posting_number"` + // Premium subscription availability + IsPremium bool `json:"is_premium"` - // List of products in the shipment - Products []PostingProduct `json:"products"` + // Payment method + PaymentTypeGroupName string `json:"payment_type_group_name"` - // Date and time before which the shipment must be packaged. - // If the shipment is not packaged by this date, it will be canceled automatically - ShipmentDate time.Time `json:"shipment_date"` + // Delivery region + Region string `json:"region"` +} - // Shipment status - Status string `json:"status"` - } `json:"result"` +type GetShipmentDataByBarcodeResultFinancialData struct { + // Identifier of the cluster, where the shipment is sent from + ClusterFrom string `json:"cluster_from"` + + // Identifier of the cluster, where the shipment is delivered to + ClusterTo string `json:"cluster_to"` + + // Services + PostingServices []MarketplaceServices `json:"posting_services"` + + // Products list + Products []FinancialDataProduct `json:"products"` } // Method for getting shipments data by barcode @@ -585,206 +607,228 @@ type GetShipmentDataByIdentifierResponse struct { core.CommonResponse // Method result - Result struct { - // Additional Data Key-Value - AdditionalData []struct { - // Key - Key string `json:"key"` + Result GetShipmentDataByIdentifierResult `json:"result"` +} - // value - Value string `json:"value"` - } `json:"additional_data"` +type GetShipmentDataByIdentifierResult struct { + // Additional Data Key-Value + AdditionalData []GetShipmentDataByIdentifierResultAdditionalData `json:"additional_data"` - // Recipient details - Addressee struct { - // Recipient name - Name string `json:"name"` + // Recipient details + Addressee GetShipmentDataByIdentifierResultAddressee `json:"addressee"` - // Recipient phone number - Phone string `json:"phone"` - } `json:"addressee"` + // Analytics data + AnalyticsData GetShipmentDataByIdentifierResultAnalyticsData `json:"analytics_data"` - // Analytics data - AnalyticsData struct { - // Delivery city - City string `json:"city"` + // Shipment barcodes + Barcodes FBSBarcode `json:"barcodes"` - // Delivery start date and time - DeliveryDateBegin time.Time `json:"delivery_date_begin"` + // Cancellation details + Cancellation FBSCancellation `json:"calcellation"` - // Delivery end date and time - DeliveryDateEnd time.Time `json:"delivery_date_end"` + // Courier information + Courier GetShipmentDataByIdentifierResultCourier `json:"courier"` - // Delivery method - DeliveryType string `json:"delivery_type"` + // Customer details + Customer FBSCustomer `json:"customer"` - // Indication that the recipient is a legal entity: - // - true — a legal entity, - // - false — a natural person - IsLegal bool `json:"is_legal"` + // Date when the shipment was transferred for delivery + DeliveringDate time.Time `json:"delivering_date"` - // Premium subscription availability - IsPremium bool `json:"is_premium"` + // Delivery method + DeliveryMethod FBSDeliveryMethod `json:"delivery_method"` - // Payment method - PaymentTypeGroupName string `json:"payment_type_group_name"` + // Delivery cost + DeliveryPrice string `json:"delivery_type"` - // Delivery region - Region string `json:"region"` + // Data on the product cost, discount amount, payout and commission + FinancialData FBSFinancialData `json:"financial_date"` - // Delivery service - TPLProvider string `json:"tpl_provider"` + // Start date and time of shipment processing + InProcessAt time.Time `json:"in_process_at"` - // Delivery service identifier - TPLProviderId int64 `json:"tpl_provider_id"` + // If Ozon Express fast delivery was used—true + IsExpress bool `json:"is_express"` - // Order shipping warehouse name - Warehouse string `json:"warehouse"` + // Indication that there is a multi-box product in the shipment and you need to pass the number of boxes for it: + // - true — before packaging pass the number of boxes using the /v3/posting/multiboxqty/set method. + // - false — you packed the shipment specifying the number of boxes in the multi_box_qty parameter, or there is no multi-box product in the shipment + IsMultibox bool `json:"is_multibox"` - // Warehouse identifier - WarehouseId int64 `json:"warehouse_id"` - } `json:"analytics_data"` + // Number of boxes in which the product is packed + MultiBoxQuantity int32 `json:"multi_box_qty"` - // Shipment barcodes - Barcodes FBSBarcode `json:"barcodes"` + // Order identifier to which the shipment belongs + OrderId int64 `json:"order_id"` - // Cancellation details - Cancellation FBSCancellation `json:"calcellation"` + // Order number to which the shipment belongs + OrderNumber string `json:"order_number"` - // Courier information - Courier struct { - // Car model - CarModel string `json:"car_model"` + // Number of the parent shipment which split resulted in the current shipment + ParentPostingNumber string `json:"parent_posting_number"` - // Car number - CarNumber string `json:"car_number"` + // Shipment number + PostingNumber string `json:"posting_number"` - // Courier's full name - Name string `json:"name"` + // Information on products and their instances. + // + // The response contains the field product_exemplars, if the attribute with.product_exemplars = true is passed in the request + ProductExemplars GetShipmentDataByIdentifierResultExemplars `json:"product_exemplars"` - // Courier's phone number - Phone string `json:"phone"` - } `json:"courier"` + // Array of products in the shipment + Products []ShipmentProduct `json:"products"` - // Customer details - Customer FBSCustomer `json:"customer"` + // Delivery service status + ProviderStatus string `json:"provider_status"` - // Date when the shipment was transferred for delivery - DeliveringDate time.Time `json:"delivering_date"` + // Information on lifting service. Only relevant for bulky products + // with a delivery by a third-party or integrated service + PRROption GetShipmentDataByIdentifierResultPRROption `json:"prr_option"` - // Delivery method - DeliveryMethod FBSDeliveryMethod `json:"delivery_method"` + // Related shipments + RelatedPostings GetShipmentDataByIdentifierResultRelatedPostings `json:"related_postings"` - // Delivery cost - DeliveryPrice string `json:"delivery_type"` + // Array of Ozon Product IDs (SKU) for which you need to pass the customs cargo declaration (CCD) number, the manufacturing country, + // product batch registration number, or "Chestny ZNAK" labeling to change the shipment status to the next one + Requirements FBSRequirements `json:"requirements"` - // Data on the product cost, discount amount, payout and commission - FinancialData FBSFinancialData `json:"financial_date"` + // Date and time before which the shipment must be packaged. + // If the shipment is not packaged by this date, it will be canceled automatically + ShipmentDate time.Time `json:"shipment_date"` - // Start date and time of shipment processing - InProcessAt time.Time `json:"in_process_at"` + // Shipment status + Status ShipmentStatus `json:"status"` - // If Ozon Express fast delivery was used—true - IsExpress bool `json:"is_express"` + // Shipment substatus + Substatus ShipmentSubstatus `json:"substatus"` - // Indication that there is a multi-box product in the shipment and you need to pass the number of boxes for it: - // - true — before packaging pass the number of boxes using the /v3/posting/multiboxqty/set method. - // - false — you packed the shipment specifying the number of boxes in the multi_box_qty parameter, or there is no multi-box product in the shipment - IsMultibox bool `json:"is_multibox"` + // Type of integration with the delivery service + TPLIntegrationType TPLIntegrationType `json:"tpl_integration_type"` - // Number of boxes in which the product is packed - MultiBoxQuantity int32 `json:"multi_box_qty"` + // Shipment tracking number + TrackingNumber string `json:"tracking_number"` +} - // Order identifier to which the shipment belongs - OrderId int64 `json:"order_id"` +type GetShipmentDataByIdentifierResultAdditionalData struct { + // Key + Key string `json:"key"` - // Order number to which the shipment belongs - OrderNumber string `json:"order_number"` + // value + Value string `json:"value"` +} - // Number of the parent shipment which split resulted in the current shipment - ParentPostingNumber string `json:"parent_posting_number"` +type GetShipmentDataByIdentifierResultAddressee struct { + // Recipient name + Name string `json:"name"` - // Shipment number - PostingNumber string `json:"posting_number"` + // Recipient phone number + Phone string `json:"phone"` +} - // Information on products and their instances. - // - // The response contains the field product_exemplars, if the attribute with.product_exemplars = true is passed in the request - ProductExemplars struct { - // Products - Products []struct { - // Product identifier in the Ozon system, SKU - SKU int64 `json:"sku"` +type GetShipmentDataByIdentifierResultAnalyticsData struct { + // Delivery city + City string `json:"city"` - // Array of exemplars - Exemplars []FBSProductExemplar `json:"exemplars"` - } `json:"products"` - } `json:"product_exemplars"` + // Delivery start date and time + DeliveryDateBegin time.Time `json:"delivery_date_begin"` - // Array of products in the shipment - Products []struct { - PostingProduct + // Delivery end date and time + DeliveryDateEnd time.Time `json:"delivery_date_end"` - // Product dimensions - Dimensions struct { - // Package height - Height string `json:"height"` + // Delivery method + DeliveryType string `json:"delivery_type"` - // Product length - Length string `json:"length"` + // Indication that the recipient is a legal entity: + // - true — a legal entity, + // - false — a natural person + IsLegal bool `json:"is_legal"` - // Weight of product in the package - Weight string `json:"weight"` + // Premium subscription availability + IsPremium bool `json:"is_premium"` - // Package width - Width string `json:"width"` - } `json:"dimensions"` - } `json:"products"` + // Payment method + PaymentTypeGroupName string `json:"payment_type_group_name"` - // Delivery service status - ProviderStatus string `json:"provider_status"` + // Delivery region + Region string `json:"region"` - // Information on lifting service. Only relevant for bulky products - // with a delivery by a third-party or integrated service - PRROption struct { - // Lifting service code - Code PRROptionStatus `json:"code"` + // Delivery service + TPLProvider string `json:"tpl_provider"` - // Service cost, which Ozon reimburses to the seller - Price string `json:"price"` + // Delivery service identifier + TPLProviderId int64 `json:"tpl_provider_id"` - // Currency - CurrencyCode string `json:"currency_code"` + // Order shipping warehouse name + Warehouse string `json:"warehouse"` - // Floor to which you need to lift the product - Floor string `json:"floor"` - } `json:"prr_option"` + // Warehouse identifier + WarehouseId int64 `json:"warehouse_id"` +} - // Related shipments - RelatedPostings struct { - RelatedPostingNumbers []string `json:"related_posting_numbers"` - } `json:"related_postings"` +type GetShipmentDataByIdentifierResultCourier struct { + // Car model + CarModel string `json:"car_model"` - // Array of Ozon Product IDs (SKU) for which you need to pass the customs cargo declaration (CCD) number, the manufacturing country, - // product batch registration number, or "Chestny ZNAK" labeling to change the shipment status to the next one - Requirements FBSRequirements `json:"requirements"` + // Car number + CarNumber string `json:"car_number"` - // Date and time before which the shipment must be packaged. - // If the shipment is not packaged by this date, it will be canceled automatically - ShipmentDate time.Time `json:"shipment_date"` + // Courier's full name + Name string `json:"name"` - // Shipment status - Status ShipmentStatus `json:"status"` + // Courier's phone number + Phone string `json:"phone"` +} - // Shipment substatus - Substatus ShipmentSubstatus `json:"substatus"` +type GetShipmentDataByIdentifierResultExemplars struct { + // Products + Products []GetShipmentDataByIdentifierResultExemplarsProduct `json:"products"` +} - // Type of integration with the delivery service - TPLIntegrationType TPLIntegrationType `json:"tpl_integration_type"` +type GetShipmentDataByIdentifierResultExemplarsProduct struct { + // Product identifier in the Ozon system, SKU + SKU int64 `json:"sku"` - // Shipment tracking number - TrackingNumber string `json:"tracking_number"` - } `json:"result"` + // Array of exemplars + Exemplars []FBSProductExemplar `json:"exemplars"` +} + +type GetShipmentDataByIdentifierResultPRROption struct { + // Lifting service code + Code PRROptionStatus `json:"code"` + + // Service cost, which Ozon reimburses to the seller + Price string `json:"price"` + + // Currency + CurrencyCode string `json:"currency_code"` + + // Floor to which you need to lift the product + Floor string `json:"floor"` +} + +type GetShipmentDataByIdentifierResultRelatedPostings struct { + RelatedPostingNumbers []string `json:"related_posting_numbers"` +} + +type ShipmentProduct struct { + PostingProduct + + // Product dimensions + Dimensions ProductDimension `json:"dimensions"` +} + +type ProductDimension struct { + // Package height + Height string `json:"height"` + + // Product length + Length string `json:"length"` + + // Weight of product in the package + Weight string `json:"weight"` + + // Package width + Width string `json:"width"` } type FBSProductExemplar struct { @@ -836,16 +880,18 @@ type AddTrackingNumbersResponse struct { core.CommonResponse // Method result - Result []struct { - // Error when processing the request - Error []string `json:"error"` + Result []AddTrackingNumbersResponseResult `json:"result"` +} - // Shipment number - PostingNumber string `json:"posting_number"` +type AddTrackingNumbersResponseResult struct { + // Error when processing the request + Error []string `json:"error"` - // If the request is executed without errors — true - Result bool `json:"result"` - } `json:"result"` + // Shipment number + PostingNumber string `json:"posting_number"` + + // If the request is executed without errors — true + Result bool `json:"result"` } // Add tracking numbers to shipments @@ -893,64 +939,68 @@ type ListOfShipmentCertificatesResponse struct { core.CommonResponse // Request result - Result []struct { - // Shipment identifier - Id int64 `json:"id"` + Result []ListOfShipmentCertificatesResult `json:"result"` +} - // Delivery method identifier - DeliveryMethodId int64 `json:"delivery_method_id"` +type ListOfShipmentCertificatesResult struct { + // Shipment identifier + Id int64 `json:"id"` - // Delivery method name - DeliveryMethodName string `json:"delivery_method_name"` + // Delivery method identifier + DeliveryMethodId int64 `json:"delivery_method_id"` - // Type of integration with the delivery service: - // - ozon — delivery by the Ozon service, - // - 3pl — delivery by the integrated service - IntegrationType string `json:"integration_type"` + // Delivery method name + DeliveryMethodName string `json:"delivery_method_name"` - // Number of package units - ContainersCount int32 `json:"container_count"` + // Type of integration with the delivery service: + // - ozon — delivery by the Ozon service, + // - 3pl — delivery by the integrated service + IntegrationType string `json:"integration_type"` - // Shipping status - Status string `json:"status"` + // Number of package units + ContainersCount int32 `json:"container_count"` - // Shipping date - DepartureDate string `json:"departure_date"` + // Shipping status + Status string `json:"status"` - // Shipping record creation date - CreatedAt time.Time `json:"created_at"` + // Shipping date + DepartureDate string `json:"departure_date"` - // Shipping record update date - UpdatedAt time.Time `json:"updated_at"` + // Shipping record creation date + CreatedAt time.Time `json:"created_at"` - // Acceptance certificate type for FBS sellers - ActType string `json:"act_type"` + // Shipping record update date + UpdatedAt time.Time `json:"updated_at"` - // Indication of a partial freight. true if the freigth is partial. - // - // Partial freigt means that the shipment was splitted into several parts - // and for each of them you need to generate separate acts - IsPartial bool `json:"is_partial"` + // Acceptance certificate type for FBS sellers + ActType string `json:"act_type"` - // Indication that there are shipments subject to shipping that are not in the current freight. - // true if there are such shipments - HasPostingsForNextCarriage bool `json:"has_postings_for_next_carriage"` + // Indication of a partial freight. true if the freigth is partial. + // + // Partial freigt means that the shipment was splitted into several parts + // and for each of them you need to generate separate acts + IsPartial bool `json:"is_partial"` - // Serial number of the partial freight - PartialNum int64 `json:"partial_num"` + // Indication that there are shipments subject to shipping that are not in the current freight. + // true if there are such shipments + HasPostingsForNextCarriage bool `json:"has_postings_for_next_carriage"` - // Information about shipment certificates - RelatedDocs struct { - // Information about acceptance certificate - ActOfAcceptance FBSAct `json:"act_of_acceptance"` + // Serial number of the partial freight + PartialNum int64 `json:"partial_num"` - // Information about discrepancy certificate - ActOfMismatch FBSAct `json:"act_of_mismatch"` + // Information about shipment certificates + RelatedDocs ListOfShipmentCertificatesResultDocs `json:"related_docs"` +} - // Information about surplus certificate - ActOfExcess FBSAct `json:"act_of_excess"` - } `json:"related_docs"` - } `json:"result"` +type ListOfShipmentCertificatesResultDocs struct { + // Information about acceptance certificate + ActOfAcceptance FBSAct `json:"act_of_acceptance"` + + // Information about discrepancy certificate + ActOfMismatch FBSAct `json:"act_of_mismatch"` + + // Information about surplus certificate + ActOfExcess FBSAct `json:"act_of_excess"` } type FBSAct struct { @@ -1024,16 +1074,18 @@ type ChangeStatusToResponse struct { core.CommonResponse // Method result - Result []struct { - // Error when processing the request - Error []string `json:"error"` + Result []ChangeStatusToResponseResult `json:"result"` +} - // Shipment number - PostingNumber string `json:"posting_number"` +type ChangeStatusToResponseResult struct { + // Error when processing the request + Error []string `json:"error"` - // If the request is executed without errors — true - Result bool `json:"result"` - } `json:"result"` + // Shipment number + PostingNumber string `json:"posting_number"` + + // If the request is executed without errors — true + Result bool `json:"result"` } // Changes the shipment status to "Delivering" if a third-party delivery service is being used @@ -1142,9 +1194,9 @@ type CancelShipmentResponse struct { } // Change shipment status to `cancelled`. -// +// // If you are using the rFBS scheme, you have the following cancellation reason identifiers (`cancel_reason_id`) available: -// +// // 352—product is out of stock ; // 400—only defective products left; // 401—cancellation from arbitration; @@ -1153,9 +1205,9 @@ type CancelShipmentResponse struct { // 666—delivery isn't available in the region; // 667—order was lost by the delivery service. // The last 4 reasons are available for shipments in the "Delivering" and "Courier on the way" statuses. -// +// // You can't cancel presumably delivered orders. -// +// // If `cancel_reason_id` parameter value is 402, fill the `cancel_reason_message` field. func (c FBS) CancelShipment(params *CancelShipmentParams) (*CancelShipmentResponse, error) { url := "/v2/posting/fbs/cancel" @@ -1193,10 +1245,12 @@ type CreateActResponse struct { core.CommonResponse // Method result - Result struct { - // Document generation task number - Id int64 `json:"id"` - } `json:"result"` + Result CreateActResult `json:"result"` +} + +type CreateActResult struct { + // Document generation task number + Id int64 `json:"id"` } // Launches the procedure for generating the transfer documents: acceptance and transfer certificate and the waybill. @@ -1225,20 +1279,22 @@ type GetLabelingResponse struct { core.CommonResponse // Method result - Result struct { - // Error code - Error string `json:"error"` + Result GetLabelingResult `json:"result"` +} - // Link to a labeling file - FileUrl string `json:"file_url"` +type GetLabelingResult struct { + // Error code + Error string `json:"error"` - // Status of labeling generation: - // - pending — task is in the queue. - // - in_progress — being generated. - // - completed — labeling file is ready. - // - error — error occurred during file generation - Status string `json:"status"` - } `json:"result"` + // Link to a labeling file + FileUrl string `json:"file_url"` + + // Status of labeling generation: + // - pending — task is in the queue. + // - in_progress — being generated. + // - completed — labeling file is ready. + // - error — error occurred during file generation + Status string `json:"status"` } // Method for getting labeling after using the /v1/posting/fbs/package-label/create method @@ -1301,10 +1357,12 @@ type CreateTaskForGeneratingLabelResponse struct { core.CommonResponse // Method result - Result struct { - // Task identifier for labeling generation - TaskId int64 `json:"task_id"` - } `json:"result"` + Result CreateTaskForGeneratingLabelResult `json:"result"` +} + +type CreateTaskForGeneratingLabelResult struct { + // Task identifier for labeling generation + TaskId int64 `json:"task_id"` } // Method for creating a task for asynchronous labeling generation. @@ -1335,31 +1393,33 @@ type GetDropOffPointRestrictionsResponse struct { core.CommonResponse // Method result - Result struct { - // Shipment number - PostingNumber string `json:"posting_number"` + Result GetDropOffPointRestrictionsResult `json:"result"` +} - // Maximum weight limit in grams - MaxPostingWeight float64 `json:"max_posting_weight"` +type GetDropOffPointRestrictionsResult struct { + // Shipment number + PostingNumber string `json:"posting_number"` - // Minimum weight limit in grams - MinPostingWeight float64 `json:"min_posting_weight"` + // Maximum weight limit in grams + MaxPostingWeight float64 `json:"max_posting_weight"` - // Width limit in centimeters - Width float64 `json:"width"` + // Minimum weight limit in grams + MinPostingWeight float64 `json:"min_posting_weight"` - // Length limit in centimeters - Length float64 `json:"length"` + // Width limit in centimeters + Width float64 `json:"width"` - // Height limit in centimeters - Height float64 `json:"height"` + // Length limit in centimeters + Length float64 `json:"length"` - // Maximum shipment cost limit in rubles - MaxPostingPrice float64 `json:"max_posting_price"` + // Height limit in centimeters + Height float64 `json:"height"` - // Minimum shipment cost limit in rubles - MinPostingPrice float64 `json:"min_posting_price"` - } `json:"result"` + // Maximum shipment cost limit in rubles + MaxPostingPrice float64 `json:"max_posting_price"` + + // Minimum shipment cost limit in rubles + MinPostingPrice float64 `json:"min_posting_price"` } // Method for getting dimensions, weight, and other restrictions of the drop-off point by the shipment number. @@ -1516,18 +1576,20 @@ type DateAvailableForDeliveryScheduleResponse struct { AvailableChangecount int64 `json:"available_change_count"` // Period of dates available for reschedule - DeliveryInterval struct { - // Period start date - Begin time.Time `json:"begin"` - - // Period end date - End time.Time `json:"end"` - } `json:"delivery_interval"` + DeliveryInterval DateAvailableForDeliveryScheduleDeliveryInterval `json:"delivery_interval"` // Number of delivery date reschedules left RemainingChangeCount int64 `json:"remaining_change_count"` } +type DateAvailableForDeliveryScheduleDeliveryInterval struct { + // Period start date + Begin time.Time `json:"begin"` + + // Period end date + End time.Time `json:"end"` +} + // Method for getting the dates and number of times available for delivery reschedule func (c FBS) DateAvailableForDeliverySchedule(params *DateAvailableForDeliveryScheduleParams) (*DateAvailableForDeliveryScheduleResponse, error) { url := "/v1/posting/fbs/timeslot/change-restrictions" @@ -1552,13 +1614,15 @@ type ListManufacturingCountriesResponse struct { core.CommonResponse // List of manufacturing countries and their ISO codes - Result []struct { - // Country name in Russian - Name string `json:"name"` + Result []ListManufacturingCountriesResult `json:"result"` +} - // Country ISO code - CountriISOCode string `json:"country_iso_code"` - } `json:"result"` +type ListManufacturingCountriesResult struct { + // Country name in Russian + Name string `json:"name"` + + // Country ISO code + CountriISOCode string `json:"country_iso_code"` } // Method for getting a list of available manufacturing countries and their ISO codes @@ -1635,18 +1699,20 @@ type PartialPackOrderResponse struct { core.CommonResponse // Additional data about shipments - AdditionalData []struct { - // Shipment identifier - PostingNumber string `json:"posting_number"` - - // List of products in the shipment - Products []PostingProduct `json:"products"` - } `json:"additional_data"` + AdditionalData []PartialPackOrderAdditionalData `json:"additional_data"` // Identifiers of shipments that were created after package Result []string `json:"result"` } +type PartialPackOrderAdditionalData struct { + // Shipment identifier + PostingNumber string `json:"posting_number"` + + // List of products in the shipment + Products []PostingProduct `json:"products"` +} + // If you pass to the request a part of the products from the shipment, the primary shipment will split into two parts. // The primary unassembled shipment will contain some of the products that were not passed to the request. // @@ -1677,66 +1743,70 @@ type AvailableFreightsListResponse struct { core.CommonResponse // Method result - Result []struct { - // Freight identifier (document generation task number) - CarriageId int64 `json:"carriage_id"` + Result []AvailableFreightsListResult `json:"result"` +} - // Number of shipments in the freight - CarriagePostingsCount int32 `json:"carriage_postings_count"` +type AvailableFreightsListResult struct { + // Freight identifier (document generation task number) + CarriageId int64 `json:"carriage_id"` - // Freight status for requested delivery method and shipping date - CarriageStatus string `json:"carriage_status"` + // Number of shipments in the freight + CarriagePostingsCount int32 `json:"carriage_postings_count"` - // Date and time before a shipment must be packaged - CutoffAt time.Time `json:"cutoff_at"` + // Freight status for requested delivery method and shipping date + CarriageStatus string `json:"carriage_status"` - // Delivery method identifier - DeliveryMethodId int64 `json:"delivery_method_id"` + // Date and time before a shipment must be packaged + CutoffAt time.Time `json:"cutoff_at"` - // Delivery method name - DeliveryMethodName string `json:"delivery_method_name"` + // Delivery method identifier + DeliveryMethodId int64 `json:"delivery_method_id"` - // Errors list - Errors []struct { - // Error code - Code string `json:"code"` + // Delivery method name + DeliveryMethodName string `json:"delivery_method_name"` - // Error type: - // - warning - // - critical - Status string `json:"status"` - } `json:"errors"` + // Errors list + Errors []AvailableFreightsListResultError `json:"errors"` - // First mile type - FirstMileType string `json:"first_mile_type"` + // First mile type + FirstMileType string `json:"first_mile_type"` - // Trusted acceptance attribute. true if trusted acceptance is enabled in the warehouse - HasEntrustedAcceptance bool `json:"has_entrusted_acceptance"` + // Trusted acceptance attribute. true if trusted acceptance is enabled in the warehouse + HasEntrustedAcceptance bool `json:"has_entrusted_acceptance"` - // Number of shipments to be packaged - MandatoryPostingsCount int32 `json:"mandatory_postings_count"` + // Number of shipments to be packaged + MandatoryPostingsCount int32 `json:"mandatory_postings_count"` - // Number of already packaged shipments - MandatoryPackagedCount int32 `json:"mandatory_packaged_count"` + // Number of already packaged shipments + MandatoryPackagedCount int32 `json:"mandatory_packaged_count"` - // Delivery service icon link - TPLProviderIconURL string `json:"tpl_provider_icon_url"` + // Delivery service icon link + TPLProviderIconURL string `json:"tpl_provider_icon_url"` - // Delivery service name - TPLProviderName string `json:"tpl_provider_name"` + // Delivery service name + TPLProviderName string `json:"tpl_provider_name"` - // Warehouse city - WarehouseCity string `json:"warehouse_city"` + // Warehouse city + WarehouseCity string `json:"warehouse_city"` - // Warehouse identifier - WarehouseId int64 `json:"warehouse_id"` + // Warehouse identifier + WarehouseId int64 `json:"warehouse_id"` - // Warehouse name - WarehouseName string `json:"warehouse_name"` + // Warehouse name + WarehouseName string `json:"warehouse_name"` - // Warehouse timezone - WarehouseTimezone string `json:"warehouse_timezone"` - } `json:"result"` + // Warehouse timezone + WarehouseTimezone string `json:"warehouse_timezone"` +} + +type AvailableFreightsListResultError struct { + // Error code + Code string `json:"code"` + + // Error type: + // - warning + // - critical + Status string `json:"status"` } // Method for getting freights that require printing acceptance and transfer certificates and a waybill @@ -1899,22 +1969,26 @@ type ShipmentCancellationReasonsResponse struct { core.CommonResponse // Request result - Result []struct { - // Shipment number - PostingNumber string `json:"posting_number"` + Result []ShipmentCancellationReasonsResult `json:"result"` +} - // Information about cancellation reasons - Reasons []struct { - // Cancellation reasons - Id int64 `json:"id"` +type ShipmentCancellationReasonsResult struct { + // Shipment number + PostingNumber string `json:"posting_number"` - // Reason description - Title string `json:"title"` + // Information about cancellation reasons + Reasons []ShipmentCancellationReasonsResultReason `json:"reasons"` +} - // Shipment cancellation initiator - TypeId string `json:"type_id"` - } `json:"reasons"` - } `json:"result"` +type ShipmentCancellationReasonsResultReason struct { + // Cancellation reasons + Id int64 `json:"id"` + + // Reason description + Title string `json:"title"` + + // Shipment cancellation initiator + TypeId string `json:"type_id"` } // Returns a list of cancellation reasons for particular shipments @@ -1936,21 +2010,23 @@ type ShipmentsCancellationReasonsResponse struct { core.CommonResponse // Method result - Result []struct { - // Cancellation reason - Id int64 `json:"id"` + Result []ShipmentsCancellatinoReasonsResult `json:"result"` +} - // Shipment cancellation result. true if the request is available for cancellation - IsAvailableForCancellation bool `json:"is_available_for_cancellation"` +type ShipmentsCancellatinoReasonsResult struct { + // Cancellation reason + Id int64 `json:"id"` - // Category name - Title string `json:"title"` + // Shipment cancellation result. true if the request is available for cancellation + IsAvailableForCancellation bool `json:"is_available_for_cancellation"` - // Shipment cancellation initiator: - // - buyer - // - seller - TypeId string `json:"type_id"` - } `json:"result"` + // Category name + Title string `json:"title"` + + // Shipment cancellation initiator: + // - buyer + // - seller + TypeId string `json:"type_id"` } // Returns a list of cancellation reasons for particular shipments @@ -2036,9 +2112,9 @@ type CancelSendingResponse struct { } // Use this method if you cannot send some of the products from the shipment. -// +// // If you are using the rFBS scheme, you have the following cancellation reason identifiers (`cancel_reason_id`) available: -// +// // 352—product is out of stock; // 400—only defective products left; // 401—cancellation from arbitration; @@ -2047,9 +2123,9 @@ type CancelSendingResponse struct { // 666—delivery is not available in the region; // 667—order was lost by the delivery service. // The last 4 reasons are available for shipments in the "Delivering" and "Courier on the way" statuses. -// +// // You can't cancel presumably delivered orders. -// +// // If `cancel_reason_id` parameter value is 402, fill the `cancel_reason_message` field. func (c FBS) CancelSending(params *CancelSendingParams) (*CancelSendingResponse, error) { url := "/v2/posting/fbs/product/cancel" @@ -2074,46 +2150,50 @@ type ListShipmentInCertificateResponse struct { core.CommonResponse // Information about shipments - Result []struct { - // Certificate identifier - Id int64 `json:"id"` + Result []ListShipmentInCertificateResult `json:"result"` +} - // Number of boxes in which the product is packed - MultiBoxQuantity int32 `json:"multi_box_qty"` +type ListShipmentInCertificateResult struct { + // Certificate identifier + Id int64 `json:"id"` - // Shipment number - PostingNumber string `json:"posting_number"` + // Number of boxes in which the product is packed + MultiBoxQuantity int32 `json:"multi_box_qty"` - // Shipment status - Status string `json:"status"` + // Shipment number + PostingNumber string `json:"posting_number"` - // Error code explanation - SellerError string `json:"seller_error"` + // Shipment status + Status string `json:"status"` - // Shipment record update date and time - UpdatedAt time.Time `json:"update_at"` + // Error code explanation + SellerError string `json:"seller_error"` - // Shipment record creation date and time - CreatedAt time.Time `json:"created_at"` + // Shipment record update date and time + UpdatedAt time.Time `json:"update_at"` - // List of products in the shipment - Products []struct { - // Product name - Name string `json:"name"` + // Shipment record creation date and time + CreatedAt time.Time `json:"created_at"` - // Product identifier in the seller's system - OfferId string `json:"offer_id"` + // List of products in the shipment + Products []ListShipmentInCertificateResultProduct `json:"products"` +} - // Product price - Price string `json:"price"` +type ListShipmentInCertificateResultProduct struct { + // Product name + Name string `json:"name"` - // Product number in the shipment - Quantity int32 `json:"quantity"` + // Product identifier in the seller's system + OfferId string `json:"offer_id"` - // Product identifier in the Ozon system, SKU - SKU int64 `json:"sku"` - } `json:"products"` - } `json:"result"` + // Product price + Price string `json:"price"` + + // Product number in the shipment + Quantity int32 `json:"quantity"` + + // Product identifier in the Ozon system, SKU + SKU int64 `json:"sku"` } // Returns a list of shipments in the certificate by certificate identifier @@ -2143,12 +2223,14 @@ type SpecifyNumberOfBoxesResponse struct { core.CommonResponse // Result of transferring the boxes number - Result struct { - // Possible values: - // - true — the number is successfully passed. - // - false — an error occurred while passing the number. Please try again - Result bool `json:"result"` - } `json:"result"` + Result SpecifyNumberOfBoxesResult `json:"result"` +} + +type SpecifyNumberOfBoxesResult struct { + // Possible values: + // - true — the number is successfully passed. + // - false — an error occurred while passing the number. Please try again + Result bool `json:"result"` } // Method for passing the number of boxes for multi-box shipments when working under the rFBS Aggregator scheme (using the Ozon partner delivery) @@ -2175,46 +2257,48 @@ type StatusOfActResponse struct { core.CommonResponse // Method result - Result struct { - // Acceptance and transfer certificate and a waybill type. - // - // If the value is ozon_digital, - // use the `/v2/posting/fbs/digital/act/check-status` and `/v2/posting/fbs/digital/act/get-pdf` methods for getting digital acceptance - // and transfer certificate and waybill - ActType string `json:"act_type"` + Result StatusOfActResponseResult `json:"result"` +} - // List with numbers of shipments that are included in the acceptance and transfer certificate. - // You should hand these shipments over today - AddedToAct []string `json:"added_to_act"` +type StatusOfActResponseResult struct { + // Acceptance and transfer certificate and a waybill type. + // + // If the value is ozon_digital, + // use the `/v2/posting/fbs/digital/act/check-status` and `/v2/posting/fbs/digital/act/get-pdf` methods for getting digital acceptance + // and transfer certificate and waybill + ActType string `json:"act_type"` - // List with numbers of shipments that are not included in the acceptance and transfer certificate. - // You should hand these shipments over in the next shipping - RemovedFromAct []string `json:"removed_from_act"` + // List with numbers of shipments that are included in the acceptance and transfer certificate. + // You should hand these shipments over today + AddedToAct []string `json:"added_to_act"` - // Request status: - // - // - in_process — documents generation in process, please wait. - // - ready — documents are ready for downloading. - // - error — error occured during document geneartion process. Send a request again. - // - cancelled — documents generation was canceled. Send a request again. - // - The next postings are not ready — error occured, shipmants are not included in the shipping. Wait and check request results again. If you see the error again, contact our support team - Status string `json:"status"` + // List with numbers of shipments that are not included in the acceptance and transfer certificate. + // You should hand these shipments over in the next shipping + RemovedFromAct []string `json:"removed_from_act"` - // Indication of a partial freight. true if the freigth is partial. - // - // Partial freigt means that the shipment was splitted into several parts and - // for each of them you need to generate separate acceptance and transfer certificates - IsPartial bool `json:"is_partial"` + // Request status: + // + // - in_process — documents generation in process, please wait. + // - ready — documents are ready for downloading. + // - error — error occured during document geneartion process. Send a request again. + // - cancelled — documents generation was canceled. Send a request again. + // - The next postings are not ready — error occured, shipmants are not included in the shipping. Wait and check request results again. If you see the error again, contact our support team + Status string `json:"status"` - // Indication that there are shipments subject to shipping that are not in the current freight. true if there are such shipments. - // - // If there are such shipments, create a new acceptance and transfer certificate - // using the `/v2/posting/fbs/act/create` method and check the creation status. Create acts until this field returns false - HasPostingsForNextCarriage bool `json:"has_postings_for_next_carriage"` + // Indication of a partial freight. true if the freigth is partial. + // + // Partial freigt means that the shipment was splitted into several parts and + // for each of them you need to generate separate acceptance and transfer certificates + IsPartial bool `json:"is_partial"` - // Serial number of the partial freight - PartialSum int64 `json:"partial_sum"` - } `json:"result"` + // Indication that there are shipments subject to shipping that are not in the current freight. true if there are such shipments. + // + // If there are such shipments, create a new acceptance and transfer certificate + // using the `/v2/posting/fbs/act/create` method and check the creation status. Create acts until this field returns false + HasPostingsForNextCarriage bool `json:"has_postings_for_next_carriage"` + + // Serial number of the partial freight + PartialSum int64 `json:"partial_sum"` } // If you are not connected to electronic document circulation (EDC), @@ -2252,24 +2336,28 @@ type ETGBCustomsDeclarationsResponse struct { core.CommonResponse // Request result - Result []struct { - // Shipment number - PostingNumber string `json:"posting_number"` + Result []ETGBCustomDeclarationsResult `json:"result"` +} - // Declaration information - ETGB struct { - // Number - Number string `json:"number"` +type ETGBCustomDeclarationsResult struct { + // Shipment number + PostingNumber string `json:"posting_number"` - // Creation date - Date string `json:"date"` + // Declaration information + ETGB ETGBCustomDeclarationsResultETGB `json:"etgb"` +} - // Link to file. - // - // If the field is empty and you need the file, contact Ozon support - URL string `json:"url"` - } `json:"etgb"` - } `json:"result"` +type ETGBCustomDeclarationsResultETGB struct { + // Number + Number string `json:"number"` + + // Creation date + Date string `json:"date"` + + // Link to file. + // + // If the field is empty and you need the file, contact Ozon support + URL string `json:"url"` } // Method for getting Elektronik Ticaret Gümrük Beyannamesi (ETGB) customs declarations for sellers from Turkey diff --git a/ozon/finance.go b/ozon/finance.go index 30c85e3..69edfcd 100644 --- a/ozon/finance.go +++ b/ozon/finance.go @@ -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" diff --git a/ozon/invoices.go b/ozon/invoices.go index 5caa3a8..d1e7e56 100644 --- a/ozon/invoices.go +++ b/ozon/invoices.go @@ -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 diff --git a/ozon/products.go b/ozon/products.go index 2817f50..cce4dcd 100644 --- a/ozon/products.go +++ b/ozon/products.go @@ -39,36 +39,42 @@ type GetStocksInfoResponse struct { core.CommonResponse // Method Result - Result struct { - // Identifier of the last value on the page - // - // To get the next values, specify the recieved value in the next request in the last_id parameter - LastId string `json:"last_id,omitempty"` + Result GetStocksInfoResult `json:"result,omitempty"` +} - // The number of unique products for which information about stocks is displayed - Total int32 `json:"total,omitempty"` +type GetStocksInfoResult struct { + // Identifier of the last value on the page + // + // To get the next values, specify the recieved value in the next request in the last_id parameter + LastId string `json:"last_id,omitempty"` - // Product details - Items []struct { - // Product identifier in the seller's system - OfferId string `json:"offer_id,omitempty"` + // The number of unique products for which information about stocks is displayed + Total int32 `json:"total,omitempty"` - // Product identifier - ProductId int64 `json:"product_id,omitempty"` + // Product details + Items []GetStocksInfoResultItem `json:"items,omitempty"` +} - // Stock details - Stocks []struct { - // In a warehouse - Present int32 `json:"present,omitempty"` +type GetStocksInfoResultItem struct { + // Product identifier in the seller's system + OfferId string `json:"offer_id,omitempty"` - // Reserved - Reserved int32 `json:"reserved,omitempty"` + // Product identifier + ProductId int64 `json:"product_id,omitempty"` - // Warehouse type - Type string `json:"type,omitempty" default:"ALL"` - } `json:"stocks,omitempty"` - } `json:"items,omitempty"` - } `json:"result,omitempty"` + // Stock details + Stocks []GetStocksInfoResultItemStock `json:"stocks,omitempty"` +} + +type GetStocksInfoResultItemStock struct { + // In a warehouse + Present int32 `json:"present,omitempty"` + + // Reserved + Reserved int32 `json:"reserved,omitempty"` + + // Warehouse type + Type string `json:"type,omitempty" default:"ALL"` } // Returns information about the quantity of products in stock: @@ -127,25 +133,7 @@ type ProductDetails struct { ColorImage string `json:"color_image"` // Commission fees details - Commissions []struct { - // Delivery cost - DeliveryAmount float64 `json:"deliveryAmount"` - - // Minimum commission fee - MinValue float64 `json:"minValue"` - - // Commission percentage - Percent float64 `json:"percent"` - - // Return cost - ReturnAmount float64 `json:"returnAmount"` - - // Sale scheme - SaleSchema string `json:"saleSchema"` - - // Commission fee amount - Value float64 `json:"value"` - } `json:"commissions"` + Commissions []ProductDetailCommission `json:"commissions"` // Date and time when the product was created CreatedAt time.Time `json:"created_at"` @@ -224,46 +212,7 @@ type ProductDetails struct { Price string `json:"price"` // Product price indexes - PriceIndexes struct { - // Competitors' product price on other marketplaces - ExternalIndexData struct { - // Minimum competitors' product price on other marketplaces - MinimalPrice string `json:"minimal_price"` - - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` - - // Price index value - PriceIndexValue float64 `json:"price_index_value"` - } `json:"external_index_data"` - - // Competitors' product price on Ozon - OzonIndexData struct { - // Minimum competitors' product price on Ozon - MinimalPrice string `json:"minimal_price"` - - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` - - // Price index value - PriceIndexValue float64 `json:"price_index_value"` - } `json:"ozon_index_data"` - - // Resulting price index of the product - PriceIndex string `json:"price_index"` - - // Price of your product on other marketplaces - SelfMarketplaceIndexData struct { - // Minimum price of your product on other marketplaces - MinimalPrice string `json:"minimal_price"` - - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` - - // Price index value - PriceIndexValue float64 `json:"price_index_value"` - } `json:"self_marketplace_index_data"` - } `json:"prices_indexes"` + PriceIndexes ProductDetailPriceIndex `json:"prices_indexes"` // Deprecated: Price index. Learn more in Help Center // @@ -274,67 +223,13 @@ type ProductDetails struct { RecommendedPrice string `json:"recommended_price"` // Product state description - Status struct { - // Product state - State string `json:"state"` - - // Product state on the transition to which an error occurred - StateFailed string `json:"state_failed"` - - // Moderation status - ModerateStatus string `json:"moderate_status"` - - // Product decline reasons - DeclineReasons []string `json:"decline_reasons"` - - // Validation status - ValidationsState string `json:"validation_state"` - - // Product status name - StateName string `json:"state_name"` - - // Product state description - StateDescription string `json:"state_description"` - - // Indiction that there were errors while creating products - IsFailed bool `json:"is_failed"` - - // Indiction that the product was created - IsCreated bool `json:"is_created"` - - // Tooltips for the current product state - StateTooltip string `json:"state_tooltip"` - - // Product loading errors - ItemErrors []GetProductDetailsResponseItemError `json:"item_errors"` - - // The last time product state changed - StateUpdatedAt time.Time `json:"state_updated_at"` - } `json:"status"` + Status ProductDetailStatus `json:"status"` // Details about the sources of similar offers. Learn more in Help Сenter - Sources []struct { - // Indication that the source is taken into account when calculating the market value - IsEnabled bool `json:"is_enabled"` - - // Product identifier in the Ozon system, SKU - SKU int64 `json:"sku"` - - // Link to the source - Source string `json:"source"` - } `json:"sources"` + Sources []ProductDetailSource `json:"sources"` // Details about product stocks - Stocks struct { - // Supply expected - Coming int32 `json:"coming"` - - // Currently at the warehouse - Present int32 `json:"present"` - - // Reserved - Reserved int32 `json:"reserved"` - } `json:"stocks"` + Stocks ProductDetailStock `json:"stocks"` // Date of the last product update UpdatedAt time.Time `json:"updated_at"` @@ -343,16 +238,7 @@ type ProductDetails struct { VAT string `json:"vat"` // Product visibility settings - VisibilityDetails struct { - // If the product is active, the value is true - ActiveProduct bool `json:"active_product"` - - // If the price is set, the value is true - HasPrice bool `json:"has_price"` - - // If there is stock at the warehouses, the value is true - HasStock bool `json:"has_stock"` - } `json:"visibility_details"` + VisibilityDetails ProductDetailVisibilityDetails `json:"visibility_details"` // If the product is on sale, the value is true Visible bool `json:"visible"` @@ -361,6 +247,144 @@ type ProductDetails struct { VolumeWeight float64 `json:"volume_weights"` } +type ProductDetailCommission struct { + // Delivery cost + DeliveryAmount float64 `json:"deliveryAmount"` + + // Minimum commission fee + MinValue float64 `json:"minValue"` + + // Commission percentage + Percent float64 `json:"percent"` + + // Return cost + ReturnAmount float64 `json:"returnAmount"` + + // Sale scheme + SaleSchema string `json:"saleSchema"` + + // Commission fee amount + Value float64 `json:"value"` +} + +type ProductDetailPriceIndex struct { + // Competitors' product price on other marketplaces + ExternalIndexData ProductDetailPriceIndexExternal `json:"external_index_data"` + + // Competitors' product price on Ozon + OzonIndexData ProductDetailPriceIndexOzon `json:"ozon_index_data"` + + // Resulting price index of the product + PriceIndex string `json:"price_index"` + + // Price of your product on other marketplaces + SelfMarketplaceIndexData ProductDetailPriceIndexSelfMarketplace `json:"self_marketplace_index_data"` +} + +type ProductDetailPriceIndexExternal struct { + // Minimum competitors' product price on other marketplaces + MinimalPrice string `json:"minimal_price"` + + // Price currency + MinimalPriceCurrency string `json:"minimal_price_currency"` + + // Price index value + PriceIndexValue float64 `json:"price_index_value"` +} + +type ProductDetailPriceIndexOzon struct { + // Minimum competitors' product price on Ozon + MinimalPrice string `json:"minimal_price"` + + // Price currency + MinimalPriceCurrency string `json:"minimal_price_currency"` + + // Price index value + PriceIndexValue float64 `json:"price_index_value"` +} + +type ProductDetailPriceIndexSelfMarketplace struct { + // Minimum price of your product on other marketplaces + MinimalPrice string `json:"minimal_price"` + + // Price currency + MinimalPriceCurrency string `json:"minimal_price_currency"` + + // Price index value + PriceIndexValue float64 `json:"price_index_value"` +} + +type ProductDetailStatus struct { + // Product state + State string `json:"state"` + + // Product state on the transition to which an error occurred + StateFailed string `json:"state_failed"` + + // Moderation status + ModerateStatus string `json:"moderate_status"` + + // Product decline reasons + DeclineReasons []string `json:"decline_reasons"` + + // Validation status + ValidationsState string `json:"validation_state"` + + // Product status name + StateName string `json:"state_name"` + + // Product state description + StateDescription string `json:"state_description"` + + // Indiction that there were errors while creating products + IsFailed bool `json:"is_failed"` + + // Indiction that the product was created + IsCreated bool `json:"is_created"` + + // Tooltips for the current product state + StateTooltip string `json:"state_tooltip"` + + // Product loading errors + ItemErrors []GetProductDetailsResponseItemError `json:"item_errors"` + + // The last time product state changed + StateUpdatedAt time.Time `json:"state_updated_at"` +} + +type ProductDetailSource struct { + // Indication that the source is taken into account when calculating the market value + IsEnabled bool `json:"is_enabled"` + + // Product identifier in the Ozon system, SKU + SKU int64 `json:"sku"` + + // Link to the source + Source string `json:"source"` +} + +type ProductDetailStock struct { + // Supply expected + Coming int32 `json:"coming"` + + // Currently at the warehouse + Present int32 `json:"present"` + + // Reserved + Reserved int32 `json:"reserved"` +} + +type ProductDetailVisibilityDetails struct { + // If the product is active, the value is true + ActiveProduct bool `json:"active_product"` + + // If the price is set, the value is true + HasPrice bool `json:"has_price"` + + // If there is stock at the warehouses, the value is true + HasStock bool `json:"has_stock"` +} + type ProductDiscountedStocks struct { // Quantity of products to be supplied Coming int32 `json:"coming"` @@ -433,25 +457,29 @@ type UpdateStocksResponse struct { core.CommonResponse // Request results - Result []struct { - // An array of errors that occurred while processing the request - Errors []struct { - // Error code - Code string `json:"code"` + Result []UpdateStocksResult `json:"result"` +} - // Error reason - Message string `json:"message"` - } `json:"errors"` +type UpdateStocksResult struct { + // An array of errors that occurred while processing the request + Errors []UpdateStocksResultError `json:"errors"` - // Product identifier in the seller's system - OfferId string `json:"offer_id"` + // Product identifier in the seller's system + OfferId string `json:"offer_id"` - // Product identifier - ProductId int64 `json:"product_id"` + // Product identifier + ProductId int64 `json:"product_id"` - // If the product details have been successfully updated — true - Updated bool `json:"updated"` - } + // If the product details have been successfully updated — true + Updated bool `json:"updated"` +} + +type UpdateStocksResultError struct { + // Error code + Code string `json:"code"` + + // Error reason + Message string `json:"message"` } // Allows you to change the products in stock quantity. The method is only used for FBS and rFBS warehouses. @@ -496,28 +524,32 @@ type UpdateQuantityStockProductsResponse struct { core.CommonResponse // Method result - Result []struct { - // An array of errors that occurred while processing the request - Errors []struct { - // Error code - Code string `json:"code"` + Result []UpdateQuantityStockProductsResult `json:"result"` +} - // Error reason - Message string `json:"message"` - } `json:"errors"` +type UpdateQuantityStockProductsResult struct { + // An array of errors that occurred while processing the request + Errors []UpdateQuantityStockProductsResultError `json:"errors"` - // Product identifier in the seller's system - Offerid string `json:"offer_id"` + // Product identifier in the seller's system + Offerid string `json:"offer_id"` - // Product identifier - ProductId int64 `json:"product_id"` + // Product identifier + ProductId int64 `json:"product_id"` - // If the request was completed successfully and the stocks are updated — true - Updated bool `json:"updated"` + // If the request was completed successfully and the stocks are updated — true + Updated bool `json:"updated"` - // Warehouse identifier derived from the /v1/warehouse/list method - WarehouseId int64 `json:"warehouse_id"` - } `json:"result"` + // Warehouse identifier derived from the /v1/warehouse/list method + WarehouseId int64 `json:"warehouse_id"` +} + +type UpdateQuantityStockProductsResultError struct { + // Error code + Code string `json:"code"` + + // Error reason + Message string `json:"message"` } // Allows you to change the products in stock quantity. @@ -556,25 +588,27 @@ type StocksInSellersWarehouseResponse struct { core.CommonResponse // Method result - Result []struct { - // SKU of the product that is sold from the seller's warehouse (FBS and RFBS schemes) - FBSSKU int64 `json:"fbs_sku"` + Result []StocksInSellersWarehouseResult `json:"result"` +} - // Total number of items in the warehouse - Present int64 `json:"present"` +type StocksInSellersWarehouseResult struct { + // SKU of the product that is sold from the seller's warehouse (FBS and RFBS schemes) + FBSSKU int64 `json:"fbs_sku"` - // The product identifier in the seller's system - ProductId int64 `json:"product_id"` + // Total number of items in the warehouse + Present int64 `json:"present"` - // The number of reserved products in the warehouse - Reserved int64 `json:"reserved"` + // The product identifier in the seller's system + ProductId int64 `json:"product_id"` - // Warehouse identifier - WarehouseId int64 `json:"warehouse_id"` + // The number of reserved products in the warehouse + Reserved int64 `json:"reserved"` - // Warehouse name - WarehouseName string `json:"warehouse_name"` - } + // Warehouse identifier + WarehouseId int64 `json:"warehouse_id"` + + // Warehouse name + WarehouseName string `json:"warehouse_name"` } // Get stocks in seller's warehouse @@ -628,22 +662,26 @@ type UpdatePricesPrice struct { type UpdatePricesResponse struct { core.CommonResponse - Result []struct { - // An array of errors that occurred while processing the request - Errors []struct { - Code string `json:"code"` - Message string `json:"message"` - } `json:"errors"` + Result []UpdatePricesResult `json:"result"` +} - // Product identifier in the seller's system - OfferId string `json:"offer_id"` +type UpdatePricesResult struct { + // An array of errors that occurred while processing the request + Errors []UpdatePricesResultError `json:"errors"` - // Product ID - ProductId int64 `json:"product_id"` + // Product identifier in the seller's system + OfferId string `json:"offer_id"` - // If the product details have been successfully updated — true - Updated bool `json:"updated"` - } `json:"result"` + // Product ID + ProductId int64 `json:"product_id"` + + // If the product details have been successfully updated — true + Updated bool `json:"updated"` +} + +type UpdatePricesResultError struct { + Code string `json:"code"` + Message string `json:"message"` } // Allows you to change a price of one or more products. @@ -817,10 +855,12 @@ type CreateOrUpdateProductResponse struct { core.CommonResponse // Method result - Result struct { - // Number of task for products upload - TaskId int64 `json:"task_id"` - } `json:"result"` + Result CreateOrUpdateProductResult `json:"result"` +} + +type CreateOrUpdateProductResult struct { + // Number of task for products upload + TaskId int64 `json:"task_id"` } // This method allows you to create products and update their details @@ -866,24 +906,28 @@ type GetListOfProductsResponse struct { core.CommonResponse // Result - Result struct { - // Products list - Items []struct { - // Product identifier in the seller's system - OfferId string `json:"offer_id"` + Result GetListOfProductsResult `json:"result"` +} - // Product ID - ProductId int64 `json:"product_id"` - } `json:"items"` +type GetListOfProductsResult struct { + // Products list + Items []GetListOfProductsResultItem `json:"items"` - // Identifier of the last value on the page. - // - // To get the next values, specify the recieved value in the next request in the last_id parameter - LastId string `json:"last_id"` + // Identifier of the last value on the page. + // + // To get the next values, specify the recieved value in the next request in the last_id parameter + LastId string `json:"last_id"` - // Total number of products - Total int32 `json:"total"` - } `json:"result"` + // Total number of products + Total int32 `json:"total"` +} + +type GetListOfProductsResultItem struct { + // Product identifier in the seller's system + OfferId string `json:"offer_id"` + + // Product ID + ProductId int64 `json:"product_id"` } func (c Products) GetListOfProducts(params *GetListOfProductsParams) (*GetListOfProductsResponse, error) { @@ -909,55 +953,63 @@ type GetProductsRatingBySKUResponse struct { core.CommonResponse // Products' content rating - Products []struct { - // Product identifier in the Ozon system, SKU - SKU int64 `json:"sku"` + Products []GetProductsRatingbySKUProduct `json:"products"` +} - // Product content rating: 0 to 100 - Rating float64 `json:"rating"` +type GetProductsRatingbySKUProduct struct { + // Product identifier in the Ozon system, SKU + SKU int64 `json:"sku"` - // Groups of characteristics that make up the content rating - Groups []struct { - // List of conditions that increase the product content rating - Conditions []struct { - // Number of content rating points that the condition gives - Cost float64 `json:"cost"` + // Product content rating: 0 to 100 + Rating float64 `json:"rating"` - // Condition description - Description string `json:"description"` + // Groups of characteristics that make up the content rating + Groups []GetProductsRatingBySKUProductGroup `json:"groups"` +} - // Indication that the condition is met - Fulfilled bool `json:"fulfilled"` +type GetProductsRatingBySKUProductGroup struct { + // List of conditions that increase the product content rating + Conditions []GetProductsRatingBySKUProductGroupCondition `json:"conditions"` - // Condition identifier - Key string `json:"key"` - } `json:"conditions"` + // Number of attributes you need to fill in to get the maximum score in this characteristics group + ImproveAtLeast int32 `json:"improve_at_least"` - // Number of attributes you need to fill in to get the maximum score in this characteristics group - ImproveAtLeast int32 `json:"improve_at_least"` + // List of attributes that can increase the product content rating + ImproveAttributes []GetProductsRatingBySKUProductGroupImproveAttr `json:"improve_attributes"` - // List of attributes that can increase the product content rating - ImproveAttributes []struct { - // Attribute identifier - Id int64 `json:"id"` + // Group identifier + Key string `json:"key"` - // Attribute name - Name string `json:"name"` - } `json:"improve_attributes"` + // Group name + Name string `json:"name"` - // Group identifier - Key string `json:"key"` + // Rating in the group + Rating float64 `json:"rating"` - // Group name - Name string `json:"name"` + // Percentage influence of group characteristics on the content rating + Weight float64 `json:"weight"` +} - // Rating in the group - Rating float64 `json:"rating"` +type GetProductsRatingBySKUProductGroupCondition struct { + // Number of content rating points that the condition gives + Cost float64 `json:"cost"` - // Percentage influence of group characteristics on the content rating - Weight float64 `json:"weight"` - } `json:"groups"` - } `json:"products"` + // Condition description + Description string `json:"description"` + + // Indication that the condition is met + Fulfilled bool `json:"fulfilled"` + + // Condition identifier + Key string `json:"key"` +} + +type GetProductsRatingBySKUProductGroupImproveAttr struct { + // Attribute identifier + Id int64 `json:"id"` + + // Attribute name + Name string `json:"name"` } // Method for getting products' content rating and recommendations on how to increase it @@ -984,35 +1036,41 @@ type GetProductImportStatusResponse struct { core.CommonResponse // Method result - Result struct { - // Product details - Items []struct { - // Product identifier in the seller's system. - // - // The maximum length of a string is 50 characters - OfferId string `json:"offer_id"` + Result GetProductImportStatusResult `json:"result"` +} - // Product identifier - ProductId int64 `json:"product_id"` +type GetProductImportStatusResult struct { + // Product details + Items []GetProductImportStatusResultItem `json:"items"` - // Product creation status. Product information is processed in queues. Possible parameter values: - // - pending — product in the processing queue; - // - imported — product loaded successfully; - // - failed — product loaded with errors - Status string `json:"status"` + // Product identifier in the seller's system + Total int32 `json:"total"` +} - // Array of errors - Errors []struct { - GetProductDetailsResponseItemError +type GetProductImportStatusResultItem struct { + // Product identifier in the seller's system. + // + // The maximum length of a string is 50 characters + OfferId string `json:"offer_id"` - // Error technical description - Message string `json:"message"` - } `json:"errors"` - } `json:"items"` + // Product identifier + ProductId int64 `json:"product_id"` - // Product identifier in the seller's system - Total int32 `json:"total"` - } `json:"result"` + // Product creation status. Product information is processed in queues. Possible parameter values: + // - pending — product in the processing queue; + // - imported — product loaded successfully; + // - failed — product loaded with errors + Status string `json:"status"` + + // Array of errors + Errors []GetProductImportStatusResultItemError `json:"errors"` +} + +type GetProductImportStatusResultItemError struct { + GetProductDetailsResponseItemError + + // Error technical description + Message string `json:"message"` } // Allows you to get the status of a product description page creation process @@ -1119,35 +1177,39 @@ type ProductInfoResponse struct { core.CommonResponse // Method result - Result struct { - // Pictures - Pictures []struct { - // Attribute of a 360 image - Is360 bool `json:"is_360"` + Result ProductInfoResult `json:"result"` +} - // Attribute of a marketing color - IsColor bool `json:"is_color"` +type ProductInfoResult struct { + // Pictures + Pictures []ProductInfoResultPicture `json:"pictures"` +} - // Attribute of a marketing color - IsPrimary bool `json:"is_primary"` +type ProductInfoResultPicture struct { + // Attribute of a 360 image + Is360 bool `json:"is_360"` - // Product identifier - ProductId int64 `json:"product_id"` + // Attribute of a marketing color + IsColor bool `json:"is_color"` - // Image uploading status. - // - // If the `/v1/product/pictures/import` method was called, the response will always be imported—image not processed. - // To see the final status, call the `/v1/product/pictures/info` method after about 10 seconds. - // - // If you called the `/v1/product/pictures/info` method, one of the statuses will appear: - // - uploaded — image uploaded; - // - failed — image was not uploaded - State string `json:"state"` + // Attribute of a marketing color + IsPrimary bool `json:"is_primary"` - // The link to the image in the public cloud storage. The image format is JPG or PNG - URL string `json:"url"` - } `json:"pictures"` - } `json:"result"` + // Product identifier + ProductId int64 `json:"product_id"` + + // Image uploading status. + // + // If the `/v1/product/pictures/import` method was called, the response will always be imported—image not processed. + // To see the final status, call the `/v1/product/pictures/info` method after about 10 seconds. + // + // If you called the `/v1/product/pictures/info` method, one of the statuses will appear: + // - uploaded — image uploaded; + // - failed — image was not uploaded + State string `json:"state"` + + // The link to the image in the public cloud storage. The image format is JPG or PNG + URL string `json:"url"` } // The method for uploading and updating product images. @@ -1218,10 +1280,12 @@ type ListProductsByIDsResponse struct { core.CommonResponse // Request results - Result struct { - // Data array - Items []ProductDetails `json:"items"` - } `json:"result"` + Result ListProductsByIDsResult `json:"result"` +} + +type ListProductsByIDsResult struct { + // Data array + Items []ProductDetails `json:"items"` } // Method for getting an array of products by their identifiers. @@ -1277,117 +1341,7 @@ type GetDescriptionOfProductResponse struct { core.CommonResponse // Request results - Result []struct { - // Array of product characteristics - Attributes []struct { - // Characteristic identifier - AttributeId int64 `json:"attribute_id"` - - // Identifier of the characteristic that supports nested properties. - // For example, the "Processor" characteristic has nested characteristics "Manufacturer" and "L2 Cache". - // Each of the nested characteristics can have multiple value variants - ComplexId int64 `json:"complex_id"` - - // Array of characteristic values - Values []struct { - // Characteristic identifier in the dictionary - DictionaryValueId int64 `json:"dictionary_value_id"` - - // Product characteristic value - Value string `json:"value"` - } `json:"values"` - } `json:"attributes"` - - // Barcode - Barcode string `json:"barcode"` - - // Category identifier - CategoryId int64 `json:"category_id"` - - // Marketing color - ColorImage string `json:"color_image"` - - // Array of nested characteristics - ComplexAttributes []struct { - // Array of product characteristics - Attributes []struct { - // Characteristic identifier - AttributeId int64 `json:"attribute_id"` - - // Identifier of the characteristic that supports nested properties. - // For example, the "Processor" characteristic has nested characteristics "Manufacturer" and "L2 Cache". - // Each of the nested characteristics can have multiple value variants - ComplexId int64 `json:"complex_id"` - - // Array of characteristic values - Values []struct { - // Characteristic identifier in the dictionary - DictionaryValueId int64 `json:"dictionary_value_id"` - - // Product characteristic value - Value string `json:"value"` - } `json:"values"` - } `json:"attributes"` - } `json:"complex_attributes"` - - // Depth - Depth int32 `json:"depth"` - - // Dimension measurement units: - // - mm — millimeters, - // - cm — centimeters, - // - in — inches - DimensionUnit string `json:"dimension_unit"` - - // Package height - Height int32 `json:"height"` - - // Product characteristic identifier - Id int64 `json:"id"` - - // Identifier for subsequent batch loading of images - ImageGroupId string `json:"image_group_id"` - - // Array of links to product images - Images []struct { - Default bool `json:"default"` - FileName string `json:"file_name"` - Index int64 `json:"index"` - } `json:"images"` - - // Array of 360 images - Images360 []struct { - FileName string `json:"file_name"` - Index int64 `json:"index"` - } `json:"images360"` - - // Product name. Up to 500 characters - Name string `json:"name"` - - // Product identifier in the seller's system - OfferId string `json:"offer_id"` - - // Array of PDF files - PDFList []struct { - // Path to PDF file - FileName string `json:"file_name"` - - // Storage order index - Index int64 `json:"index"` - - // File name - Name string `json:"name"` - } `json:"pdf_list"` - - // Weight of product in the package - Weight int32 `json:"weight"` - - // Weight measurement unit - WeightUnit string `json:"weight_unit"` - - // Package width - Width int32 `json:"width"` - } `json:"result"` + Result []GetDescriptionOfProductResult `json:"result"` // Identifier of the last value on the page. // @@ -1398,6 +1352,134 @@ type GetDescriptionOfProductResponse struct { Total int32 `json:"total"` } +type GetDescriptionOfProductResult struct { + // Array of product characteristics + Attributes []GetDescriptionOfProductResultAttr `json:"attributes"` + + // Barcode + Barcode string `json:"barcode"` + + // Category identifier + CategoryId int64 `json:"category_id"` + + // Marketing color + ColorImage string `json:"color_image"` + + // Array of nested characteristics + ComplexAttributes []GetDescriptionOfProductResultComplexAttrs `json:"complex_attributes"` + + // Depth + Depth int32 `json:"depth"` + + // Dimension measurement units: + // - mm — millimeters, + // - cm — centimeters, + // - in — inches + DimensionUnit string `json:"dimension_unit"` + + // Package height + Height int32 `json:"height"` + + // Product characteristic identifier + Id int64 `json:"id"` + + // Identifier for subsequent batch loading of images + ImageGroupId string `json:"image_group_id"` + + // Array of links to product images + Images []GetDescriptionOfProductResultImage `json:"images"` + + // Array of 360 images + Images360 []GetDescriptionOfProductResultImage360 `json:"images360"` + + // Product name. Up to 500 characters + Name string `json:"name"` + + // Product identifier in the seller's system + OfferId string `json:"offer_id"` + + // Array of PDF files + PDFList []GetDescriptionOfProductResultPDF `json:"pdf_list"` + + // Weight of product in the package + Weight int32 `json:"weight"` + + // Weight measurement unit + WeightUnit string `json:"weight_unit"` + + // Package width + Width int32 `json:"width"` +} + +type GetDescriptionOfProductResultAttr struct { + // Characteristic identifier + AttributeId int64 `json:"attribute_id"` + + // Identifier of the characteristic that supports nested properties. + // For example, the "Processor" characteristic has nested characteristics "Manufacturer" and "L2 Cache". + // Each of the nested characteristics can have multiple value variants + ComplexId int64 `json:"complex_id"` + + // Array of characteristic values + Values []GetDescriptionOfProductResultAttrValue `json:"values"` +} + +type GetDescriptionOfProductResultAttrValue struct { + // Characteristic identifier in the dictionary + DictionaryValueId int64 `json:"dictionary_value_id"` + + // Product characteristic value + Value string `json:"value"` +} + +type GetDescriptionOfProductResultComplexAttrs struct { + // Array of product characteristics + Attributes []GetDescriptionOfProductResultComplexAttr `json:"attributes"` +} + +type GetDescriptionOfProductResultComplexAttr struct { + // Characteristic identifier + AttributeId int64 `json:"attribute_id"` + + // Identifier of the characteristic that supports nested properties. + // For example, the "Processor" characteristic has nested characteristics "Manufacturer" and "L2 Cache". + // Each of the nested characteristics can have multiple value variants + ComplexId int64 `json:"complex_id"` + + // Array of characteristic values + Values []GetDescriptionOfProductResultComplexAttrValue `json:"values"` +} + +type GetDescriptionOfProductResultComplexAttrValue struct { + // Characteristic identifier in the dictionary + DictionaryValueId int64 `json:"dictionary_value_id"` + + // Product characteristic value + Value string `json:"value"` +} + +type GetDescriptionOfProductResultImage struct { + Default bool `json:"default"` + FileName string `json:"file_name"` + Index int64 `json:"index"` +} + +type GetDescriptionOfProductResultImage360 struct { + FileName string `json:"file_name"` + Index int64 `json:"index"` +} + +type GetDescriptionOfProductResultPDF struct { + // Path to PDF file + FileName string `json:"file_name"` + + // Storage order index + Index int64 `json:"index"` + + // File name + Name string `json:"name"` +} + // Returns a product characteristics description by product identifier. You can search for the product by `offer_id` or `product_id` func (c Products) GetDescriptionOfProduct(params *GetDescriptionOfProductParams) (*GetDescriptionOfProductResponse, error) { url := "/v3/products/info/attributes" @@ -1425,19 +1507,21 @@ type GetProductDescriptionResponse struct { core.CommonResponse // Method result - Result struct { - // Description - Description string `json:"description"` + Result GetProductDescriptionResult `json:"result"` +} - // Identifier - Id int64 `json:"id"` +type GetProductDescriptionResult struct { + // Description + Description string `json:"description"` - // Name - Name string `json:"name"` + // Identifier + Id int64 `json:"id"` - // Product identifier in the seller's system - OfferId string `json:"offer_id"` - } `json:"result"` + // Name + Name string `json:"name"` + + // Product identifier in the seller's system + OfferId string `json:"offer_id"` } // Get product description @@ -1465,13 +1549,15 @@ type GetProductRangeLimitResponse struct { DailyUpdate GetProductRangeLimitUploadQuota `json:"daily_update"` // Product range limit - Total struct { - // How many products you can create in your personal account - Limit int64 `json:"limit"` + Total GetProductRangeLimitTotal `json:"total"` +} - // How many products you've already created - Usage int64 `json:"usage"` - } `json:"total"` +type GetProductRangeLimitTotal struct { + // How many products you can create in your personal account + Limit int64 `json:"limit"` + + // How many products you've already created + Usage int64 `json:"usage"` } type GetProductRangeLimitUploadQuota struct { @@ -1524,13 +1610,15 @@ type ChangeProductIDsResponse struct { core.CommonResponse // Errors list - Errors []struct { - // Error message - Message string `json:"message"` + Errors []ChangeProductIDsError `json:"errors"` +} - // Product identifier that wasn't changed - OfferId string `json:"offer_id"` - } `json:"errors"` +type ChangeProductIDsError struct { + // Error message + Message string `json:"message"` + + // Product identifier that wasn't changed + OfferId string `json:"offer_id"` } // Method for changing the offer_id linked to products. You can change multiple offer_id in this method. @@ -1578,7 +1666,7 @@ func (c Products) ArchiveProduct(params *ArchiveProductParams) (*ArchiveProductR } // Warning: Since June 14, 2023 the method is disabled. -// +// // Unarchive product func (c Products) UnarchiveProduct(params *ArchiveProductParams) (*ArchiveProductResponse, error) { url := "/v1/product/unarchive" @@ -1608,16 +1696,18 @@ type RemoveProductWithoutSKUResponse struct { core.CommonResponse // Product processing status - Status []struct { - // Reason of the error that occurred while processing the request - Error string `json:"error"` + Status []RemoveProductWithoutSKUStatus `json:"status"` +} - // If the request was executed without errors and the products were deleted, the value is true - IsDeleted bool `json:"is_deleted"` +type RemoveProductWithoutSKUStatus struct { + // Reason of the error that occurred while processing the request + Error string `json:"error"` - // Product identifier in the seller's system - OfferId string `json:"offer_id"` - } `json:"status"` + // If the request was executed without errors and the products were deleted, the value is true + IsDeleted bool `json:"is_deleted"` + + // Product identifier in the seller's system + OfferId string `json:"offer_id"` } // Remove a product without an SKU from the archive @@ -1663,22 +1753,24 @@ type ListGeoRestrictionsResponse struct { core.CommonResponse // Restrictions - Restrictions []struct { - // Geo-restriction identifier - Id string `json:"id"` + Restrictions []ListGeoRestrictionsRestriction `json:"restrictions"` +} - // Item visibility - IsVisible bool `json:"is_visible"` +type ListGeoRestrictionsRestriction struct { + // Geo-restriction identifier + Id string `json:"id"` - // City name - Name string `json:"name"` + // Item visibility + IsVisible bool `json:"is_visible"` - // Geo-restriction order number. - // - // If you specify 23 in the last_order_number parameter in the request, - // the first item in the restrictions list will have order_number = 24 - OrderNumber int64 `json:"order_number"` - } `json:"restrictions"` + // City name + Name string `json:"name"` + + // Geo-restriction order number. + // + // If you specify 23 in the last_order_number parameter in the request, + // the first item in the restrictions list will have order_number = 24 + OrderNumber int64 `json:"order_number"` } // Get a list of geo-restrictions for services @@ -1708,10 +1800,12 @@ type UploadActivationCodesResponse struct { core.CommonResponse // Method result - Result struct { - // Uploading digital code task identifier - TaskId int64 `json:"task_id"` - } `json:"result"` + Result UploadActivationCodesResult `json:"result"` +} + +type UploadActivationCodesResult struct { + // Uploading digital code task identifier + TaskId int64 `json:"task_id"` } // Upload activation codes when you upload service or digital products. Activation code is associated with the digital product card @@ -1738,13 +1832,15 @@ type StatusOfUploadingActivationCodesResponse struct { core.CommonResponse // Method result - Result struct { - // Upload status: - // - pending — products in queue for processing. - // - imported — the product has been successfully uploaded. - // - failed — the product was uploaded with errors - Status string `json:"status"` - } `json:"result"` + Result StatusOfUploadingActivationCodesResult `json:"result"` +} + +type StatusOfUploadingActivationCodesResult struct { + // Upload status: + // - pending — products in queue for processing. + // - imported — the product has been successfully uploaded. + // - failed — the product was uploaded with errors + Status string `json:"status"` } // Get status of uploading activation codes task for services and digital products @@ -1790,191 +1886,211 @@ type GetProductPriceInfoResponse struct { core.CommonResponse // Result - Result struct { - // Products list - Items []struct { - // Commissions information - Commissions struct { - // Last mile (FBO) - FBOLastMile float64 `json:"fbo_deliv_to_customer_amount"` + Result GetProductPriceInfoResult `json:"result"` +} - // Pipeline to (FBO) - FBOPipelineTo float64 `json:"fbo_direct_flow_trans_max_amount"` +type GetProductPriceInfoResult struct { + // Products list + Items []GetPRoductPriceInfoResultItem `json:"items"` - // Pipeline from (FBO) - FBOPipelineFrom float64 `json:"fbo_direct_flow_trans_min_amount"` + // Identifier of the last value on page. Leave this field blank in the first request. + // + // To get the next values, specify last_id from the response of the previous request + LastId string `json:"last_id"` - // Order packaging fee (FBO) - FBOOrderPackagingFee float64 `json:"fbo_fulfillment_amount"` + // Products number in the list + Total int32 `json:"total"` +} - // Return and cancellation fees (FBO) - FBOReturnCancellationFee float64 `json:"fbo_return_flow_amount"` +type GetPRoductPriceInfoResultItem struct { + // Commissions information + Commissions GetProductPriceInfoResultItemCommission `json:"commissions"` - // Reverse logistics fee from (FBO) - FBOReverseLogisticsFeeFrom float64 `json:"fbo_return_flow_trans_min_amount"` + // Promotions information + MarketingActions []GetProductPriceInfoResultItemMarketingActions `json:"marketing_actions"` - // Reverse logistics fee to (FBO) - FBOReverseLogisticsFeeTo float64 `json:"fbo_return_flow_trans_max_amount"` + // Seller product identifier + OfferId string `json:"offer_id"` - // Last mile (FBS) - FBSLastMile float64 `json:"fbs_deliv_to_customer_amount"` + // Product price + Price GetProductPriceInfoResultItemPrice `json:"price"` - // Pipeline to (FBS) - FBSPipelineTo float64 `json:"fbs_direct_flow_trans_max_amount"` + // Deprected: price index + // + // Use PriceIndexes instead + PriceIndex string `json:"price_index"` - // Pipeline from (FBS) - FBSPipelineFrom float64 `json:"fbs_direct_flow_trans_min_amount"` + // Product price indexes + PriceIndexes GetProductPriceInfoResultItemPriceIndexes `json:"prices_indexes"` - // Shipment processing fee to (FBS) - FBSShipmentProcessingToFee float64 `json:"fbs_first_mile_min_amount"` + // Product identifier + ProductId int64 `json:"product_id"` - // Shipment processing fee from (FBS) - FBSShipmentProcessingFromFee float64 `json:"Shipment processing fee from (FBS)"` + // Product volume weight + VolumeWeight float64 `json:"volume_weight"` +} - // Return and cancellation fees, shipment processing (FBS) - FBSReturnCancellationProcessingFee float64 `json:"fbs_return_flow_amount"` +type GetProductPriceInfoResultItemCommission struct { + // Last mile (FBO) + FBOLastMile float64 `json:"fbo_deliv_to_customer_amount"` - // Return and cancellation fees, pipeline to (FBS) - FBSReturnCancellationToFees float64 `json:"fbs_return_flow_trans_max_amount"` + // Pipeline to (FBO) + FBOPipelineTo float64 `json:"fbo_direct_flow_trans_max_amount"` - // Return and cancellation fees, pipeline from (FBS) - FBSReturnCancellationFromFees float64 `json:"fbs_return_flow_trans_min_amount"` + // Pipeline from (FBO) + FBOPipelineFrom float64 `json:"fbo_direct_flow_trans_min_amount"` - // Sales commission percentage (FBO and FBS) - SalesCommissionRate float64 `json:"sales_percent"` - } `json:"commissions"` + // Order packaging fee (FBO) + FBOOrderPackagingFee float64 `json:"fbo_fulfillment_amount"` - // Promotions information - MarketingActions []struct { - // Seller's promotions. The parameters date_from, date_to, discount_value and title are specified for each seller's promotion - Actions []struct { - // Date and time when the seller's promotion starts - DateFrom time.Time `json:"date_from"` + // Return and cancellation fees (FBO) + FBOReturnCancellationFee float64 `json:"fbo_return_flow_amount"` - // Date and time when the seller's promotion ends - DateTo time.Time `json:"date_to"` + // Reverse logistics fee from (FBO) + FBOReverseLogisticsFeeFrom float64 `json:"fbo_return_flow_trans_min_amount"` - // Discount on the seller's promotion - DiscountValue string `json:"discount_value"` + // Reverse logistics fee to (FBO) + FBOReverseLogisticsFeeTo float64 `json:"fbo_return_flow_trans_max_amount"` - // Promotion name - Title string `json:"title"` - } `json:"actions"` + // Last mile (FBS) + FBSLastMile float64 `json:"fbs_deliv_to_customer_amount"` - // Current period start date and time for all current promotions - CurrentPeriodFrom time.Time `json:"current_period_from"` + // Pipeline to (FBS) + FBSPipelineTo float64 `json:"fbs_direct_flow_trans_max_amount"` - // Current period end date and time for all current promotions - CurrentPeriodTo time.Time `json:"current_period_to"` + // Pipeline from (FBS) + FBSPipelineFrom float64 `json:"fbs_direct_flow_trans_min_amount"` - // If a promotion can be applied to the product at the expense of Ozon, this field is set to true - OzonActionsExist bool `json:"ozon_actions_exist"` - } `json:"marketing_actions"` + // Shipment processing fee to (FBS) + FBSShipmentProcessingToFee float64 `json:"fbs_first_mile_min_amount"` - // Seller product identifier - OfferId string `json:"offer_id"` + // Shipment processing fee from (FBS) + FBSShipmentProcessingFromFee float64 `json:"Shipment processing fee from (FBS)"` - // Product price - Price struct { - // If promos auto-application is enabled, the value is true - AutoActionEnabled bool `json:"auto_action_enabled"` + // Return and cancellation fees, shipment processing (FBS) + FBSReturnCancellationProcessingFee float64 `json:"fbs_return_flow_amount"` - // Currency of your prices. It matches the currency set in the personal account settings - CurrencyCode string `json:"currency_code"` + // Return and cancellation fees, pipeline to (FBS) + FBSReturnCancellationToFees float64 `json:"fbs_return_flow_trans_max_amount"` - // Product price including all promotion discounts. This value will be indicated on the Ozon storefront - MarketingPrice string `json:"marketing_price"` + // Return and cancellation fees, pipeline from (FBS) + FBSReturnCancellationFromFees float64 `json:"fbs_return_flow_trans_min_amount"` - // Product price with seller's promotions applied - MarketingSellerPrice string `json:"marketing_seller_price"` + // Sales commission percentage (FBO and FBS) + SalesCommissionRate float64 `json:"sales_percent"` +} - // Minimum price for similar products on Ozon - MinOzonPrice string `json:"min_ozon_price"` +type GetProductPriceInfoResultItemMarketingActions struct { + // Seller's promotions. The parameters date_from, date_to, discount_value and title are specified for each seller's promotion + Actions []GetProductPriceInfoResultItemMarketingActionsAction `json:"actions"` - // Minimum product price with all promotions applied - MinPrice string `json:"min_price"` + // Current period start date and time for all current promotions + CurrentPeriodFrom time.Time `json:"current_period_from"` - // Price before discounts. Displayed strikethrough on the product description page - OldPrice string `json:"old_price"` + // Current period end date and time for all current promotions + CurrentPeriodTo time.Time `json:"current_period_to"` - // Price for customers with an Ozon Premium subscription - PremiumPrice string `json:"premium_price"` + // If a promotion can be applied to the product at the expense of Ozon, this field is set to true + OzonActionsExist bool `json:"ozon_actions_exist"` +} - // Product price including discounts. This value is shown on the product description page - Price string `json:"price"` +type GetProductPriceInfoResultItemMarketingActionsAction struct { + // Date and time when the seller's promotion starts + DateFrom time.Time `json:"date_from"` - // Product price suggested by the system based on similar offers - RecommendedPrice string `json:"recommended_price"` + // Date and time when the seller's promotion ends + DateTo time.Time `json:"date_to"` - // Retailer price - RetailPrice string `json:"retail_price"` + // Discount on the seller's promotion + DiscountValue string `json:"discount_value"` - // Product VAT rate - VAT string `json:"vat"` - } `json:"price"` + // Promotion name + Title string `json:"title"` +} - // Deprected: price index - // - // Use PriceIndexes instead - PriceIndex string `json:"price_index"` +type GetProductPriceInfoResultItemPrice struct { + // If promos auto-application is enabled, the value is true + AutoActionEnabled bool `json:"auto_action_enabled"` - // Product price indexes - PriceIndexes struct { - // Competitors' product price on other marketplaces - ExternalIndexData struct { - // Minimum competitors' product price on other marketplaces - MinimalPrice string `json:"minimal_price"` + // Currency of your prices. It matches the currency set in the personal account settings + CurrencyCode string `json:"currency_code"` - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` + // Product price including all promotion discounts. This value will be indicated on the Ozon storefront + MarketingPrice string `json:"marketing_price"` - // Price index value - PriceIndexValue float64 `json:"price_index_value"` - } `json:"external_index_data"` + // Product price with seller's promotions applied + MarketingSellerPrice string `json:"marketing_seller_price"` - // Competitors' product price on Ozon - OzonIndexData struct { - // Minimum competitors' product price on Ozon - MinimalPrice string `json:"minimal_price"` + // Minimum price for similar products on Ozon + MinOzonPrice string `json:"min_ozon_price"` - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` + // Minimum product price with all promotions applied + MinPrice string `json:"min_price"` - // Price index value - PriceIndexValue float64 `json:"price_index_value"` - } `json:"ozon_index_data"` + // Price before discounts. Displayed strikethrough on the product description page + OldPrice string `json:"old_price"` - // Resulting price index of the product - PriceIndex string `json:"price_index"` + // Price for customers with an Ozon Premium subscription + PremiumPrice string `json:"premium_price"` - // Price of your product on other marketplaces - SelfMarketplaceIndexData struct { - // Minimum price of your product on other marketplaces - MinimalPrice string `json:"minimal_price"` + // Product price including discounts. This value is shown on the product description page + Price string `json:"price"` - // Price currency - MinimalPriceCurrency string `json:"minimal_price_currency"` + // Product price suggested by the system based on similar offers + RecommendedPrice string `json:"recommended_price"` - // Price index value - PriceIndexValue float64 `json:"price_index_value"` - } `json:"self_marketplace_index_data"` - } `json:"prices_indexes"` + // Retailer price + RetailPrice string `json:"retail_price"` - // Product identifier - ProductId int64 `json:"product_id"` + // Product VAT rate + VAT string `json:"vat"` +} - // Product volume weight - VolumeWeight float64 `json:"volume_weight"` - } `json:"items"` +type GetProductPriceInfoResultItemPriceIndexes struct { + // Competitors' product price on other marketplaces + ExternalIndexData GetProductPriceInfoResultItemPriceIndexesExternal `json:"external_index_data"` - // Identifier of the last value on page. Leave this field blank in the first request. - // - // To get the next values, specify last_id from the response of the previous request - LastId string `json:"last_id"` + // Competitors' product price on Ozon + OzonIndexData GetProductPriceInfoResultItemPriceIndexesOzon `json:"ozon_index_data"` - // Products number in the list - Total int32 `json:"total"` - } `json:"result"` + // Resulting price index of the product + PriceIndex string `json:"price_index"` + + // Price of your product on other marketplaces + SelfMarketplaceIndexData GetProductPriceInfoResultItemPriceIndexesSelfMarketplace `json:"self_marketplace_index_data"` +} + +type GetProductPriceInfoResultItemPriceIndexesExternal struct { + // Minimum competitors' product price on other marketplaces + MinimalPrice string `json:"minimal_price"` + + // Price currency + MinimalPriceCurrency string `json:"minimal_price_currency"` + + // Price index value + PriceIndexValue float64 `json:"price_index_value"` +} + +type GetProductPriceInfoResultItemPriceIndexesOzon struct { + // Minimum competitors' product price on Ozon + MinimalPrice string `json:"minimal_price"` + + // Price currency + MinimalPriceCurrency string `json:"minimal_price_currency"` + + // Price index value + PriceIndexValue float64 `json:"price_index_value"` +} + +type GetProductPriceInfoResultItemPriceIndexesSelfMarketplace struct { + // Minimum price of your product on other marketplaces + MinimalPrice string `json:"minimal_price"` + + // Price currency + MinimalPriceCurrency string `json:"minimal_price_currency"` + + // Price index value + PriceIndexValue float64 `json:"price_index_value"` } // You can specify up to 1000 products in the request @@ -2001,51 +2117,53 @@ type GetMarkdownInfoResponse struct { core.CommonResponse // Information about the markdown and the main product - Items []struct { - // Comment on the damage reason - CommentReasonDamaged string `json:"comment_reason_damaged"` + Items []GetMarkdownInfoItem `json:"items"` +} - // Product condition: new or used - Condition string `json:"condition"` +type GetMarkdownInfoItem struct { + // Comment on the damage reason + CommentReasonDamaged string `json:"comment_reason_damaged"` - // Product condition on a 1 to 7 scale. - // - 1 — satisfactory, - // - 2 — good, - // - 3 — very good, - // - 4 — excellent, - // - 5–7 — like new - ConditionEstimate string `json:"condition_estimate"` + // Product condition: new or used + Condition string `json:"condition"` - // Product defects - Defects string `json:"defects"` + // Product condition on a 1 to 7 scale. + // - 1 — satisfactory, + // - 2 — good, + // - 3 — very good, + // - 4 — excellent, + // - 5–7 — like new + ConditionEstimate string `json:"condition_estimate"` - // Markdown product SKU - DiscountedSKU int64 `json:"discounted_sku"` + // Product defects + Defects string `json:"defects"` - // Mechanical damage description - MechanicalDamage string `json:"mechanical_damage"` + // Markdown product SKU + DiscountedSKU int64 `json:"discounted_sku"` - // Packaging damage description - PackageDamage string `json:"package_damage"` + // Mechanical damage description + MechanicalDamage string `json:"mechanical_damage"` - // Indication of package integrity damage - PackagingViolation string `json:"packaging_violation"` + // Packaging damage description + PackageDamage string `json:"package_damage"` - // Damage reason - ReasonDamaged string `json:"reason_damaged"` + // Indication of package integrity damage + PackagingViolation string `json:"packaging_violation"` - // Indication of repaired product - Repair string `json:"repair"` + // Damage reason + ReasonDamaged string `json:"reason_damaged"` - // Indication that the product is incomplete - Shortage string `json:"shortage"` + // Indication of repaired product + Repair string `json:"repair"` - // Main products SKU - SKU int64 `json:"sku"` + // Indication that the product is incomplete + Shortage string `json:"shortage"` - // Indication that the product has a valid warranty - WarrantyType string `json:"warranty_type"` - } `json:"items"` + // Main products SKU + SKU int64 `json:"sku"` + + // Indication that the product has a valid warranty + WarrantyType string `json:"warranty_type"` } // Get information about the markdown and the main product by the markdown product SKU @@ -2105,13 +2223,15 @@ type NumberOfSubsToProductAvailabilityResponse struct { core.CommonResponse // Method result - Result []struct { - // Number of subscribed users - Count int64 `json:"count"` + Result []NumberOfSubsToProductAvailabilityResult `json:"result"` +} - // Product identifier in the Ozon system, SKU - SKU int64 `json:"sku"` - } `json:"result"` +type NumberOfSubsToProductAvailabilityResult struct { + // Number of subscribed users + Count int64 `json:"count"` + + // Product identifier in the Ozon system, SKU + SKU int64 `json:"sku"` } // You can pass multiple products in a request diff --git a/ozon/promotions.go b/ozon/promotions.go index 1a66433..c2f324b 100644 --- a/ozon/promotions.go +++ b/ozon/promotions.go @@ -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: diff --git a/ozon/rating.go b/ozon/rating.go index d500ab4..79c8663 100644 --- a/ozon/rating.go +++ b/ozon/rating.go @@ -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) { diff --git a/ozon/reports.go b/ozon/reports.go index 8d56ac5..e1a7c43 100644 --- a/ozon/reports.go +++ b/ozon/reports.go @@ -38,45 +38,49 @@ 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 struct { + } `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 +107,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 @@ -178,136 +184,170 @@ 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"` - // Detailed info - Details struct { - // Balance on the beginning of period - BeginBalanceAmount float64 `json:"begin_balance_amount"` + // Logistic services cost + ItemDeliveryAndReturnAmount float64 `json:"item_delivery_and_return_amount"` - // Orders - Delivery struct { - Total float64 `json:"total"` + // Code of the currency used to calculate the commissions + CurrencyCode string `json:"currency_code"` +} - Amount float64 `json:"amount"` +type GetFinancialResultResultCashflowPeriod struct { + // Period identifier + Id int64 `json:"id"` - DeliveryServices struct { - Total float64 `json:"total"` + // Period start + Begin time.Time `json:"begin"` - Items []struct { - Name DetailsDeliveryItemName `json:"name"` + // Period end + End time.Time `json:"end"` +} - Price float64 `json:"price"` - } `json:"items"` - } `json:"delivery_services"` - } `json:"delivery"` +type GetFinancialResultResultDetail struct { + // Balance on the beginning of period + BeginBalanceAmount float64 `json:"begin_balance_amount"` - InvoiceTransfer float64 `json:"invoice_transfer"` + // Orders + Delivery GetFinancialResultResultDetailDelivery `json:"delivery"` - Loan float64 `json:"loan"` + InvoiceTransfer float64 `json:"invoice_transfer"` - Payments []struct { - CurrencyCode string `json:"currency_code"` + Loan float64 `json:"loan"` - Payment float64 `json:"payment"` - } `json:"payments"` + Payments []GetFinancialResultResultDetailPayment `json:"payments"` - Period struct { - Begin time.Time `json:"begin"` + Period GetFinancialResultResultDetailPeriod `json:"period"` - End time.Time `json:"end"` + Return GetFinancialResultResultDetailReturn `json:"return"` - Id int64 `json:"id"` - } `json:"period"` + RFBS GetFinancialResultResultDetailRFBS `json:"rfbs"` - Return struct { - Total float64 `json:"total"` + Services GetFinancialResultResultDetailService `json:"services"` - Amount float64 `json:"amount"` + Others GetFinancialResultResultDetailOthers `json:"others"` - ReturnServices struct { - Total float64 `json:"total"` + EndBalanceAmount float64 `json:"end_balance_amount"` +} - Items []struct { - Name DetailsReturnServiceName `json:"name"` +type GetFinancialResultResultDetailDelivery struct { + Total float64 `json:"total"` - Price float64 `json:"price"` - } `json:"items"` - } `json:"return_services"` - } `json:"return"` + Amount float64 `json:"amount"` - RFBS struct { - Total float64 `json:"total"` + DeliveryServices GetFinancialResultResultDetailDeliveryServices `json:"delivery_services"` +} - TransferDelivery float64 `json:"transfer_delivery"` +type GetFinancialResultResultDetailDeliveryServices struct { + Total float64 `json:"total"` - TransferDeliveryReturn float64 `json:"transfer_delivery_return"` + Items []GetFinancialResultResultDetailDeliveryServicesItem `json:"items"` +} - CompensationDeliveryReturn float64 `json:"compensation_delivery_return"` +type GetFinancialResultResultDetailDeliveryServicesItem struct { + Name DetailsDeliveryItemName `json:"name"` - PartialCompensation float64 `json:"partial_compensation"` + Price float64 `json:"price"` +} - PartialCompensationReturn float64 `json:"partial_compensation_return"` - } `json:"rfbs"` +type GetFinancialResultResultDetailPayment struct { + CurrencyCode string `json:"currency_code"` - Services struct { - Total float64 `json:"total"` + Payment float64 `json:"payment"` +} - Items []struct { - Name DetailsServiceItemName `json:"name"` +type GetFinancialResultResultDetailPeriod struct { + Begin time.Time `json:"begin"` - Price float64 `json:"price"` - } `json:"items"` - } `json:"services"` + End time.Time `json:"end"` - Others struct { - Total float64 `json:"total"` + Id int64 `json:"id"` +} - Items []struct { - Name DetailsOtherItemName `json:"name"` +type GetFinancialResultResultDetailReturn struct { + Total float64 `json:"total"` - Price float64 `json:"price"` - } `json:"items"` - } `json:"others"` + Amount float64 `json:"amount"` - EndBalanceAmount float64 `json:"end_balance_amount"` - } `json:"details"` + ReturnServices GetFinancialResultResultDetailReturnServices `json:"return_services"` +} - // Number of pages with reports - PageCount int64 `json:"page_count"` - } `json:"result"` +type GetFinancialResultResultDetailReturnServices struct { + Total float64 `json:"total"` + + Items []GetFinancialResultResultDetailReturnServicesItem `json:"items"` +} + +type GetFinancialResultResultDetailReturnServicesItem struct { + Name DetailsReturnServiceName `json:"name"` + + Price float64 `json:"price"` +} + +type GetFinancialResultResultDetailRFBS struct { + Total float64 `json:"total"` + + TransferDelivery float64 `json:"transfer_delivery"` + + TransferDeliveryReturn float64 `json:"transfer_delivery_return"` + + CompensationDeliveryReturn float64 `json:"compensation_delivery_return"` + + PartialCompensation float64 `json:"partial_compensation"` + + PartialCompensationReturn float64 `json:"partial_compensation_return"` +} + +type GetFinancialResultResultDetailService struct { + Total float64 `json:"total"` + + Items []GetFinancialResultResultDetailServiceItem `json:"items"` +} + +type GetFinancialResultResultDetailServiceItem struct { + Name DetailsServiceItemName `json:"name"` + + Price float64 `json:"price"` +} + +type GetFinancialResultResultDetailOthers struct { + Total float64 `json:"total"` + + Items []GetFinancialResultResultDetailOthersItem `json:"items"` +} + +type GetFinancialResultResultDetailOthersItem struct { + Name DetailsOtherItemName `json:"name"` + + Price float64 `json:"price"` } // Returns information about a created report by its identifier @@ -350,10 +390,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 @@ -383,10 +425,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 @@ -422,10 +466,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: @@ -473,10 +519,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. @@ -542,10 +590,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: @@ -603,23 +653,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 diff --git a/ozon/returns.go b/ozon/returns.go index f7799b6..d0bd6db 100644 --- a/ozon/returns.go +++ b/ozon/returns.go @@ -38,40 +38,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 string `json:"status_name"` } // Method for getting information on returned products that are sold from the Ozon warehouse @@ -150,88 +152,92 @@ type GetFBSReturnsFilterTimeRange struct { type GetFBSReturnsResponse struct { core.CommonResponse - Result struct { - // Elements counter in the response - Count int64 `json:"count"` + Result GetFBSReturnsResult `json:"result"` +} - // Returns information - Returns []struct { - // Time of receiving the return from the customer - AcceptedFromCustomerAmount string `json:"accepted_from_customer_amount"` +type GetFBSReturnsResult struct { + // Elements counter in the response + Count int64 `json:"count"` - // Bottom barcode on the product label - ClearingId int64 `json:"clearing_id"` + // Returns information + Returns []GetFBSReturnResultReturn `json:"returns"` +} - // Commission fee - Commission float64 `json:"commission"` +type GetFBSReturnResultReturn struct { + // Time of receiving the return from the customer + AcceptedFromCustomerAmount string `json:"accepted_from_customer_amount"` - // Commission percentage - CommissionPercent float64 `json:"commission_percent"` + // Bottom barcode on the product label + ClearingId int64 `json:"clearing_id"` - // Return identifier - Id int64 `json:"id"` + // Commission fee + Commission float64 `json:"commission"` - // If the product is in transit — true - IsMoving bool `json:"is_moving"` + // Commission percentage + CommissionPercent float64 `json:"commission_percent"` - // Indication that the package has been opened. true, if it has been - IsOpened bool `json:"is_opened"` + // Return identifier + 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"` + // Current product price without a discount + Price float64 `json:"price"` - // Product name - ProductName string `json:"product_name"` + // Product price without commission + PriceWithoutCommission float64 `json:"price_without_commission"` - // Product quantity - Quantity int64 `json:"quantity"` + // Product identifier + ProductId int64 `json:"product_id"` - // Product return date - ReturnDate string `json:"return_date"` + // Product name + ProductName string `json:"product_name"` - // Return reason - ReturnReasonName string `json:"return_reason_name"` + // Product quantity + Quantity int64 `json:"quantity"` - // Date when the product is ready to be handed over to the seller - WaitingForSellerDate string `json:"waiting_for_seller_date_time"` + // Product return date + ReturnDate string `json:"return_date"` - // Date of handing over the product to the seller - ReturnedToSellerDate string `json:"returned_to_seller_date_time"` + // Return reason + ReturnReasonName string `json:"return_reason_name"` - // Return storage period in days - WaitingForSellerDays int64 `json:"waiting_for_seller_days"` + // Date when the product is ready to be handed over to the seller + WaitingForSellerDate string `json:"waiting_for_seller_date_time"` - // Return storage cost - ReturnsKeepingCost float64 `json:"returns_keeping_cost"` + // Date of handing over the product to the seller + ReturnedToSellerDate string `json:"returned_to_seller_date_time"` - // Product identifier in the Ozon system, SKU - SKU int64 `json:"sku"` + // Return storage period in days + WaitingForSellerDays int64 `json:"waiting_for_seller_days"` - // Return status - Status string `json:"status"` - } `json:"returns"` - } `json:"result"` + // 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 diff --git a/ozon/strategies.go b/ozon/strategies.go index e4642f9..a397a12 100644 --- a/ozon/strategies.go +++ b/ozon/strategies.go @@ -19,15 +19,17 @@ type ListCompetitorsParams struct { type ListCompetitorsResponse struct { core.CommonResponse - Competitors []struct { - Name string `json:"name"` - - Id int64 `json:"id"` - } `json:"competitors"` + Competitors []ListCompetitorsCompetitor `json:"competitors"` Total int32 `json:"total"` } +type ListCompetitorsCompetitor struct { + Name string `json:"name"` + + Id int64 `json:"id"` +} + func (c Strategies) ListCompetitors(params *ListCompetitorsParams) (*ListCompetitorsResponse, error) { url := "/v1/pricing-strategy/competitors/list" @@ -51,27 +53,29 @@ type ListStrategiesParams struct { type ListStrategiesResponse struct { core.CommonResponse - Strategies []struct { - Id string `json:"id"` - - Name string `json:"name"` - - Type StrategyType `json:"type"` - - UpdateType StrategyUpdateType `json:"update_type"` - - UpdatedAt string `json:"updated_at"` - - ProductsCount int64 `json:"products_count"` - - CompetitorsCount int64 `json:"competitors_count"` - - Enabled bool `json:"enabled"` - } `json:"strategies"` + Strategies []ListStrategiesStrategy `json:"strategies"` Total int32 `json:"total"` } +type ListStrategiesStrategy struct { + Id string `json:"id"` + + Name string `json:"name"` + + Type StrategyType `json:"type"` + + UpdateType StrategyUpdateType `json:"update_type"` + + UpdatedAt string `json:"updated_at"` + + ProductsCount int64 `json:"products_count"` + + CompetitorsCount int64 `json:"competitors_count"` + + Enabled bool `json:"enabled"` +} + func (c Strategies) List(params *ListStrategiesParams) (*ListStrategiesResponse, error) { url := "/v1/pricing-strategy/list" @@ -101,9 +105,11 @@ type CreateStrategyCompetitor struct { type CreateStrategyResponse struct { core.CommonResponse - Result struct { - StrategyId string `json:"strategy_id"` - } `json:"result"` + Result CreateStrategyResult `json:"result"` +} + +type CreateStrategyResult struct { + StrategyId string `json:"strategy_id"` } func (c Strategies) Create(params *CreateStrategyParams) (*CreateStrategyResponse, error) { @@ -127,17 +133,19 @@ type InfoStrategyParams struct { type InfoStrategyResponse struct { core.CommonResponse - Result struct { - Competitors []CreateStrategyCompetitor `json:"competitors"` + Result InfoStrategyResult `json:"result"` +} - Enabled bool `json:"enabled"` +type InfoStrategyResult struct { + Competitors []CreateStrategyCompetitor `json:"competitors"` - Name string `json:"name"` + Enabled bool `json:"enabled"` - Type StrategyType `json:"type"` + Name string `json:"name"` - UpdateType StrategyUpdateType `json:"update_type"` - } `json:"result"` + Type StrategyType `json:"type"` + + UpdateType StrategyUpdateType `json:"update_type"` } func (c Strategies) Info(params *InfoStrategyParams) (*InfoStrategyResponse, error) { @@ -189,17 +197,21 @@ type AddProductsToStrategyParams struct { type AddProductsToStrategyResponse struct { core.CommonResponse - Result struct { - Errors []struct { - Code string `json:"code"` + Result AddProductsToStrategyResult `json:"result"` +} - Error string `json:"error"` +type AddProductsToStrategyResult struct { + Errors []AddProductsToStrategyResultError `json:"errors"` - ProductId int64 `json:"product_id"` - } `json:"errors"` + FailedProductCount int32 `json:"failed_product_count"` +} - FailedProductCount int32 `json:"failed_product_count"` - } `json:"result"` +type AddProductsToStrategyResultError struct { + Code string `json:"code"` + + Error string `json:"error"` + + ProductId int64 `json:"product_id"` } func (c Strategies) AddProducts(params *AddProductsToStrategyParams) (*AddProductsToStrategyResponse, error) { @@ -223,13 +235,17 @@ type GetStrategiesByProductIdsParams struct { type GetStrategiesByProductIdsResponse struct { core.CommonResponse - Result struct { - ProductsInfo []struct { - ProductId int64 `json:"product_id"` + Result GetStrategiesByProductIdsResult `json:"result"` +} - StrategyId string `json:"strategy_id"` - } `json:"products_info"` - } `json:"result"` +type GetStrategiesByProductIdsResult struct { + ProductsInfo []GetStrategiesByProductIdsResultProductInfo `json:"products_info"` +} + +type GetStrategiesByProductIdsResultProductInfo struct { + ProductId int64 `json:"product_id"` + + StrategyId string `json:"strategy_id"` } func (c Strategies) GetByProductIds(params *GetStrategiesByProductIdsParams) (*GetStrategiesByProductIdsResponse, error) { @@ -253,9 +269,11 @@ type ListProductsInStrategyParams struct { type ListProductsInStrategyResponse struct { core.CommonResponse - Result struct { - ProductId []string `json:"product_id"` - } `json:"result"` + Result ListProductsInStrategyResult `json:"result"` +} + +type ListProductsInStrategyResult struct { + ProductId []string `json:"product_id"` } func (c Strategies) ListProducts(params *ListProductsInStrategyParams) (*ListProductsInStrategyResponse, error) { @@ -279,19 +297,21 @@ type GetCompetitorPriceParams struct { type GetCompetitorPriceResponse struct { core.CommonResponse - Result struct { - StrategyId string `json:"strategy_id"` + Result GetCompetitorPriceResult `json:"result"` +} - IsEnabled bool `json:"is_enabled"` +type GetCompetitorPriceResult struct { + StrategyId string `json:"strategy_id"` - StrategyProductPrice int32 `json:"strategy_product_price"` + IsEnabled bool `json:"is_enabled"` - PriceDownloadedAt string `json:"price_downloaded_at"` + StrategyProductPrice int32 `json:"strategy_product_price"` - StrategyCompetitorId int64 `json:"strategy_competitor_id"` + PriceDownloadedAt string `json:"price_downloaded_at"` - StrategyCompetitorProductURL string `json:"strategy_competitor_product_url"` - } `json:"result"` + StrategyCompetitorId int64 `json:"strategy_competitor_id"` + + StrategyCompetitorProductURL string `json:"strategy_competitor_product_url"` } func (c Strategies) GetCompetitorPrice(params *GetCompetitorPriceParams) (*GetCompetitorPriceResponse, error) { @@ -315,9 +335,11 @@ type RemoveProductsFromStrategyParams struct { type RemoveProductsFromStrategyResponse struct { core.CommonResponse - Result struct { - FailedProductCount int32 `json:"failed_product_count"` - } `json:"result"` + Result RemoveProductsFromStrategyResult `json:"result"` +} + +type RemoveProductsFromStrategyResult struct { + FailedProductCount int32 `json:"failed_product_count"` } func (c Strategies) RemoveProducts(params *RemoveProductsFromStrategyParams) (*RemoveProductsFromStrategyResponse, error) { diff --git a/ozon/warehouses.go b/ozon/warehouses.go index f32c0d4..abeac8a 100644 --- a/ozon/warehouses.go +++ b/ozon/warehouses.go @@ -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