go-wiki/vendor/github.com/stripe/stripe-go/order.go
2020-03-20 00:19:27 +01:00

272 lines
9.5 KiB
Go

package stripe
import (
"encoding/json"
)
// OrderStatus represents the statuses of an order object.
type OrderStatus string
// List of values that OrderStatus can take.
const (
OrderStatusCanceled OrderStatus = "canceled"
OrderStatusCreated OrderStatus = "created"
OrderStatusFulfilled OrderStatus = "fulfilled"
OrderStatusPaid OrderStatus = "paid"
OrderStatusReturned OrderStatus = "returned"
)
// OrderDeliveryEstimateType represents the type of delivery estimate for shipping methods
type OrderDeliveryEstimateType string
// List of values that OrderDeliveryEstimateType can take.
const (
OrderDeliveryEstimateTypeExact OrderDeliveryEstimateType = "exact"
OrderDeliveryEstimateTypeRange OrderDeliveryEstimateType = "range"
)
// OrderItemType represents the type of order item
type OrderItemType string
// List of values that OrderItemType can take.
const (
OrderItemTypeCoupon OrderItemType = "coupon"
OrderItemTypeDiscount OrderItemType = "discount"
OrderItemTypeSKU OrderItemType = "sku"
OrderItemTypeShipping OrderItemType = "shipping"
OrderItemTypeTax OrderItemType = "tax"
)
// OrderItemParentType represents the type of order item parent
type OrderItemParentType string
// List of values that OrderItemParentType can take.
const (
OrderItemParentTypeCoupon OrderItemParentType = "coupon"
OrderItemParentTypeDiscount OrderItemParentType = "discount"
OrderItemParentTypeSKU OrderItemParentType = "sku"
OrderItemParentTypeShipping OrderItemParentType = "shipping"
OrderItemParentTypeTax OrderItemParentType = "tax"
)
// OrderItemParent describes the parent of an order item.
type OrderItemParent struct {
ID string `json:"id"`
SKU *SKU `json:"-"`
Type OrderItemParentType `json:"object"`
}
// OrderParams is the set of parameters that can be used when creating an order.
type OrderParams struct {
Params `form:"*"`
Coupon *string `form:"coupon"`
Currency *string `form:"currency"`
Customer *string `form:"customer"`
Email *string `form:"email"`
Items []*OrderItemParams `form:"items"`
Shipping *ShippingParams `form:"shipping"`
}
// ShippingParams is the set of parameters that can be used for the shipping hash
// on order creation.
type ShippingParams struct {
Address *AddressParams `form:"address"`
Name *string `form:"name"`
Phone *string `form:"phone"`
}
// OrderUpdateParams is the set of parameters that can be used when updating an order.
type OrderUpdateParams struct {
Params `form:"*"`
Coupon *string `form:"coupon"`
SelectedShippingMethod *string `form:"selected_shipping_method"`
Shipping *OrderUpdateShippingParams `form:"shipping"`
Status *string `form:"status"`
}
// OrderUpdateShippingParams is the set of parameters that can be used for the shipping
// hash on order update.
type OrderUpdateShippingParams struct {
Carrier *string `form:"carrier"`
TrackingNumber *string `form:"tracking_number"`
}
// Shipping describes the shipping hash on an order.
type Shipping struct {
Address *Address `json:"address"`
Carrier string `json:"carrier"`
Name string `json:"name"`
Phone string `json:"phone"`
TrackingNumber string `json:"tracking_number"`
}
// ShippingMethod describes a shipping method as available on an order.
type ShippingMethod struct {
Amount int64 `json:"amount"`
ID string `json:"id"`
Currency Currency `json:"currency"`
DeliveryEstimate *DeliveryEstimate `json:"delivery_estimate"`
Description string `json:"description"`
}
// DeliveryEstimate represent the properties available for a shipping method's
// estimated delivery.
type DeliveryEstimate struct {
// If Type == Exact
Date string `json:"date"`
// If Type == Range
Earliest string `json:"earliest"`
Latest string `json:"latest"`
Type OrderDeliveryEstimateType `json:"type"`
}
// Order is the resource representing a Stripe charge.
// For more details see https://stripe.com/docs/api#orders.
type Order struct {
Amount int64 `json:"amount"`
AmountReturned int64 `json:"amount_returned"`
Application string `json:"application"`
ApplicationFee int64 `json:"application_fee"`
Charge *Charge `json:"charge"`
Created int64 `json:"created"`
Currency Currency `json:"currency"`
Customer Customer `json:"customer"`
Email string `json:"email"`
ID string `json:"id"`
Items []*OrderItem `json:"items"`
Livemode bool `json:"livemode"`
Metadata map[string]string `json:"metadata"`
Returns *OrderReturnList `json:"returns"`
SelectedShippingMethod *string `json:"selected_shipping_method"`
Shipping *Shipping `json:"shipping"`
ShippingMethods []*ShippingMethod `json:"shipping_methods"`
Status string `json:"status"`
StatusTransitions StatusTransitions `json:"status_transitions"`
Updated int64 `json:"updated"`
UpstreamID string `json:"upstream_id"`
}
// OrderList is a list of orders as retrieved from a list endpoint.
type OrderList struct {
ListMeta
Data []*Order `json:"data"`
}
// OrderListParams is the set of parameters that can be used when listing orders.
type OrderListParams struct {
ListParams `form:"*"`
Created *int64 `form:"created"`
CreatedRange *RangeQueryParams `form:"created"`
Customer *string `form:"customer"`
IDs []*string `form:"ids"`
Status *string `form:"status"`
StatusTransitions *StatusTransitionsFilterParams `form:"status_transitions"`
UpstreamIDs []*string `form:"upstream_ids"`
}
// StatusTransitionsFilterParams are parameters that can used to filter on status_transition when listing orders.
type StatusTransitionsFilterParams struct {
Canceled *int64 `form:"canceled"`
CanceledRange *RangeQueryParams `form:"canceled"`
Fulfilled *int64 `form:"fulfilled"`
FulfilledRange *RangeQueryParams `form:"fulfilled"`
Paid *int64 `form:"paid"`
PaidRange *RangeQueryParams `form:"paid"`
Returned *int64 `form:"returned"`
ReturnedRange *RangeQueryParams `form:"returned"`
}
// StatusTransitions are the timestamps at which the order status was updated.
type StatusTransitions struct {
Canceled int64 `json:"canceled"`
Fulfilled int64 `json:"fulfilled"`
Paid int64 `json:"paid"`
Returned int64 `json:"returned"`
}
// OrderPayParams is the set of parameters that can be used when paying orders.
type OrderPayParams struct {
Params `form:"*"`
ApplicationFee *int64 `form:"application_fee"`
Customer *string `form:"customer"`
Email *string `form:"email"`
Source *SourceParams `form:"*"` // SourceParams has custom encoding so brought to top level with "*"
}
// OrderItemParams is the set of parameters describing an order item on order creation or update.
type OrderItemParams struct {
Amount *int64 `form:"amount"`
Currency *string `form:"currency"`
Description *string `form:"description"`
Parent *string `form:"parent"`
Quantity *int64 `form:"quantity"`
Type *string `form:"type"`
}
// OrderItem is the resource representing an order item.
type OrderItem struct {
Amount int64 `json:"amount"`
Currency Currency `json:"currency"`
Description string `json:"description"`
Parent *OrderItemParent `json:"parent"`
Quantity int64 `json:"quantity"`
Type OrderItemType `json:"type"`
}
// SetSource adds valid sources to a OrderParams object,
// returning an error for unsupported sources.
func (op *OrderPayParams) SetSource(sp interface{}) error {
source, err := SourceParamsFor(sp)
op.Source = source
return err
}
// UnmarshalJSON handles deserialization of an OrderItemParent.
// This custom unmarshaling is needed because the resulting
// property may be an id or a full SKU struct if it was expanded.
func (p *OrderItemParent) UnmarshalJSON(data []byte) error {
if id, ok := ParseID(data); ok {
p.ID = id
return nil
}
type orderItemParent OrderItemParent
var v orderItemParent
if err := json.Unmarshal(data, &v); err != nil {
return err
}
var err error
*p = OrderItemParent(v)
switch p.Type {
case OrderItemParentTypeSKU:
// Currently only SKUs `parent` is returned as an object when expanded.
// For other items only IDs are returned.
if err = json.Unmarshal(data, &p.SKU); err != nil {
return err
}
p.ID = p.SKU.ID
}
return nil
}
// UnmarshalJSON handles deserialization of an Order.
// This custom unmarshaling is needed because the resulting
// property may be an id or the full struct if it was expanded.
func (o *Order) UnmarshalJSON(data []byte) error {
if id, ok := ParseID(data); ok {
o.ID = id
return nil
}
type order Order
var v order
if err := json.Unmarshal(data, &v); err != nil {
return err
}
*o = Order(v)
return nil
}