diff --git a/client.go b/client.go index 8fe48da..5f6a1ad 100644 --- a/client.go +++ b/client.go @@ -82,9 +82,9 @@ func (c Client) Request(method string, path string, req, resp interface{}) (*Res response.Data = resp response.StatusCode = httpResp.StatusCode if httpResp.StatusCode == http.StatusOK { - err = json.Unmarshal(body, &response) - } else { err = json.Unmarshal(body, &response.Data) + } else { + err = json.Unmarshal(body, &response) } if err != nil { return nil, err diff --git a/core.go b/core.go index 5bf9224..07956db 100644 --- a/core.go +++ b/core.go @@ -4,6 +4,8 @@ import ( "fmt" "net/http" "reflect" + "testing" + "time" ) type CommonResponse struct { @@ -99,3 +101,11 @@ func isZero(v interface{}) (bool, error) { } return v == reflect.Zero(t).Interface(), nil } + +func TimeFromString(t *testing.T, datetime string) time.Time { + dt, err := time.Parse("2006-01-02T15:04:05Z", datetime) + if err != nil { + t.Errorf("error when parsing time: %s", err) + } + return dt +} diff --git a/ozon/fbs.go b/ozon/fbs.go index c5cd3f1..db343cb 100644 --- a/ozon/fbs.go +++ b/ozon/fbs.go @@ -2,6 +2,7 @@ package ozon import ( "net/http" + "time" core "github.com/diphantxm/ozon-api-client" ) @@ -15,14 +16,14 @@ type ListUnprocessedShipmentsParams struct { } type ListUnprocessedShipmentsFilter struct { - CutoffFrom string `json:"cutoff_from"` - CutoffTo string `json:"cutoff_to"` - DeliveringDateFrom string `json:"delivering_date_from"` - DeliveringDateTo string `json:"delivering_date_to"` - DeliveryMethodId []int64 `json:"deliveryMethodId"` - ProviderId []int64 `json:"provider_id"` - Status string `json:"status"` - WarehouseId []int64 `json:"warehouse_id"` + CutoffFrom time.Time `json:"cutoff_from"` + CutoffTo time.Time `json:"cutoff_to"` + DeliveringDateFrom time.Time `json:"delivering_date_from"` + DeliveringDateTo time.Time `json:"delivering_date_to"` + DeliveryMethodId []int64 `json:"deliveryMethodId"` + ProviderId []int64 `json:"provider_id"` + Status string `json:"status"` + WarehouseId []int64 `json:"warehouse_id"` } type ListUnprocessedShipmentsWith struct { @@ -50,18 +51,18 @@ type ListUnprocessedShipmentsPosting struct { } `json:"addressee"` AnalyticsData struct { - City string `json:"city"` - DeliveryDateBegin string `json:"delivery_date_begin"` - DeliveryDateEnd string `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"` + 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"` Barcodes struct { @@ -85,7 +86,7 @@ type ListUnprocessedShipmentsPosting struct { Comment string `json:"comment"` Country string `json:"country"` District string `json:"district"` - Latitude float64 `json:'latitude"` + Latitude float64 `json:"latitude"` Longitude float64 `json:"longitude"` ProviderPVZCode string `json:"provider_pvz_code"` PVZCode int64 `json:"pvz_code"` @@ -99,7 +100,8 @@ type ListUnprocessedShipmentsPosting struct { Phone string `json:"phone"` } `json:"customer"` - DeliveringDate string `json:"delivering_date"` + DeliveringDate time.Time `json:"delivering_date"` + DeliveryMethod struct { Id int64 `json:"id"` Name string `json:"name"` @@ -125,9 +127,9 @@ type ListUnprocessedShipmentsPosting struct { OldPrice float64 `json:"old_price"` Payout float64 `json:"payout"` Picking struct { - Amount float64 `json:"amount"` - Moment string `json:"moment"` - Tag string `json:"tag"` + Amount float64 `json:"amount"` + Moment time.Time `json:"moment"` + Tag string `json:"tag"` } `json:"picking"` Price float64 `json:"price"` ProductId int64 `json:"product_id"` @@ -137,16 +139,16 @@ type ListUnprocessedShipmentsPosting struct { } `json:"products"` } - InProccessAt string `json:"in_process_at"` - IsExpress bool `json:"is_express"` - IsMultibox bool `json:"is_multibox"` - MultiBoxQuantity int32 `json:"multi_box_qty"` - OrderId int64 `json:"order_id"` - OrderNumber string `json:"order_number"` - ParentPostingNumber string `json:"parent_posting_number"` - PostingNumber string `json:"posting_number"` + InProccessAt time.Time `json:"in_process_at"` + IsExpress bool `json:"is_express"` + IsMultibox bool `json:"is_multibox"` + MultiBoxQuantity int32 `json:"multi_box_qty"` + OrderId int64 `json:"order_id"` + OrderNumber string `json:"order_number"` + ParentPostingNumber string `json:"parent_posting_number"` + PostingNumber string `json:"posting_number"` - Products struct { + Products []struct { MandatoryMark []string `json:"mandatory_mark"` Name string `json:"name"` OfferId string `json:"offer_id"` @@ -163,10 +165,10 @@ type ListUnprocessedShipmentsPosting struct { ProductsRequiringRNPT []string `json:"products_requiring_rnpt"` } `json:"requirements"` - ShipmentDate string `json:"shipment_date"` - Status string `json:"status"` - TPLIntegrationType string `json:"tpl_integration_type"` - TrackingNumber string `json:"tracking_number"` + ShipmentDate time.Time `json:"shipment_date"` + Status string `json:"status"` + TPLIntegrationType string `json:"tpl_integration_type"` + TrackingNumber string `json:"tracking_number"` } type MarketplaceServices struct { diff --git a/ozon/fbs_test.go b/ozon/fbs_test.go index 1cf2657..7a8431b 100644 --- a/ozon/fbs_test.go +++ b/ozon/fbs_test.go @@ -19,8 +19,8 @@ func TestListUnprocessedShipments(t *testing.T) { &ListUnprocessedShipmentsParams{ Direction: "ASC", Filter: ListUnprocessedShipmentsFilter{ - CutoffFrom: "2021-08-24T14:15:22Z", - CutoffTo: "2021-08-31T14:15:22Z", + CutoffFrom: core.TimeFromString(t, "2021-08-24T14:15:22Z"), + CutoffTo: core.TimeFromString(t, "2021-08-31T14:15:22Z"), Status: "awaiting_packaging", }, Limit: 100, diff --git a/ozon/products.go b/ozon/products.go index 3981411..0b9fefd 100644 --- a/ozon/products.go +++ b/ozon/products.go @@ -2,6 +2,7 @@ package ozon import ( "net/http" + "time" core "github.com/diphantxm/ozon-api-client" ) @@ -34,42 +35,36 @@ type GetStocksInfoResponse struct { core.CommonResponse // Method Result - Result GetStocksInfoResponseResult `json:"result,omitempty"` -} + 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"` -type GetStocksInfoResponseResult 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"` + // The number of unique products for which information about stocks is displayed + Total int32 `json:"total,omitempty"` - // The number of unique products for which information about stocks is displayed - Total int32 `json:"total,omitempty"` + // Product details + Items []struct { + // Product identifier in the seller's system + OfferId string `json:"offer_id,omitempty"` - // Product details - Items []GetStocksInfoResponseItem `json:"items,omitempty"` -} + // Product identifier + ProductId int64 `json:"product_id,omitempty"` -type GetStocksInfoResponseItem struct { - // Product identifier in the seller's system - OfferId string `json:"offer_id,omitempty"` + // Stock details + Stocks []struct { + // In a warehouse + Present int32 `json:"present,omitempty"` - // Product identifier - ProductId int64 `json:"product_id,omitempty"` + // Reserved + Reserved int32 `json:"reserved,omitempty"` - // Stock details - Stocks []GetStocksInfoResponseStock `json:"stocks,omitempty"` -} - -type GetStocksInfoResponseStock struct { - // In a warehouse - Present int32 `json:"present,omitempty"` - - // Reserved - Reserved int32 `json:"reserved,omitempty"` - - // Warehouse type - Type string `json:"type,omitempty" default:"ALL"` + // Warehouse type + Type string `json:"type,omitempty" default:"ALL"` + } `json:"stocks,omitempty"` + } `json:"items,omitempty"` + } `json:"result,omitempty"` } func (c Client) GetStocksInfo(params *GetStocksInfoParams) (*GetStocksInfoResponse, error) { @@ -95,111 +90,95 @@ type GetProductDetailsParams struct { type GetProductDetailsResponse struct { core.CommonResponse - Result GetProductDetailsResponseResult `json:"Result"` -} - -type GetProductDetailsResponseResult struct { - Barcode string `json:"barcode"` - Barcodes []string `json:"barcodes"` - BuyboxPrice string `json:"buybox_price"` - CategoryId int64 `json:"category_id"` - ColorImage string `json:"color_image"` - Commissions []GetProductDetailsResponseCommission `json:"commissions"` - CreatedAt string `json:"created_at"` - FBOSKU int64 `json:"fbo_sku"` - FBSSKU int64 `json:"fbs_sku"` - Id int64 `json:"id"` - Images []string `json:"images"` - PrimaryImage string `json:"primary_image"` - Images360 []string `json:"images360"` - HasDiscountedItem bool `json:"has_discounted_item"` - IsDiscounted bool `json:"is_discounted"` - DiscountedStocks GetProductDetailsResponseDiscountedStocks `json:"discounted_stocks"` - IsKGT bool `json:"is_kgt"` - IsPrepayment bool `json:"is_prepayment"` - IsPrepaymentAllowed bool `json:"is_prepayment_allowed"` - CurrencyCode string `json:"currency_code"` - MarketingPrice string `json:"marketing_price"` - MinOzonPrice string `json:"min_ozon_price"` - MinPrice string `json:"min_price"` - Name string `json:"name"` - OfferId string `json:"offer_id"` - OldPrice string `json:"old_price"` - PremiumPrice string `json:"premium_price"` - Price string `json:"price"` - PriceIndex string `json:"price_idnex"` - RecommendedPrice string `json:"recommended_price"` - Status GetProductDetailsResponseStatus `json:"status"` - Sources []GetProductDetailsResponseSource `json:"sources"` - Stocks GetProductDetailsResponseStocks `json:"stocks"` - UpdatedAt string `json:"updated_at"` - VAT string `json:"vat"` - VisibilityDetails GetProductDetailsResponseDetails `json:"visibility_details"` - Visible bool `json:"visible"` - VolumeWeight float64 `json:"volume_weights"` -} - -type GetProductDetailsResponseCommission struct { - DeliveryAmount float64 `json:"deliveryAmount"` - MinValue float64 `json:"minValue"` - Percent float64 `json:"percent"` - ReturnAmount float64 `json:"returnAmount"` - SaleSchema string `json:"saleSchema"` - Value float64 `json:"value"` -} - -type GetProductDetailsResponseDiscountedStocks struct { - Coming int32 `json:"coming"` - Present int32 `json:"present"` - Reserved int32 `json:"reserved"` -} - -type GetProductDetailsResponseStatus struct { - State string `json:"state"` - StateFailed string `json:"state_failed"` - ModerateStatus string `json:"moderate_status"` - DeclineReasons []string `json:"decline_reasons"` - ValidationsState string `json:"validation_state"` - StateName string `json:"state_name"` - StateDescription string `json:"state_description"` - IsFailed bool `json:"is_failed"` - IsCreated bool `json:"is_created"` - StateTooltip string `json:"state_tooltip"` - ItemErrors []GetProductDetailsResponseItemError `json:"item_errors"` - StateUpdatedAt string `json:"state_updated_at"` + Result struct { + Barcode string `json:"barcode"` + Barcodes []string `json:"barcodes"` + BuyboxPrice string `json:"buybox_price"` + CategoryId int64 `json:"category_id"` + ColorImage string `json:"color_image"` + Commissions []struct { + DeliveryAmount float64 `json:"deliveryAmount"` + MinValue float64 `json:"minValue"` + Percent float64 `json:"percent"` + ReturnAmount float64 `json:"returnAmount"` + SaleSchema string `json:"saleSchema"` + Value float64 `json:"value"` + } `json:"commissions"` + CreatedAt time.Time `json:"created_at"` + FBOSKU int64 `json:"fbo_sku"` + FBSSKU int64 `json:"fbs_sku"` + Id int64 `json:"id"` + Images []string `json:"images"` + PrimaryImage string `json:"primary_image"` + Images360 []string `json:"images360"` + HasDiscountedItem bool `json:"has_discounted_item"` + IsDiscounted bool `json:"is_discounted"` + DiscountedStocks struct { + Coming int32 `json:"coming"` + Present int32 `json:"present"` + Reserved int32 `json:"reserved"` + } `json:"discounted_stocks"` + IsKGT bool `json:"is_kgt"` + IsPrepayment bool `json:"is_prepayment"` + IsPrepaymentAllowed bool `json:"is_prepayment_allowed"` + CurrencyCode string `json:"currency_code"` + MarketingPrice string `json:"marketing_price"` + MinOzonPrice string `json:"min_ozon_price"` + MinPrice string `json:"min_price"` + Name string `json:"name"` + OfferId string `json:"offer_id"` + OldPrice string `json:"old_price"` + PremiumPrice string `json:"premium_price"` + Price string `json:"price"` + PriceIndex string `json:"price_idnex"` + RecommendedPrice string `json:"recommended_price"` + Status struct { + State string `json:"state"` + StateFailed string `json:"state_failed"` + ModerateStatus string `json:"moderate_status"` + DeclineReasons []string `json:"decline_reasons"` + ValidationsState string `json:"validation_state"` + StateName string `json:"state_name"` + StateDescription string `json:"state_description"` + IsFailed bool `json:"is_failed"` + IsCreated bool `json:"is_created"` + StateTooltip string `json:"state_tooltip"` + ItemErrors []GetProductDetailsResponseItemError `json:"item_errors"` + StateUpdatedAt time.Time `json:"state_updated_at"` + } `json:"status"` + Sources []struct { + IsEnabled bool `json:"is_enabled"` + SKU int64 `json:"sku"` + Source string `json:"source"` + } `json:"sources"` + Stocks struct { + Coming int32 `json:"coming"` + Present int32 `json:"present"` + Reserved int32 `json:"reserved"` + } `json:"stocks"` + UpdatedAt time.Time `json:"updated_at"` + VAT string `json:"vat"` + VisibilityDetails struct { + ActiveProduct bool `json:"active_product"` + HasPrice bool `json:"has_price"` + HasStock bool `json:"has_stock"` + } `json:"visibility_details"` + Visible bool `json:"visible"` + VolumeWeight float64 `json:"volume_weights"` + } `json:"Result"` } type GetProductDetailsResponseItemError struct { - Code string `json:"code"` - State string `json:"state"` - Level string `json:"level"` - Description string `json:"description"` - Field string `json:"field"` - AttributeId int64 `json:"attribute_id"` - AttributeName string `json:"attribute_name"` - OptionalDescriptionElements GetProductDetailsResponseOptionalDescriptionElements `json:"optional_description_elements"` -} - -type GetProductDetailsResponseOptionalDescriptionElements struct { - PropertyName string `json:"property_name"` -} - -type GetProductDetailsResponseSource struct { - IsEnabled bool `json:"is_enabled"` - SKU int64 `json:"sku"` - Source string `json:"source"` -} - -type GetProductDetailsResponseStocks struct { - Coming int32 `json:"coming"` - Present int32 `json:"present"` - Reserved int32 `json:"reserved"` -} - -type GetProductDetailsResponseDetails struct { - ActiveProduct bool `json:"active_product"` - HasPrice bool `json:"has_price"` - HasStock bool `json:"has_stock"` + Code string `json:"code"` + State string `json:"state"` + Level string `json:"level"` + Description string `json:"description"` + Field string `json:"field"` + AttributeId int64 `json:"attribute_id"` + AttributeName string `json:"attribute_name"` + OptionalDescriptionElements struct { + PropertyName string `json:"property_name"` + } `json:"optional_description_elements"` } func (c Client) GetProductDetails(params *GetProductDetailsParams) (*GetProductDetailsResponse, error) {