update posting methods status/substatus, changed price index to multiple indexes in products responses
This commit is contained in:
138
ozon/common.go
138
ozon/common.go
@@ -175,3 +175,141 @@ const (
|
||||
// overdue
|
||||
Overdue SupplyRequestState = "OVERDUE"
|
||||
)
|
||||
|
||||
type ShipmentStatus string
|
||||
|
||||
const (
|
||||
// acceptance is in progress
|
||||
AcceptanceInProgress ShipmentStatus = "acceptance_in_progress"
|
||||
|
||||
// arbitration
|
||||
Arbitration ShipmentStatus = "arbitration"
|
||||
|
||||
// awaiting confirmation
|
||||
AwaitingApprove ShipmentStatus = "awaiting_approve"
|
||||
|
||||
// awaiting shipping
|
||||
AwaitingDeliver ShipmentStatus = "awaiting_deliver"
|
||||
|
||||
// awaiting packaging
|
||||
AwaitingPackaging ShipmentStatus = "awaiting_packaging"
|
||||
|
||||
// created
|
||||
AwaitingVerification ShipmentStatus = "awaiting_verification"
|
||||
|
||||
// cancelled
|
||||
CancelledSubstatus ShipmentStatus = "cancelled"
|
||||
|
||||
// delivered
|
||||
Delivered ShipmentStatus = "delivered"
|
||||
|
||||
// delivery is in progress
|
||||
Delivering ShipmentStatus = "delivering"
|
||||
|
||||
// picked up by driver
|
||||
DriverPickup ShipmentStatus = "driver_pickup"
|
||||
|
||||
// not accepted at the sorting center
|
||||
NotAccepted ShipmentStatus = "not_accepted"
|
||||
|
||||
// sent by the seller
|
||||
SentBySeller ShipmentStatus = "sent_by_seller"
|
||||
)
|
||||
|
||||
type ShipmentSubstatus string
|
||||
|
||||
const (
|
||||
// acceptance in progress
|
||||
PostingAcceptanceInProgress ShipmentStatus = "posting_acceptance_in_progress"
|
||||
|
||||
// arbitrage
|
||||
PostingInArbitration ShipmentStatus = "posting_in_arbitration"
|
||||
|
||||
// created
|
||||
PostingCreated ShipmentStatus = "posting_created"
|
||||
|
||||
// in the freight
|
||||
PostingInCarriage ShipmentStatus = "posting_in_carriage"
|
||||
|
||||
// not added to the freight
|
||||
PostingNotInCarriage ShipmentStatus = "posting_not_in_carriage"
|
||||
|
||||
// registered
|
||||
PostingRegistered ShipmentStatus = "posting_registered"
|
||||
|
||||
// is handed over to the delivery service
|
||||
PostingTransferringToDelivery ShipmentStatus = "posting_transferring_to_delivery"
|
||||
|
||||
// waiting for passport data
|
||||
PostingAwaitingPassportData ShipmentStatus = "posting_awaiting_passport_data"
|
||||
|
||||
// created
|
||||
PostingCreatedSubstatus ShipmentStatus = "posting_created"
|
||||
|
||||
// awaiting registration
|
||||
PostingAwaitingRegistration ShipmentStatus = "posting_awaiting_registration"
|
||||
|
||||
// registration error
|
||||
PostingRegistrationError ShipmentStatus = "posting_registration_error"
|
||||
|
||||
// created
|
||||
PostingSplitPending ShipmentStatus = "posting_split_pending"
|
||||
|
||||
// canceled
|
||||
PostingCancelled ShipmentStatus = "posting_canceled"
|
||||
|
||||
// customer delivery arbitrage
|
||||
PostingInClientArbitration ShipmentStatus = "posting_in_client_arbitration"
|
||||
|
||||
// delivered
|
||||
PostingDelivered ShipmentStatus = "posting_delivered"
|
||||
|
||||
// recieved
|
||||
PostingReceived ShipmentStatus = "posting_received"
|
||||
|
||||
// presumably delivered
|
||||
PostingConditionallyDelivered ShipmentStatus = "posting_conditionally_delivered"
|
||||
|
||||
// courier on the way
|
||||
PostingInCourierService ShipmentStatus = "posting_in_courier_service"
|
||||
|
||||
// at the pick-up point
|
||||
PostingInPickupPoint ShipmentStatus = "posting_in_pickup_point"
|
||||
|
||||
// on the way to the city
|
||||
PostingOnWayToCity ShipmentStatus = "posting_on_way_to_city"
|
||||
|
||||
// on the way to the pick-up point
|
||||
PostingOnWayToPickupPoint ShipmentStatus = "posting_on_way_to_pickup_point"
|
||||
|
||||
// returned to the warehouse
|
||||
PostingReturnedToWarehouse ShipmentStatus = "posting_returned_to_warehouse"
|
||||
|
||||
// is handed over to the courier
|
||||
PostingTransferredToCourierService ShipmentStatus = "posting_transferred_to_courier_service"
|
||||
|
||||
// handed over to the driver
|
||||
PostingDriverPickup ShipmentStatus = "posting_driver_pick_up"
|
||||
|
||||
// not accepted at the sorting center
|
||||
PostingNotInSortCenter ShipmentStatus = "posting_not_in_sort_center"
|
||||
|
||||
// sent by the seller
|
||||
SentBySellerSubstatus ShipmentStatus = "sent_by_seller"
|
||||
)
|
||||
|
||||
type TPLIntegrationType string
|
||||
|
||||
const (
|
||||
// delivery by the Ozon logistics
|
||||
OzonTPLType TPLIntegrationType = "ozon"
|
||||
|
||||
// delivery by a third-party service, Ozon registers the order
|
||||
AggregatorTPLType TPLIntegrationType = "aggregator"
|
||||
|
||||
// delivery by a third-party service, the seller registers the order
|
||||
TrackingTPLType TPLIntegrationType = "3pl_tracking"
|
||||
|
||||
// delivery by the seller
|
||||
NonIntegratedTPLType TPLIntegrationType = "non_integrated"
|
||||
)
|
||||
|
||||
17
ozon/fbs.go
17
ozon/fbs.go
@@ -754,14 +754,13 @@ type GetShipmentDataByIdentifierResponse struct {
|
||||
ShipmentDate time.Time `json:"shipment_date"`
|
||||
|
||||
// Shipment status
|
||||
Status string `json:"status"`
|
||||
Status ShipmentStatus `json:"status"`
|
||||
|
||||
// Type of integration with the delivery service:
|
||||
// - ozon — delivery by the Ozon logistics.
|
||||
// - aggregator — delivery by a third-party service, Ozon registers the order.
|
||||
// - 3pl_tracking — delivery by a third-party service, the seller registers the order.
|
||||
// - non_integrated — delivery by the seller
|
||||
TPLIntegrationType string `json:"tpl_integration_type"`
|
||||
// Shipment substatus
|
||||
Substatus ShipmentSubstatus `json:"substatus"`
|
||||
|
||||
// Type of integration with the delivery service
|
||||
TPLIntegrationType TPLIntegrationType `json:"tpl_integration_type"`
|
||||
|
||||
// Shipment tracking number
|
||||
TrackingNumber string `json:"tracking_number"`
|
||||
@@ -1132,6 +1131,7 @@ type CancelShipmentResponse struct {
|
||||
// - 665 — the customer did not pick the order;
|
||||
// - 666 — delivery is not available in the region;
|
||||
// - 667 — order was lost by the delivery service.
|
||||
//
|
||||
// For presumably delivered orders only the last 3 reasons are available.
|
||||
//
|
||||
// If cancel_reason_id parameter value is 402, fill the cancel_reason_message field
|
||||
@@ -1381,13 +1381,14 @@ type CheckProductItemsDataResponse struct {
|
||||
// Asynchronous method:
|
||||
// - for checking the availability of product items in the “Chestny ZNAK” labeling system
|
||||
// - for saving product items data
|
||||
//
|
||||
// To get the checks results, use the `/v4/fbs/posting/product/exemplar/status method`
|
||||
//
|
||||
// If necessary, specify the number of the cargo customs declaration in the gtd parameter. If it is missing, pass the value `is_gtd_absent` = true
|
||||
//
|
||||
// If you have multiple identical products in a shipment, specify one `product_id` and `exemplars` array for each product in the shipment
|
||||
//
|
||||
// Always pass a complete set of product items data
|
||||
// # Always pass a complete set of product items data
|
||||
//
|
||||
// For example, you have 10 product items in your system.
|
||||
// You have passed them for checking and saving. Then they added another 60 product items to your system.
|
||||
|
||||
@@ -223,7 +223,51 @@ type ProductDetails struct {
|
||||
// Product price including discounts. This value is shown on the product description page
|
||||
Price string `json:"price"`
|
||||
|
||||
// Price index. Learn more in Help Center
|
||||
// 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"`
|
||||
|
||||
// Deprecated: Price index. Learn more in Help Center
|
||||
//
|
||||
// Use PriceIndexes instead
|
||||
PriceIndex string `json:"price_idnex"`
|
||||
|
||||
// Product price suggested by the system based on similar offers
|
||||
@@ -1445,6 +1489,7 @@ type GetProductRangeLimitUploadQuota struct {
|
||||
// - Product range limit: how many products you can create in your personal account.
|
||||
// - Products creation limit: how many products you can create per day.
|
||||
// - Products update limit: how many products you can update per day.
|
||||
//
|
||||
// If you have a product range limit and you exceed it, you won't be able to create new products
|
||||
func (c Products) GetProductRangeLimit() (*GetProductRangeLimitResponse, error) {
|
||||
url := "/v4/product/info/limit"
|
||||
@@ -1910,7 +1955,7 @@ type GetMarkdownInfoResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
// Information about the markdown and the main product
|
||||
Items []struct{
|
||||
Items []struct {
|
||||
// Comment on the damage reason
|
||||
CommentReasonDamaged string `json:"comment_reason_damaged"`
|
||||
|
||||
@@ -1975,7 +2020,7 @@ func (c Products) GetMarkdownInfo(params *GetMarkdownInfoParams) (*GetMarkdownIn
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type SetDiscountOnMarkdownProductParams struct{
|
||||
type SetDiscountOnMarkdownProductParams struct {
|
||||
// Discount amount: from 3 to 99 percents
|
||||
Discount int32 `json:"discount"`
|
||||
|
||||
@@ -1983,7 +2028,7 @@ type SetDiscountOnMarkdownProductParams struct{
|
||||
ProductId int64 `json:"product_id"`
|
||||
}
|
||||
|
||||
type SetDiscountOnMarkdownProductResponse struct{
|
||||
type SetDiscountOnMarkdownProductResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
// Method result. true if the query was executed without errors
|
||||
@@ -2004,3 +2049,36 @@ func (c Products) SetDiscountOnMarkdownProduct(params *SetDiscountOnMarkdownProd
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
type NumberOfSubsToProductAvailabilityParams struct {
|
||||
// List of SKUs, product identifiers in the Ozon system
|
||||
SKUS []int64 `json:"skus"`
|
||||
}
|
||||
|
||||
type NumberOfSubsToProductAvailabilityResponse struct {
|
||||
core.CommonResponse
|
||||
|
||||
// Method result
|
||||
Result []struct {
|
||||
// Number of subscribed users
|
||||
Count int64 `json:"count"`
|
||||
|
||||
// Product identifier in the Ozon system, SKU
|
||||
SKU int64 `json:"sku"`
|
||||
} `json:"result"`
|
||||
}
|
||||
|
||||
// You can pass multiple products in a request
|
||||
func (c Products) NumberOfSubsToProductAvailability(params *NumberOfSubsToProductAvailabilityParams) (*NumberOfSubsToProductAvailabilityResponse, error) {
|
||||
url := "/v1/product/info/subscription"
|
||||
|
||||
resp := &NumberOfSubsToProductAvailabilityResponse{}
|
||||
|
||||
response, err := c.client.Request(http.MethodPost, url, params, resp, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
response.CopyCommonResponse(&resp.CommonResponse)
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
@@ -168,7 +168,24 @@ func TestGetProductDetails(t *testing.T) {
|
||||
"has_stock": false,
|
||||
"active_product": false
|
||||
},
|
||||
"price_index": "0.00",
|
||||
"price_indexes": {
|
||||
"external_index_data": {
|
||||
"minimal_price": "string",
|
||||
"minimal_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
},
|
||||
"ozon_index_data": {
|
||||
"minimal_price": "string",
|
||||
"minimal_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
},
|
||||
"price_index": "WITHOUT_INDEX",
|
||||
"self_marketplaces_index_data": {
|
||||
"minimal_price": "string",
|
||||
"minimal_price_currency": "string",
|
||||
"price_index_value": 0
|
||||
}
|
||||
},
|
||||
"commissions": [],
|
||||
"volume_weight": 0.1,
|
||||
"is_prepayment": false,
|
||||
@@ -233,7 +250,7 @@ func TestGetProductDetails(t *testing.T) {
|
||||
"state_updated_at": "2021-10-21T15:48:03.927309Z"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
{
|
||||
@@ -2407,3 +2424,66 @@ func TestSetDiscountOnMarkdownProduct(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestNumberOfSubsToProductAvailability(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
statusCode int
|
||||
headers map[string]string
|
||||
params *NumberOfSubsToProductAvailabilityParams
|
||||
response string
|
||||
}{
|
||||
// Test Ok
|
||||
{
|
||||
http.StatusOK,
|
||||
map[string]string{"Client-Id": "my-client-id", "Api-Key": "my-api-key"},
|
||||
&NumberOfSubsToProductAvailabilityParams{
|
||||
SKUS: []int64{1234},
|
||||
},
|
||||
`{
|
||||
"result": [
|
||||
{
|
||||
"count": 2,
|
||||
"sku": 1234
|
||||
}
|
||||
]
|
||||
}`,
|
||||
},
|
||||
// Test No Client-Id or Api-Key
|
||||
{
|
||||
http.StatusUnauthorized,
|
||||
map[string]string{},
|
||||
&NumberOfSubsToProductAvailabilityParams{},
|
||||
`{
|
||||
"code": 16,
|
||||
"message": "Client-Id and Api-Key headers are required"
|
||||
}`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
c := NewMockClient(core.NewMockHttpHandler(test.statusCode, test.response, test.headers))
|
||||
|
||||
resp, err := c.Products().NumberOfSubsToProductAvailability(test.params)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if resp.StatusCode != test.statusCode {
|
||||
t.Errorf("got wrong status code: got: %d, expected: %d", resp.StatusCode, test.statusCode)
|
||||
}
|
||||
|
||||
if resp.StatusCode == http.StatusOK {
|
||||
if len(resp.Result) != len(test.params.SKUS) {
|
||||
t.Errorf("Length of SKUS in request and response are not equal")
|
||||
}
|
||||
|
||||
if len(resp.Result) > 0 {
|
||||
if resp.Result[0].SKU != test.params.SKUS[0] {
|
||||
t.Errorf("SKU in request and response are not equal")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user