expressly 2.0.32.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +51 -0
- data/.rspec +1 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +65 -0
- data/Guardfile +8 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +5 -0
- data/Rakefile +2 -0
- data/app/controllers/expressly/api_controller.rb +79 -0
- data/config/routes.rb +11 -0
- data/expressly.gemspec +29 -0
- data/lib/expressly.rb +49 -0
- data/lib/expressly/api.rb +126 -0
- data/lib/expressly/domain.rb +480 -0
- data/lib/expressly/engine.rb +3 -0
- data/lib/expressly/plugin_provider.rb +60 -0
- data/lib/expressly/util.rb +98 -0
- data/lib/expressly/version.rb +10 -0
- data/spec/expressly/domain_spec.rb +597 -0
- data/spec/expressly_spec.rb +11 -0
- data/spec/spec_helper.rb +13 -0
- metadata +125 -0
@@ -0,0 +1,480 @@
|
|
1
|
+
module Expressly
|
2
|
+
class CustomerImport
|
3
|
+
attr_accessor :metadata, :primary_email, :customer, :cart
|
4
|
+
def initialize(attribute_value_map = {})
|
5
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
6
|
+
self.freeze
|
7
|
+
end
|
8
|
+
|
9
|
+
def ==(object)
|
10
|
+
ObjectHelper.equals(self,object)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.from_json(json)
|
14
|
+
CustomerImport.new({
|
15
|
+
:metadata => json['migration']['meta'],
|
16
|
+
:primary_email => json['migration']['data']['email'],
|
17
|
+
:customer => Customer.from_json(json['migration']['data']['customerData']),
|
18
|
+
:cart => Cart.from_json(json['cart'])})
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class CustomerExport
|
23
|
+
attr_accessor :metadata, :primary_email, :customer
|
24
|
+
|
25
|
+
def initialize(attribute_value_map = {})
|
26
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
27
|
+
self.freeze
|
28
|
+
end
|
29
|
+
|
30
|
+
def ==(object)
|
31
|
+
ObjectHelper.equals(self,object)
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_json(state = nil)
|
35
|
+
JSON.generate({
|
36
|
+
:meta => @metadata,
|
37
|
+
:data => {
|
38
|
+
:email => @primary_email,
|
39
|
+
:customerData => customer
|
40
|
+
}
|
41
|
+
})
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Cart
|
46
|
+
attr_accessor :coupon_code, :product_id
|
47
|
+
def initialize(attribute_value_map = {})
|
48
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
49
|
+
self.freeze
|
50
|
+
end
|
51
|
+
|
52
|
+
def ==(object)
|
53
|
+
ObjectHelper.equals(self,object)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.from_json(json)
|
57
|
+
if json.nil? then return nil end
|
58
|
+
Cart.new({
|
59
|
+
:coupon_code => json['couponCode'],
|
60
|
+
:product_id => json['productId']})
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class Customer
|
65
|
+
include Expressly::Helper
|
66
|
+
attr_accessor :first_name, :last_name, :gender, :billing_address_index, :shipping_address_index,
|
67
|
+
:company_name, :date_of_birth, :tax_number, :last_updated,
|
68
|
+
:online_identity_list, :phone_list, :email_list, :address_list,
|
69
|
+
:last_order_date, :number_of_orders
|
70
|
+
def initialize(attribute_value_map = {})
|
71
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
72
|
+
self.freeze
|
73
|
+
end
|
74
|
+
|
75
|
+
def gender=(gender)
|
76
|
+
Gender::assertValidValue(gender)
|
77
|
+
@gender = gender
|
78
|
+
end
|
79
|
+
|
80
|
+
def date_of_birth=(date_of_birth)
|
81
|
+
if blank?(date_of_birth) then return end
|
82
|
+
@date_of_birth = if date_of_birth.is_a? Date then date_of_birth else Date.parse(date_of_birth) end
|
83
|
+
end
|
84
|
+
|
85
|
+
def last_updated=(last_updated)
|
86
|
+
if blank?(last_updated) then return end
|
87
|
+
@last_updated = if last_updated.is_a? DateTime then last_updated else DateTime.parse(last_updated) end
|
88
|
+
end
|
89
|
+
|
90
|
+
def last_order_date=(last_order_date)
|
91
|
+
if blank?(last_order_date) then return end
|
92
|
+
@last_order_date = if last_order_date.is_a? Date then last_order_date else Date.parse(last_order_date) end
|
93
|
+
end
|
94
|
+
|
95
|
+
def ==(object)
|
96
|
+
ObjectHelper.equals(self,object)
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.from_json(json)
|
100
|
+
Customer.new({
|
101
|
+
:first_name => json['firstName'],
|
102
|
+
:last_name => json['lastName'],
|
103
|
+
:gender => json['gender'],
|
104
|
+
:billing_address_index => json['billingAddress'].to_i,
|
105
|
+
:shipping_address_index => json['shippingAddress'].to_i,
|
106
|
+
:company_name => json['company'],
|
107
|
+
:date_of_birth => safe_date_parse(json['dob']),
|
108
|
+
:tax_number => json['taxNumber'],
|
109
|
+
:last_updated => safe_datetime_parse(json['dateUpdated']),
|
110
|
+
|
111
|
+
:online_identity_list => OnlineIdentity.from_json_list(json['onlinePresence']),
|
112
|
+
:phone_list => Phone.from_json_list(json['phones']),
|
113
|
+
:email_list => EmailAddress.from_json_list(json['emails']),
|
114
|
+
:address_list => Address.from_json_list(json['addresses']),
|
115
|
+
|
116
|
+
:last_order_date => safe_date_parse(json['dateLastOrder']),
|
117
|
+
:number_of_orders => json['numberOrdered'].to_i
|
118
|
+
})
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.safe_date_parse(date)
|
122
|
+
date.nil? ? nil : Date.parse(date)
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.safe_datetime_parse(datetime)
|
126
|
+
datetime.nil? ? nil : DateTime.parse(datetime)
|
127
|
+
end
|
128
|
+
|
129
|
+
def to_json(state = nil)
|
130
|
+
JSON.generate({
|
131
|
+
:firstName => @first_name,
|
132
|
+
:lastName => @last_name,
|
133
|
+
:gender => @gender,
|
134
|
+
:billingAddress => @billing_address_index,
|
135
|
+
:shippingAddress => @shipping_address_index,
|
136
|
+
:company => @company_name,
|
137
|
+
:dob => @date_of_birth,
|
138
|
+
:taxNumber => @tax_number,
|
139
|
+
:onlinePresence => @online_identity_list,
|
140
|
+
:dateUpdated => @last_updated,
|
141
|
+
:dateLastOrder => @last_order_date,
|
142
|
+
:numberOrdered => @number_of_orders,
|
143
|
+
:emails => @email_list,
|
144
|
+
:phones => @phone_list,
|
145
|
+
:addresses => @address_list
|
146
|
+
})
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
class Address
|
151
|
+
include Expressly::Helper
|
152
|
+
|
153
|
+
attr_accessor :first_name, :last_name, :address_1, :address_2, :city,
|
154
|
+
:company_name, :zip, :phone_index, :address_alias, :state_province, :country
|
155
|
+
def initialize(attribute_value_map = {})
|
156
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
157
|
+
self.freeze
|
158
|
+
end
|
159
|
+
|
160
|
+
def phone_index=(phone_index)
|
161
|
+
if !blank?(phone_index) && !phone_index.is_a?(Integer) then
|
162
|
+
throw("phone_index should be an integer [#{phone_index}]")
|
163
|
+
end
|
164
|
+
@phone_index = phone_index
|
165
|
+
end
|
166
|
+
|
167
|
+
def ==(object)
|
168
|
+
ObjectHelper.equals(self,object)
|
169
|
+
end
|
170
|
+
|
171
|
+
def self.from_json(json)
|
172
|
+
Address.new({
|
173
|
+
:first_name => json['firstName'],
|
174
|
+
:last_name => json['lastName'],
|
175
|
+
:address_1 => json['address1'],
|
176
|
+
:address_2 => json['address2'],
|
177
|
+
:city => json['city'],
|
178
|
+
:company_name => json['companyName'],
|
179
|
+
:zip => json['zip'],
|
180
|
+
:phone_index => json['phone'],
|
181
|
+
:address_alias => json['alias'],
|
182
|
+
:state_province => json['stateProvince'],
|
183
|
+
:country => json['country']
|
184
|
+
})
|
185
|
+
end
|
186
|
+
|
187
|
+
def self.from_json_list(json)
|
188
|
+
if json.nil? then return [] end
|
189
|
+
|
190
|
+
list = []
|
191
|
+
json.each do |entity|
|
192
|
+
list << Address.from_json(entity)
|
193
|
+
end
|
194
|
+
return list
|
195
|
+
end
|
196
|
+
|
197
|
+
def to_json(state = nil)
|
198
|
+
JSON.generate({
|
199
|
+
:firstName => @first_name,
|
200
|
+
:lastName => @last_name,
|
201
|
+
:address1 => @address_1,
|
202
|
+
:address2 => @address_2,
|
203
|
+
:city => @city,
|
204
|
+
:companyName => @company_name,
|
205
|
+
:zip => @zip,
|
206
|
+
:phone => @phone_index,
|
207
|
+
:alias => @address_alias,
|
208
|
+
:stateProvince => @state_province,
|
209
|
+
:country => @country
|
210
|
+
})
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
class Phone
|
215
|
+
include Expressly::Helper
|
216
|
+
attr_accessor :type, :number, :country_code
|
217
|
+
def initialize(attribute_value_map = {})
|
218
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
219
|
+
self.freeze
|
220
|
+
end
|
221
|
+
|
222
|
+
def type=(type)
|
223
|
+
PhoneType::assertValidValue(type)
|
224
|
+
@type = type
|
225
|
+
end
|
226
|
+
|
227
|
+
def country_code=(country_code)
|
228
|
+
if !blank?(country_code) && !country_code.is_a?(Integer) then
|
229
|
+
throw("country_code should be an integer [#{country_code}]")
|
230
|
+
end
|
231
|
+
@country_code = country_code
|
232
|
+
end
|
233
|
+
|
234
|
+
def ==(object)
|
235
|
+
ObjectHelper.equals(self,object)
|
236
|
+
end
|
237
|
+
|
238
|
+
def self.from_json(json)
|
239
|
+
Phone.new({
|
240
|
+
:type => json['type'],
|
241
|
+
:number => json['number'],
|
242
|
+
:country_code => json['countryCode'].to_i
|
243
|
+
})
|
244
|
+
end
|
245
|
+
|
246
|
+
def self.from_json_list(json)
|
247
|
+
if json.nil? then return [] end
|
248
|
+
|
249
|
+
list = []
|
250
|
+
json.each do |entity|
|
251
|
+
list << Phone.from_json(entity)
|
252
|
+
end
|
253
|
+
return list
|
254
|
+
end
|
255
|
+
|
256
|
+
def to_json(state = nil)
|
257
|
+
JSON.generate({
|
258
|
+
:type => @type.to_s,
|
259
|
+
:number => @number,
|
260
|
+
:countryCode => @country_code
|
261
|
+
})
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
class PhoneType < Enumeration
|
266
|
+
self.add_item(:Mobile, "M")
|
267
|
+
self.add_item(:Home, "H")
|
268
|
+
self.add_item(:Work, "W")
|
269
|
+
self.add_item(:Landline, "L")
|
270
|
+
self.add_item(:Personal, "P")
|
271
|
+
end
|
272
|
+
|
273
|
+
class EmailAddress
|
274
|
+
attr_accessor :email, :alias
|
275
|
+
def initialize(attribute_value_map = {})
|
276
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
277
|
+
self.freeze
|
278
|
+
end
|
279
|
+
|
280
|
+
def ==(object)
|
281
|
+
ObjectHelper.equals(self,object)
|
282
|
+
end
|
283
|
+
|
284
|
+
def self.from_json(json)
|
285
|
+
EmailAddress.new({
|
286
|
+
:email => json['email'],
|
287
|
+
:alias => json['alias']
|
288
|
+
})
|
289
|
+
end
|
290
|
+
|
291
|
+
def self.from_json_list(json)
|
292
|
+
if json.nil? then return [] end
|
293
|
+
|
294
|
+
list = []
|
295
|
+
json.each do |entity|
|
296
|
+
list << EmailAddress.from_json(entity)
|
297
|
+
end
|
298
|
+
return list
|
299
|
+
end
|
300
|
+
|
301
|
+
def to_json(state = nil)
|
302
|
+
JSON.generate({
|
303
|
+
:email => @email,
|
304
|
+
:alias => @alias
|
305
|
+
})
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
class OnlineIdentity
|
310
|
+
attr_accessor :type, :identity
|
311
|
+
def initialize(attribute_value_map = {})
|
312
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
313
|
+
self.freeze
|
314
|
+
end
|
315
|
+
|
316
|
+
def type=(type)
|
317
|
+
OnlineIdentityType::assertValidValue(type)
|
318
|
+
@type = type
|
319
|
+
end
|
320
|
+
|
321
|
+
def ==(object)
|
322
|
+
ObjectHelper.equals(self,object)
|
323
|
+
end
|
324
|
+
|
325
|
+
def self.from_json(json)
|
326
|
+
OnlineIdentity.new({
|
327
|
+
:type => json['field'],
|
328
|
+
:identity => json['value']
|
329
|
+
})
|
330
|
+
end
|
331
|
+
|
332
|
+
def self.from_json_list(json)
|
333
|
+
if json.nil? then return [] end
|
334
|
+
|
335
|
+
list = []
|
336
|
+
json.each do |entity|
|
337
|
+
list << OnlineIdentity.from_json(entity)
|
338
|
+
end
|
339
|
+
return list
|
340
|
+
end
|
341
|
+
|
342
|
+
def to_json(state = nil)
|
343
|
+
JSON.generate({
|
344
|
+
:field => @type.to_s,
|
345
|
+
:value => @identity
|
346
|
+
})
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
|
351
|
+
class OnlineIdentityType < Enumeration
|
352
|
+
self.add_item(:PersonalWebsite, 'website')
|
353
|
+
self.add_item(:CompanyWebsite, 'company_website')
|
354
|
+
self.add_item(:Twitter, 'twitter')
|
355
|
+
self.add_item(:Facebook, 'facebook')
|
356
|
+
self.add_item(:LinkedIn, 'linkedin')
|
357
|
+
self.add_item(:Pintrest, 'pintrest')
|
358
|
+
self.add_item(:Instagram, 'instagram')
|
359
|
+
end
|
360
|
+
|
361
|
+
##
|
362
|
+
# Gender valid values
|
363
|
+
#
|
364
|
+
class Gender < Enumeration
|
365
|
+
self.add_item(:Male, "M")
|
366
|
+
self.add_item(:Female, "F")
|
367
|
+
self.add_item(:Other, "O")
|
368
|
+
self.add_item(:NotAvailable, "N")
|
369
|
+
end
|
370
|
+
|
371
|
+
class CustomerStatuses
|
372
|
+
attr_reader :existing, :pending, :deleted
|
373
|
+
def initialize()
|
374
|
+
@existing = []
|
375
|
+
@pending = []
|
376
|
+
@deleted = []
|
377
|
+
end
|
378
|
+
|
379
|
+
def add_existing(email)
|
380
|
+
@existing << email
|
381
|
+
end
|
382
|
+
|
383
|
+
def add_pending(email)
|
384
|
+
@pending << email
|
385
|
+
end
|
386
|
+
|
387
|
+
def add_deleted(email)
|
388
|
+
@deleted << email
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
class CustomerInvoiceRequest
|
393
|
+
attr_reader :email, :from, :to
|
394
|
+
def initialize(email, from, to)
|
395
|
+
@email = email
|
396
|
+
@from = if from.is_a? Date then from else Date.parse(from) end
|
397
|
+
@to = if to.is_a? Date then to else Date.parse(to) end
|
398
|
+
end
|
399
|
+
|
400
|
+
def self.from_json(json)
|
401
|
+
CustomerInvoiceRequest.new(
|
402
|
+
json['email'],
|
403
|
+
Date.parse(json['from']),
|
404
|
+
Date.parse(json['to']))
|
405
|
+
end
|
406
|
+
|
407
|
+
def self.from_json_list(json)
|
408
|
+
if json.nil? then return [] end
|
409
|
+
list = []
|
410
|
+
json.each do |entity|
|
411
|
+
list << CustomerInvoiceRequest.from_json(entity)
|
412
|
+
end
|
413
|
+
return list
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
417
|
+
class CustomerInvoice
|
418
|
+
attr_reader :email
|
419
|
+
def initialize(email)
|
420
|
+
@email = email
|
421
|
+
@orders = []
|
422
|
+
@pre_tax_total = 0.0
|
423
|
+
@tax = 0.0
|
424
|
+
@post_tax_total = 0.0
|
425
|
+
end
|
426
|
+
|
427
|
+
def add_order(order)
|
428
|
+
order.freeze
|
429
|
+
@orders << order
|
430
|
+
@pre_tax_total += order.pre_tax_total.to_f
|
431
|
+
@post_tax_total += order.post_tax_total.to_f
|
432
|
+
@tax += order.tax.to_f
|
433
|
+
end
|
434
|
+
|
435
|
+
def to_json(state = nil)
|
436
|
+
JSON.generate(json_attribute_map)
|
437
|
+
end
|
438
|
+
|
439
|
+
def self.to_json_from_list(invoice_list)
|
440
|
+
json_invoices = []
|
441
|
+
invoice_list.each do |invoice|
|
442
|
+
json_invoices << invoice.json_attribute_map
|
443
|
+
end
|
444
|
+
JSON.generate({:invoices => json_invoices })
|
445
|
+
end
|
446
|
+
|
447
|
+
def json_attribute_map()
|
448
|
+
{ :email => @email,
|
449
|
+
:orderCount => @orders.length,
|
450
|
+
:preTaxTotal => @pre_tax_total,
|
451
|
+
:postTaxTotal => @post_tax_total,
|
452
|
+
:tax => @tax,
|
453
|
+
:orders => @orders}
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
class CustomerOrder
|
458
|
+
attr_accessor :order_id, :order_date, :item_count, :coupon_code, :currency, :pre_tax_total, :post_tax_total, :tax
|
459
|
+
def initialize(attribute_value_map = {})
|
460
|
+
attribute_value_map.map { |(k, v)| public_send("#{k}=", v) }
|
461
|
+
end
|
462
|
+
|
463
|
+
def order_date=(order_date)
|
464
|
+
@order_date = if order_date.is_a? Date then order_date else Date.parse(order_date) end
|
465
|
+
end
|
466
|
+
|
467
|
+
def to_json(state = nil)
|
468
|
+
JSON.generate({
|
469
|
+
:id => @order_id,
|
470
|
+
:date => @order_date,
|
471
|
+
:itemCount => @item_count.to_i,
|
472
|
+
:coupon => @coupon_code,
|
473
|
+
:currency => @currency,
|
474
|
+
:preTaxTotal => @pre_tax_total.to_f,
|
475
|
+
:postTaxTotal => @post_tax_total.to_f,
|
476
|
+
:tax => @tax.to_f})
|
477
|
+
end
|
478
|
+
end
|
479
|
+
|
480
|
+
end
|