-
Notifications
You must be signed in to change notification settings - Fork 455
/
order.go
272 lines (238 loc) · 9.49 KB
/
order.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
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
}