Files
ozon-api-client/ozon/fbo.go
2025-03-02 01:25:37 +03:00

1162 lines
30 KiB
Go

package ozon
import (
"context"
"net/http"
"time"
core "github.com/diphantxm/ozon-api-client"
)
type FBO struct {
client *core.Client
}
type GetFBOShipmentsListParams struct {
// Sorting direction
Direction Order `json:"dir,omitempty"`
// Shipment search filter
Filter GetFBOShipmentsListFilter `json:"filter"`
// Number of values in the response. Maximum is 1000, minimum is 1
Limit int64 `json:"limit"`
// Number of elements that will be skipped in the response. For example, if offset=10, the response will start with the 11th element found
Offset int64 `json:"offset,omitempty"`
// true if the address transliteration from Cyrillic to Latin is enabled
Translit bool `json:"translit,omitempty"`
// Additional fields to add to the response
With *GetFBOShipmentsListWith `json:"with,omitempty"`
}
// Shipment search filter
type GetFBOShipmentsListFilter struct {
// Period start in YYYY-MM-DD format
Since *core.TimeFormat `json:"since,omitempty"`
// Shipment status
Status string `json:"status,omitempty"`
// Period end in YYYY-MM-DD format
To *core.TimeFormat `json:"to,omitempty"`
}
// Additional fields to add to the response
type GetFBOShipmentsListWith struct {
// Specify true to add analytics data to the response
AnalyticsData bool `json:"analytics_data"`
// Specify true to add financial data to the response
FinancialData bool `json:"financial_data"`
}
type GetFBOShipmentsListResponse struct {
core.CommonResponse
// Shipments list
Result []GetFBOShipmentsListResult `json:"result"`
}
type GetFBOShipmentsListResult struct {
// Additional data for shipment list
AdditionalData []GetFBOShipmentsListResultAdditionalData `json:"additional_data"`
// Analytical data
AnalyticsData GetFBOShipmentsListResultAnalyticsData `json:"analytics_data"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
// Date and time of shipment creation
CreatedAt time.Time `json:"created_at"`
// Financial data
FinancialData FBOFinancialData `json:"financial_data"`
// Date and time of shipment processing start
InProccessAt time.Time `json:"in_process_at"`
// Identifier of the order to which the shipment belongs
OrderId int64 `json:"order_id"`
// Number of the order to which the shipment belongs
OrderNumber string `json:"order_number"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Number of products in the shipment
Products []FBOPostingProduct `json:"products"`
// Shipment status
Status string `json:"status"`
}
type GetFBOShipmentsListResultAdditionalData struct {
Key string `json:"key"`
Value string `json:"value"`
}
type GetFBOShipmentsListResultAnalyticsData struct {
// Delivery method
DeliveryType string `json:"delivery_type"`
// Indication that the recipient is a legal person
// * true — a legal person,
// * false — a natural person.
IsLegal bool `json:"is_legal"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Payment method
PaymentTypeGroupName PaymentTypeGroupName `json:"payment_type_group_name"`
// 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 {
// Activation codes for services and digital products
DigitalCodes []string `json:"digital_codes"`
// Currency of your prices. It matches the currency set in the personal account settings
CurrencyCode string `json:"currency_code"`
// Product name
Name string `json:"name"`
// Product identifier in the seller's system
OfferId string `json:"offer_id"`
// Product price
Price string `json:"price"`
// Quantity of products in the shipment
Quantity int64 `json:"quantity"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
}
type FBOFinancialData 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"`
}
// Returns a list of shipments for a specified period of time. You can additionally filter the shipments by their status
func (c FBO) GetShipmentsList(ctx context.Context, params *GetFBOShipmentsListParams) (*GetFBOShipmentsListResponse, error) {
url := "/v2/posting/fbo/list"
resp := &GetFBOShipmentsListResponse{}
response, err := c.client.Request(ctx, http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetShipmentDetailsParams struct {
// Shipment number
PostingNumber string `json:"posting_number"`
// true if the address transliteration from Cyrillic to Latin is enabled
Translit bool `json:"translit,omitempty"`
// Additional fields to add to the response
With *GetShipmentDetailsWith `json:"with,omitempty"`
}
type GetShipmentDetailsWith struct {
// Specify true to add analytics data to the response
AnalyticsData bool `json:"analytics_data"`
// Specify true to add financial data to the response
FinancialData bool `json:"financial_data"`
}
type GetShipmentDetailsResponse struct {
core.CommonResponse
// Method result
Result GetShipmentDetailsResult `json:"result"`
}
type GetShipmentDetailsResult struct {
// Additional data
AdditionalData []GetShipmentDetailsResultAdditionalData `json:"additional_data"`
// Analytical data
AnalyticsData GetShipmentDetailsResultAnalyticsData `json:"analytics_data"`
// Shipment cancellation reason identifier
CancelReasonId int64 `json:"cancel_reason_id"`
// Date and time of shipment creation
CreatedAt time.Time `json:"created_at"`
// Financial data
FinancialData FBOFinancialData `json:"financial_data"`
// Date and time of shipment processing start
InProcessAt time.Time `json:"in_process_at"`
// Identifier of the order to which the shipment belongs
OrderId int64 `json:"order_id"`
// Number of the order to which the shipment belongs
OrderNumber string `json:"order_number"`
// Shipment number
PostingNumber string `json:"posting_number"`
// Number of products in the shipment
Products []FBOPostingProduct `json:"products"`
// Shipment status
Status string `json:"status"`
}
type GetShipmentDetailsResultAdditionalData struct {
Key string `json:"key"`
Value string `json:"value"`
}
type GetShipmentDetailsResultAnalyticsData struct {
// Delivery method
DeliveryType string `json:"delivery_type"`
// Indication that the recipient is a legal person:
// - true — a legal person
// - false — a natural person
IsLegal bool `json:"is_legal"`
// Premium subscription
IsPremium bool `json:"is_premium"`
// Payment method
PaymentTypeGroupName string `json:"payment_type_group_name"`
// 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
func (c FBO) GetShipmentDetails(ctx context.Context, params *GetShipmentDetailsParams) (*GetShipmentDetailsResponse, error) {
url := "/v2/posting/fbo/get"
resp := &GetShipmentDetailsResponse{}
response, err := c.client.Request(ctx, http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type ListSupplyRequestsParams struct {
// Filter
Filter *ListSupplyRequestsFilter `json:"filter"`
// Customizing the display of the requests list
Paging *ListSupplyRequestsPaging `json:"paging"`
}
type ListSupplyRequestsFilter struct {
States []string `json:"states"`
}
type ListSupplyRequestsPaging struct {
// Supply number from which the list of requests will start
FromOrderId int64 `json:"from_supply_order_id"`
// Number of requests in the response
Limit int32 `json:"limit"`
}
type ListSupplyRequestsResponse struct {
core.CommonResponse
// Supply request identifier you last requested
LastSupplyOrderId int64 `json:"last_supply_order_id"`
// Supply request identifier
SupplyOrderId []string `json:"supply_order_id"`
}
// Requests with supply to a specific warehouse and through a virtual distribution center (vDC) are taken into account
func (c FBO) ListSupplyRequests(ctx context.Context, params *ListSupplyRequestsParams) (*ListSupplyRequestsResponse, error) {
url := "/v2/supply-order/list"
resp := &ListSupplyRequestsResponse{}
response, err := c.client.Request(ctx, http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetSupplyRequestInfoParams struct {
// Supply request identifier in the Ozon system
OrderIds []string `json:"order_ids"`
}
type GetSupplyRequestInfoResponse struct {
core.CommonResponse
// Supply request details
Orders []SupplyOrder `json:"orders"`
// Warehouse details
Warehouses []SupplyWarehouse `json:"warehouses"`
}
type SupplyOrder struct {
// Date of supply request creation
CreationDate string `json:"creation_date"`
// Request source
CreationFlow string `json:"creation_flow"`
// Time remaining in seconds to fill in the supply details. Only for requests from the vDC
DataFillingDeadline time.Time `json:"data_filling_deadline_utc"`
// Supply warehouse identifier
DropoffWarehouseId int64 `json:"dropoff_warehouse_id"`
// Filter by supply status
State string `json:"state"`
// Supply request contents
Supplies []Supply `json:"supplies"`
// Supply request identifier
Id int64 `json:"supply_order_id"`
// Request number
OrderNumber string `json:"supply_order_number"`
// Supply time slot
Timeslot []SupplyTimeslot `json:"timeslot"`
// Driver and vehicle details
Vehicle []SupplyVehicle `json:"vehicle"`
}
type Supply struct {
// Supply contents identifier. Used in the /v1/supply-order/bundle method
BundleId string `json:"bundle_id"`
// Storage warehouse identifier
StorageWarehouseId int64 `json:"storage_warehouse_id"`
// Supply identifier
Id int64 `json:"supply_id"`
}
type SupplyTimeslot struct {
// Reason why you can't select the supply time slot
Reasons []string `json:"can_not_set_reasons"`
// true, if you can select or edit the supply time slot
CanSet bool `json:"can_set"`
// true, if the characteristic is required
IsRequired bool `json:"is_required"`
Value SupplyTimeslotValue `json:"value"`
}
type SupplyVehicle struct {
// Reason why you can't select the supply time slot
Reasons []string `json:"can_not_set_reasons"`
// true, if you can select or edit the supply time slot
CanSet bool `json:"can_set"`
// true, if the characteristic is required
IsRequired bool `json:"is_required"`
Value []GetSupplyRequestInfoVehicle `json:"value"`
}
type SupplyTimeslotValue struct {
// Supply time slot in local time
Timeslot []SupplyTimeslotValueTimeslot `json:"timeslot"`
// Time zone
Timezone []SupplyTimeslotValueTimezone `json:"timezone_info"`
}
type SupplyTimeslotValueTimeslot struct {
// Supply time slot start
From time.Time `json:"from"`
// Supply time slot end
To time.Time `json:"to"`
}
type SupplyTimeslotValueTimezone struct {
// Time zone name
Name string `json:"iana_name"`
// Time zone offset from UTC-0 in seconds
Offset string `json:"offset"`
}
type GetSupplyRequestInfoVehicle struct {
// Driver name
DriverName string `json:"driver_name"`
// Driver phone number
DriverPhone string `json:"driver_phone"`
// Car model
VehicleModel string `json:"vehicle_model"`
// Car number
VehicleNumber string `json:"vehicle_number"`
}
type SupplyWarehouse struct {
// Warehouse address
Address string `json:"address"`
// Warehouse name
Name string `json:"name"`
// Warehouse identifier
Id int64 `json:"warehouse_id"`
}
// Method for getting detailed information on a supply request.
// Requests with supply both to a specific warehouse and via a
// virtual distribution center (vDC) are taken into account
func (c FBO) GetSupplyRequestInfo(ctx context.Context, params *GetSupplyRequestInfoParams) (*GetSupplyRequestInfoResponse, error) {
url := "/v2/supply-order/get"
resp := &GetSupplyRequestInfoResponse{}
response, err := c.client.Request(ctx, http.MethodPost, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetWarehouseWorkloadResponse struct {
core.CommonResponse
// Method result
Result []GetWarehouseWorkloadResult `json:"result"`
}
type GetWarehouseWorkloadResult struct {
// Workload
Schedule GetWarehouseWorkloadResultSchedule `json:"schedule"`
// Warehouse
Warehouse GetWarehouseWorkloadResultWarehouse `json:"warehouse"`
}
type GetWarehouseWorkloadResultSchedule struct {
// Data on the products quantity supplied to the warehouse
Capacity []GetWarehouseWorkloadResultScheduleCapacity `json:"capacity"`
// The closest available date for supply, local time
Date time.Time `json:"date"`
}
type GetWarehouseWorkloadResultScheduleCapacity struct {
// Period start, local time
Start time.Time `json:"start"`
// Period end, local time
End time.Time `json:"end"`
// Average number of products that the warehouse can accept per day for the period
Value int32 `json:"value"`
}
type GetWarehouseWorkloadResultWarehouse struct {
// Warehouse identifier
Id string `json:"id"`
// Warehouse name
Name string `json:"name"`
}
// Method returns a list of active Ozon warehouses with information about their average workload in the nearest future
func (c FBO) GetWarehouseWorkload(ctx context.Context) (*GetWarehouseWorkloadResponse, error) {
url := "/v1/supplier/available_warehouses"
resp := &GetWarehouseWorkloadResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, nil, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetSupplyOrdersByStatusParams struct {
}
type GetSupplyOrdersByStatusResponse struct {
core.CommonResponse
Items []SupplyOrdersByStatus `json:"items"`
}
type SupplyOrdersByStatus struct {
// Number of supply requests in this status
Count int32 `json:"count"`
// Supply status
OrderState string `json:"order_state"`
}
// Returns the number of supply requests in a specific status.
func (c FBO) GetSupplyOrdersByStatus(ctx context.Context) (*GetSupplyOrdersByStatusResponse, error) {
url := "/v1/supply-order/status/counter"
resp := &GetSupplyOrdersByStatusResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, &GetSupplyOrdersByStatusParams{}, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetSupplyTimeslotsParams struct {
// Supply request identifier
SupplyOrderId int64 `json:"supply_order_id"`
}
type GetSupplyTimeslotsResponse struct {
core.CommonResponse
// Supply time slot
Timeslots []SupplyTimeslotValueTimeslot `json:"timeslots"`
// Time zone
Timezones []SupplyTimeslotValueTimezone `json:"timezone"`
}
func (c FBO) GetSupplyTimeslots(ctx context.Context, params *GetSupplyTimeslotsParams) (*GetSupplyTimeslotsResponse, error) {
url := "/v1/supply-order/timeslot/get"
resp := &GetSupplyTimeslotsResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type UpdateSupplyTimeslotParams struct {
// Supply request identifier
SupplyOrderId int64 `json:"supply_order_id"`
// Supply time slot details
Timeslot SupplyTimeslotValueTimeslot `json:"timeslot"`
}
type UpdateSupplyTimeslotResponse struct {
core.CommonResponse
// Possible errors
Errors []string `json:"errors"`
// Operation identifier
OperationId string `json:"operation_id"`
}
func (c FBO) UpdateSupplyTimeslot(ctx context.Context, params *UpdateSupplyTimeslotParams) (*UpdateSupplyTimeslotResponse, error) {
url := "/v1/supply-order/timeslot/update"
resp := &UpdateSupplyTimeslotResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetSupplyTimeslotStatusParams struct {
// Operation identifier
OperationId string `json:"operation_id"`
}
type GetSupplyTimeslotStatusResponse struct {
core.CommonResponse
// Possible errors
Errors []string `json:"errors"`
// Data status
Status string `json:"status"`
}
func (c FBO) GetSupplyTimeslotStatus(ctx context.Context, params *GetSupplyTimeslotStatusParams) (*GetSupplyTimeslotStatusResponse, error) {
url := "/v1/supply-order/timeslot/status"
resp := &GetSupplyTimeslotStatusResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type CreatePassParams struct {
// Supply request identifier
SupplyOrderId int64 `json:"supply_order_id"`
// Driver and car information
Vehicle GetSupplyRequestInfoVehicle `json:"vehicle"`
}
type CreatePassResponse struct {
core.CommonResponse
// Possible errors
Errors []string `json:"error_reasons"`
// Operation identifier
OperationId string `json:"operation_id"`
}
func (c FBO) CreatePass(ctx context.Context, params *CreatePassParams) (*CreatePassResponse, error) {
url := "/v1/supply-order/pass/create"
resp := &CreatePassResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetPassParams struct {
// Operation identifier
OperationId string `json:"operation_id"`
}
type GetPassResponse struct {
core.CommonResponse
// Possible errors
Errors []string `json:"errors"`
// Status of driver and vehicle data entry
Result string `json:"result"`
}
func (c FBO) GetPass(ctx context.Context, params *GetPassParams) (*GetPassResponse, error) {
url := "/v1/supply-order/pass/status"
resp := &GetPassResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetSupplyContentParams struct {
// Identifiers of supply contents. You can get them using the /v2/supply-order/get method.
BundleIds []string `json:"bundle_ids"`
// true, to sort in ascending order
IsAsc bool `json:"is_asc"`
// Identifier of the last SKU value on the page.
LastId string `json:"last_id"`
// Number of products on the page.
Limit int32 `json:"limit"`
// Search query, for example: by name, article code, or SKU
Query string `json:"query"`
// Sorting by parameters
SortField string `json:"sort_field"`
}
type GetSupplyContentResponse struct {
core.CommonResponse
// List of products in the supply request
Items []SupplyContentItem `json:"items"`
// Quantity of products in the request
TotalCount int32 `json:"total_count"`
// Indication that the response hasn't returned all products
HasNext bool `json:"has_next"`
// Identifier of the last value on the page
LastId string `json:"last_id"`
}
type SupplyContentItem struct {
// Link to product image
IconPath string `json:"icon_path"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
// Product name
Name string `json:"name"`
// Product items quantity
Quantity int32 `json:"quantity"`
// Barcode
Barcode string `json:"barcode"`
// Product identifier
ProductId int64 `json:"product_id"`
// Quantity of products in one package
Quant int32 `json:"quant"`
// true if the quantity of products in one package can be edited
IsQuantEditable bool `json:"is_quant_editable"`
// Volume of products in liters
VolumeInLiters float64 `json:"volume_in_litres"`
// Volume of all products in liters
TotalVolumeInLiters float64 `json:"total_volume_in_litres"`
// Product article code
ContractorItemCode string `json:"contractor_item_code"`
// Super product label
SFBOAttribute string `json:"sfbo_attribute"`
// Type of wrapper
ShipmentType string `json:"shipment_type"`
}
func (c FBO) GetSupplyContent(ctx context.Context, params *GetSupplyContentParams) (*GetSupplyContentResponse, error) {
url := "/v1/supply-order/bundle"
resp := &GetSupplyContentResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type CreateSupplyDraftParams struct {
// Clusters identifiers
ClusterIds []string `json:"cluster_ids"`
// Shipping point identifier: pick-up point or sorting center. Only for the type = CREATE_TYPE_CROSSDOCK supply type.
DropoffWarehouseId int64 `json:"drop_off_point_warehouse_id"`
// Products
Items []CreateSupplyDraftItem `json:"items"`
// Supply type
Type string `json:"type"`
}
type CreateSupplyDraftItem struct {
// Product quantity
Quantity int32 `json:"quantity"`
// Product identifier
SKU int64 `json:"sku"`
}
type CreateSupplyDraftResponse struct {
core.CommonResponse
// Identifier of the supply request draft
OperationId string `json:"operation_id"`
}
// Create a direct or cross-docking supply request draft and specify the products to supply.
//
// You can leave feedback on this method in the comments section to the discussion in the Ozon for dev community
func (c FBO) CreateSupplyDraft(ctx context.Context, params *CreateSupplyDraftParams) (*CreateSupplyDraftResponse, error) {
url := "/v1/draft/create"
resp := &CreateSupplyDraftResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetSupplyDraftInfoParams struct {
// Identifier of the supply request draft
OperationId string `json:"operation_id"`
}
type GetSupplyDraftInfoResponse struct {
core.CommonResponse
// Clusters
Clusters []SupplyDraftCluster `json:"clusters"`
// Identifier of the supply request draft
DraftId int64 `json:"draft_id"`
// Errors
Errors []GetSupplyDraftInfoError `json:"errors"`
// Creation status of the supply request draft
Status string `json:"status"`
}
type SupplyDraftCluster struct {
// Cluster identifier
Id int64 `json:"cluster_id"`
// Cluster name
Name string `json:"cluster_name"`
// Warehouses
Warehouses []SupplyDraftWarehouse `json:"warehouses"`
}
type SupplyDraftWarehouse struct {
// Warehouse address
Address string `json:"address"`
// Product list bundle
BundleIds []SupplyDraftWarehouseBundle `json:"bundle_ids"`
// Warehouse name
Name string `json:"name"`
// Bundle of products that don't come in a shipment. Use the parameter in the /v1/supply-order/bundle method to get details.
RestrictedBundleId string `json:"restricted_bundle_id"`
// Warehouse availability
Status SupplyDraftWarehouseStatus `json:"status"`
// Supply warehouses
SupplyWarehouse SupplyWarehouse `json:"supply_warehouse"`
// Warehouse rank in the cluster
TotalRank int32 `json:"total_rank"`
// Warehouse rating
TotalScore float64 `json:"total_score"`
// Estimated delivery time
//
// Nullable
TravelTimeDays *int64 `json:"travel_time_days"`
// Warehouse identifier
Id int64 `json:"warehouse_id"`
}
type SupplyDraftWarehouseBundle struct {
// Bundle identifier. Use the parameter in the /v1/supply-order/bundle method to get details
Id string `json:"bundle_id"`
// Indicates that the UTD is to be passed
IsDocless bool `json:"is_docless"`
}
type SupplyDraftWarehouseStatus struct {
// Reason why the warehouse isn't available
InvalidReason string `json:"invalid_reason"`
// Warehouse availability
IsAvailable bool `json:"is_available"`
// Warehouse status
State string `json:"state"`
}
type GetSupplyDraftInfoError struct {
// Possible errors
Message string `json:"error_message"`
// Validation errors
ItemsValidation []GetSupplyDraftInfoValidationError `json:"items_validation"`
// Unknown clusters identifiers
UnknownClusterIds []string `json:"unknown_cluster_ids"`
}
type GetSupplyDraftInfoValidationError struct {
// Error reasons
Reasons []string `json:"reasons"`
// Product identifier in the Ozon system, SKU
SKU int64 `json:"sku"`
}
func (c FBO) GetSupplyDraftInfo(ctx context.Context, params *GetSupplyDraftInfoParams) (*GetSupplyDraftInfoResponse, error) {
url := "/v1/draft/create/info"
resp := &GetSupplyDraftInfoResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type CreateSupplyFromDraftParams struct {
// Identifier of the supply request draft
DraftId int64 `json:"draft_id"`
// Supply time slot
Timeslot CreateSupplyFromDraftTimeslot `json:"timeslot"`
// Shipping warehouse identifier
WarehouseId int64 `json:"warehouse_id"`
}
type CreateSupplyFromDraftTimeslot struct {
// Supply time slot start date
FromInTimezone time.Time `json:"from_in_timezone"`
// Supply time slot end date
ToInTimezone time.Time `json:"to_in_timezone"`
}
type CreateSupplyFromDraftResponse struct {
core.CommonResponse
// Supply request identifier
OperationId string `json:"operation_id"`
}
func (c FBO) CreateSupplyFromDraft(ctx context.Context, params *CreateSupplyFromDraftParams) (*CreateSupplyFromDraftResponse, error) {
url := "/v1/draft/supply/create"
resp := &CreateSupplyFromDraftResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type GetDraftTimeslotsParams struct {
// Start date of the available supply time slots period
DateFrom time.Time `json:"date_from"`
// End date of the available supply time slots period
//
// The maximum period is 28 days from the current date
DateTo time.Time `json:"date_to"`
// Identifier of the supply request draft
DraftId int64 `json:"draft_id"`
// The warehouses identifiers for which supply time slots are required
WarehouseIds []string `json:"warehouse_ids"`
}
type GetDraftTimeslotsResponse struct {
core.CommonResponse
// Warehouses supply time slots
DropoffWarehouseTimeslots []DraftTimeslot `json:"drop_off_warehouse_timeslots"`
// Start date of the necessary period
RequestedDateFrom time.Time `json:"requested_date_from"`
// End date of the necessary period
RequestedDateTo time.Time `json:"requested_date_to"`
}
type DraftTimeslot struct {
// Current time in the warehouse time zone
CurrentTimeInTimezone time.Time `json:"current_time_in_timezone"`
// Supply time slots by dates
Days []DraftTimeslotDay `json:"days"`
// Warehouse identifier
DropoffWarehouseId int64 `json:"drop_off_warehouse_id"`
// Warehouse time zone
WarehouseTimezone string `json:"warehouse_timezone"`
}
type DraftTimeslotDay struct {
// Supply time slots date
DateInTimezone time.Time `json:"date_in_timezone"`
// Supply time slots details
Timeslots []DraftTimeslotDayTimeslot `json:"timeslots"`
}
type DraftTimeslotDayTimeslot struct {
// Supply time slot start date
FromInTimezone time.Time `json:"from_in_timezone"`
// Supply time slot end date
ToInTimezone time.Time `json:"to_in_timezone"`
}
// Available supply time slots at final shipping warehouses
func (c FBO) GetDraftTimeslots(ctx context.Context, params *GetDraftTimeslotsParams) (*GetDraftTimeslotsResponse, error) {
url := "/v1/draft/timeslot/info"
resp := &GetDraftTimeslotsResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type CancelSuppyOrderParams struct {
// Supply request identifier
OrderId int64 `json:"order_id"`
}
type CancelSuppyOrderResponse struct {
core.CommonResponse
// Operation identifier for canceling the request
OperationId string `json:"operation_id"`
}
// Cancel supply request
func (c FBO) CancelSuppyOrder(ctx context.Context, params *CancelSuppyOrderParams) (*CancelSuppyOrderResponse, error) {
url := "/v1/supply-order/cancel"
resp := &CancelSuppyOrderResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}
type StatusCancelledSupplyOrderParams struct {
// Operation identifier for canceling the supply request
OperationId string `json:"operation_id"`
}
type StatusCancelledSupplyOrderResponse struct {
core.CommonResponse
// Reason why the supply request can't be canceled
ErrorReasons []string `json:"error_reasons"`
// Details on supply request cancellation
Result StatusCancelledSupplyOrderResult `json:"result"`
// Cancellation status of the supply request
Status string `json:"status"`
}
type StatusCancelledSupplyOrderResult struct {
// true, if supply request is canceled
IsOrderCancelled bool `json:"is_order_cancelled"`
// List of canceled supplies
Supplies []StatusCancelledSupplyOrderSupply `json:"supplies"`
}
type StatusCancelledSupplyOrderSupply struct {
// Reason why supplies can't be canceled
ErrorReasons []string `json:"error_reasons"`
// true, if supply is canceled
IsSupplyCancelled bool `json:"is_supply_cancelled"`
// Supply identifier
SupplyId int64 `json:"supply_id"`
}
// Get status of canceled supply request
func (c FBO) StatusCancelledSupplyOrder(ctx context.Context, params *StatusCancelledSupplyOrderParams) (*StatusCancelledSupplyOrderResponse, error) {
url := "/v1/supply-order/cancel/status"
resp := &StatusCancelledSupplyOrderResponse{}
response, err := c.client.Request(ctx, http.MethodGet, url, params, resp, nil)
if err != nil {
return nil, err
}
response.CopyCommonResponse(&resp.CommonResponse)
return resp, nil
}