erp_orders 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/GPL-3-LICENSE +674 -0
- data/README.rdoc +2 -0
- data/Rakefile +30 -0
- data/app/assets/javascripts/erp_orders/application.js +9 -0
- data/app/assets/stylesheets/erp_orders/application.css +7 -0
- data/app/controllers/erp_orders/erp_app/desktop/order_manager/base_controller.rb +147 -0
- data/app/controllers/erp_orders/erp_app/organizer/order_management/base_controller.rb +19 -0
- data/app/helpers/erp_orders/application_helper.rb +4 -0
- data/app/models/charge_line.rb +21 -0
- data/app/models/charge_line_payment_txn.rb +5 -0
- data/app/models/extensions/agreement.rb +6 -0
- data/app/models/extensions/money.rb +3 -0
- data/app/models/extensions/party.rb +3 -0
- data/app/models/extensions/product_instance.rb +3 -0
- data/app/models/extensions/product_type.rb +3 -0
- data/app/models/line_item_role_type.rb +4 -0
- data/app/models/order_line_item.rb +27 -0
- data/app/models/order_line_item_pty_role.rb +35 -0
- data/app/models/order_line_item_type.rb +4 -0
- data/app/models/order_txn.rb +381 -0
- data/app/models/order_txn_type.rb +4 -0
- data/app/views/layouts/erp_orders/application.html.erb +14 -0
- data/config/routes.rb +14 -0
- data/db/data_migrations/20110605231556_create_order_party_roles.rb +23 -0
- data/db/data_migrations/20110728201731_create_desktop_app_order_manager.rb +25 -0
- data/db/data_migrations/20110728201732_create_organizer_app_order_management.rb +14 -0
- data/db/migrate/20080805000060_base_orders.rb +175 -0
- data/db/migrate/20110602194707_update_order_txn_ship_to_bill_to.rb +25 -0
- data/lib/erp_orders/engine.rb +13 -0
- data/lib/erp_orders/extensions/active_record/acts_as_order_txn.rb +111 -0
- data/lib/erp_orders/extensions.rb +1 -0
- data/lib/erp_orders/version.rb +3 -0
- data/lib/erp_orders.rb +5 -0
- data/lib/tasks/erp_orders_tasks.rake +4 -0
- data/public/javascripts/erp_app/desktop/applications/order_manager/line_items_grid_panel.js +100 -0
- data/public/javascripts/erp_app/desktop/applications/order_manager/module.js +85 -0
- data/public/javascripts/erp_app/desktop/applications/order_manager/orders_grid_panel.js +163 -0
- data/public/javascripts/erp_app/desktop/applications/order_manager/payments_grid_panel.js +109 -0
- data/public/javascripts/erp_app/organizer/applications/order_management/base.js +127 -0
- data/public/javascripts/erp_app/organizer/applications/order_management/extensions.js +115 -0
- data/public/javascripts/erp_app/organizer/applications/order_management/line_items_grid_panel.js +99 -0
- data/public/javascripts/erp_app/organizer/applications/order_management/orders_grid_panel.js +205 -0
- data/public/javascripts/erp_app/organizer/applications/order_management/payments_grid_panel.js +93 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +9 -0
- data/spec/dummy/app/assets/stylesheets/application.css +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config/application.rb +49 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +8 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/spec.rb +27 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +10 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +26 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/models/charge_line_payment_txn_spec.rb +11 -0
- data/spec/models/charge_line_spec.rb +11 -0
- data/spec/models/line_item_role_type_spec.rb +11 -0
- data/spec/models/order_line_item_pty_role_spec.rb +13 -0
- data/spec/models/order_line_item_spec.rb +12 -0
- data/spec/models/order_line_item_type_spec.rb +14 -0
- data/spec/models/order_txn_spec.rb +11 -0
- data/spec/models/order_txn_type_spec.rb +11 -0
- data/spec/spec_helper.rb +60 -0
- metadata +203 -0
@@ -0,0 +1,381 @@
|
|
1
|
+
class OrderTxn < ActiveRecord::Base
|
2
|
+
acts_as_biz_txn_event
|
3
|
+
|
4
|
+
belongs_to :order_txn_record, :polymorphic => true, :dependent => :destroy
|
5
|
+
has_many :order_line_items, :dependent => :destroy
|
6
|
+
has_many :charge_lines, :as => :charged_item
|
7
|
+
|
8
|
+
alias :line_items :order_line_items
|
9
|
+
|
10
|
+
# validation
|
11
|
+
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :update, :allow_nil => true
|
12
|
+
|
13
|
+
#find a order by given biz txn party role iid and party
|
14
|
+
def self.find_by_party_role(biz_txn_party_role_type_iid, party)
|
15
|
+
biz_txn_party_roles = BizTxnPartyRole.find(
|
16
|
+
:all,
|
17
|
+
:conditions => ['party_id = ? and biz_txn_party_role_type_id = ?', party.id, BizTxnPartyRoleType.find_by_internal_identifier(biz_txn_party_role_type_iid).id])
|
18
|
+
|
19
|
+
biz_txn_party_roles.collect{|item| item.biz_txn_event.biz_txn_record}
|
20
|
+
end
|
21
|
+
|
22
|
+
# get the total charges for an order.
|
23
|
+
# The total will be returned as Money.
|
24
|
+
# There may be multiple Monies assocated with an order, such as points and
|
25
|
+
# dollars. To handle this, the method should return an array of Monies
|
26
|
+
#
|
27
|
+
def get_total_charges
|
28
|
+
# get all of the charge lines associated with the order and order_lines
|
29
|
+
total_hash = Hash.new
|
30
|
+
all_charges = get_all_charge_lines
|
31
|
+
# loop through all of the charges and combine charges for each money type
|
32
|
+
all_charges.each do |charge|
|
33
|
+
cur_money = charge.money
|
34
|
+
cur_total = total_hash[cur_money.currency.internal_identifier]
|
35
|
+
if (cur_total.nil?)
|
36
|
+
cur_total = cur_money.clone
|
37
|
+
else
|
38
|
+
cur_total.amount = 0 if cur_total.amount.nil?
|
39
|
+
cur_total.amount += cur_money.amount if !cur_money.amount.nil?
|
40
|
+
end
|
41
|
+
total_hash[cur_money.currency.internal_identifier] = cur_total
|
42
|
+
end
|
43
|
+
return total_hash.values
|
44
|
+
end
|
45
|
+
|
46
|
+
#get all charge lines on order and order line items
|
47
|
+
def get_all_charge_lines
|
48
|
+
all_charges = []
|
49
|
+
all_charges.concat(charge_lines)
|
50
|
+
order_line_items.each do |line_item|
|
51
|
+
all_charges.concat(line_item.charge_lines)
|
52
|
+
end
|
53
|
+
all_charges
|
54
|
+
end
|
55
|
+
|
56
|
+
def submit
|
57
|
+
#Template Method
|
58
|
+
end
|
59
|
+
|
60
|
+
#add product_type or product_instance line item
|
61
|
+
def add_line_item(object, reln_type = nil, to_role = nil, from_role = nil)
|
62
|
+
class_name = object.class.name
|
63
|
+
if object.is_a?(Array)
|
64
|
+
class_name = object.first.class.name
|
65
|
+
else
|
66
|
+
class_name = object.class.name
|
67
|
+
end
|
68
|
+
|
69
|
+
case class_name
|
70
|
+
when 'ProductType'
|
71
|
+
return add_product_type_line_item(object, reln_type, to_role, from_role)
|
72
|
+
when 'ProductInstance'
|
73
|
+
return add_product_instance_line_item(object, reln_type, to_role, from_role)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def add_product_type_line_item(product_type, reln_type = nil, to_role = nil, from_role = nil)
|
78
|
+
|
79
|
+
li = OrderLineItem.new
|
80
|
+
|
81
|
+
if(product_type.is_a?(Array))
|
82
|
+
if (product_type.size == 0)
|
83
|
+
return
|
84
|
+
elsif (product_type.size == 1)
|
85
|
+
product_type_for_line_item = product_type[0]
|
86
|
+
else # more than 1 in the array, so it's a package
|
87
|
+
product_type_for_line_item = ProductType.new
|
88
|
+
product_type_for_line_item.description = to_role.description
|
89
|
+
|
90
|
+
product_type.each do |product|
|
91
|
+
# make a product-type-reln
|
92
|
+
reln = ProdTypeReln.new
|
93
|
+
reln.prod_type_reln_type = reln_type
|
94
|
+
reln.role_type_id_from = from_role.id
|
95
|
+
reln.role_type_id_to = to_role.id
|
96
|
+
|
97
|
+
#associate package on the "to" side of reln
|
98
|
+
reln.prod_type_to = product_type_for_line_item
|
99
|
+
|
100
|
+
#assocation product_type on the "from" side of the reln
|
101
|
+
reln.prod_type_from = product
|
102
|
+
reln.save
|
103
|
+
end
|
104
|
+
end
|
105
|
+
else
|
106
|
+
product_type_for_line_item = product_type
|
107
|
+
end
|
108
|
+
|
109
|
+
li.product_type = product_type_for_line_item
|
110
|
+
self.line_items << li
|
111
|
+
li.save
|
112
|
+
return li
|
113
|
+
end
|
114
|
+
|
115
|
+
def add_product_instance_line_item(product_instance, reln_type = nil, to_role = nil, from_role = nil)
|
116
|
+
|
117
|
+
li = OrderLineItem.new
|
118
|
+
|
119
|
+
if(product_instance.is_a?(Array))
|
120
|
+
if (product_instance.size == 0)
|
121
|
+
return
|
122
|
+
elsif (product_instance.size == 1)
|
123
|
+
product_instance_for_line_item = product_instance[0]
|
124
|
+
else # more than 1 in the array, so it's a package
|
125
|
+
product_instance_for_line_item = ProductInstance.new
|
126
|
+
product_instance_for_line_item.description = to_role.description
|
127
|
+
product_instance_for_line_item.save
|
128
|
+
|
129
|
+
product_instance.each do |product|
|
130
|
+
# make a product-type-reln
|
131
|
+
reln = ProdInstanceReln.new
|
132
|
+
reln.prod_instance_reln_type = reln_type
|
133
|
+
reln.role_type_id_from = from_role.id
|
134
|
+
reln.role_type_id_to = to_role.id
|
135
|
+
|
136
|
+
#associate package on the "to" side of reln
|
137
|
+
reln.prod_instance_to = product_instance_for_line_item
|
138
|
+
|
139
|
+
#assocation product_instance on the "from" side of the reln
|
140
|
+
reln.prod_instance_from = product
|
141
|
+
reln.save
|
142
|
+
end
|
143
|
+
end
|
144
|
+
else
|
145
|
+
product_instance_for_line_item = product_instance
|
146
|
+
end
|
147
|
+
|
148
|
+
li.product_instance = product_instance_for_line_item
|
149
|
+
self.line_items << li
|
150
|
+
li.save
|
151
|
+
return li
|
152
|
+
end
|
153
|
+
|
154
|
+
def find_party_by_role(role_type_iid)
|
155
|
+
party = nil
|
156
|
+
|
157
|
+
tpr = self.root_txn.biz_txn_party_roles.find(:first, :include => :biz_txn_party_role_type, :conditions => ['biz_txn_party_role_types.internal_identifier = ?',role_type_iid])
|
158
|
+
party = tpr.party unless tpr.nil?
|
159
|
+
|
160
|
+
party
|
161
|
+
end
|
162
|
+
|
163
|
+
def set_shipping_info(party)
|
164
|
+
self.ship_to_first_name = party.business_party.current_first_name
|
165
|
+
self.ship_to_last_name = party.business_party.current_last_name
|
166
|
+
shipping_address = party.find_contact_with_purpose(PostalAddress, ContactPurpose.shipping) || party.find_contact_with_purpose(PostalAddress, ContactPurpose.default)
|
167
|
+
unless shipping_address.nil?
|
168
|
+
shipping_address = shipping_address.contact_mechanism
|
169
|
+
self.ship_to_address_line_1 = shipping_address.address_line_1
|
170
|
+
self.ship_to_address_line_2 = shipping_address.address_line_2
|
171
|
+
self.ship_to_city = shipping_address.city
|
172
|
+
self.ship_to_state = shipping_address.state
|
173
|
+
self.ship_to_postal_code = shipping_address.zip
|
174
|
+
#self.ship_to_country_name = shipping_address.country_name
|
175
|
+
#self.ship_to_country = shipping_address.country
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def set_billing_info(party)
|
180
|
+
self.email = party.find_contact_mechanism_with_purpose(EmailAddress, ContactPurpose.billing).email_address unless party.find_contact_mechanism_with_purpose(EmailAddress, ContactPurpose.billing).nil?
|
181
|
+
self.phone_number = party.find_contact_mechanism_with_purpose(PhoneNumber, ContactPurpose.billing).phone_number unless party.find_contact_mechanism_with_purpose(PhoneNumber, ContactPurpose.billing).nil?
|
182
|
+
|
183
|
+
self.bill_to_first_name = party.business_party.current_first_name
|
184
|
+
self.bill_to_last_name = party.business_party.current_last_name
|
185
|
+
billing_address = party.find_contact_with_purpose(PostalAddress, ContactPurpose.billing) || party.find_contact_with_purpose(PostalAddress, ContactPurpose.default)
|
186
|
+
unless billing_address.nil?
|
187
|
+
billing_address = billing_address.contact_mechanism
|
188
|
+
self.bill_to_address_line_1 = billing_address.address_line_1
|
189
|
+
self.bill_to_address_line_2 = billing_address.address_line_2
|
190
|
+
self.bill_to_city = billing_address.city
|
191
|
+
self.bill_to_state = billing_address.state
|
192
|
+
self.bill_to_postal_code = billing_address.zip
|
193
|
+
#self.bill_to_country_name = billing_address.country_name
|
194
|
+
#self.bill_to_country = billing_address.country
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def determine_txn_party_roles
|
199
|
+
#Template Method
|
200
|
+
end
|
201
|
+
|
202
|
+
def determine_charge_elements
|
203
|
+
#Template Method
|
204
|
+
end
|
205
|
+
|
206
|
+
def determine_charge_accounts
|
207
|
+
#Template Method
|
208
|
+
end
|
209
|
+
|
210
|
+
###############################################################################
|
211
|
+
#BizTxnEvent Overrides
|
212
|
+
###############################################################################
|
213
|
+
def create_dependent_txns
|
214
|
+
#Template Method
|
215
|
+
end
|
216
|
+
|
217
|
+
################################################################
|
218
|
+
################################################################
|
219
|
+
# Payment methods
|
220
|
+
# these methods are used to capture payments on orders
|
221
|
+
################################################################
|
222
|
+
################################################################
|
223
|
+
|
224
|
+
def authorize_payments(financial_txns, credit_card, gateway, gateway_options={}, use_delayed_jobs=true)
|
225
|
+
all_txns_authorized = true
|
226
|
+
authorized_txns = []
|
227
|
+
gateway_message = nil
|
228
|
+
|
229
|
+
#check if we are using delayed jobs or not
|
230
|
+
unless use_delayed_jobs
|
231
|
+
financial_txns.each do |financial_txn|
|
232
|
+
financial_txn.authorize(credit_card, gateway, gateway_options)
|
233
|
+
if financial_txn.payments.empty?
|
234
|
+
all_txns_authorized = false
|
235
|
+
gateway_message = 'Unknown Gateway Error'
|
236
|
+
break
|
237
|
+
elsif !financial_txn.payments.first.success
|
238
|
+
all_txns_authorized = false
|
239
|
+
gateway_message = financial_txn.payments.first.payment_gateways.first.response
|
240
|
+
break
|
241
|
+
else
|
242
|
+
authorized_txns << financial_txn
|
243
|
+
end
|
244
|
+
end
|
245
|
+
else
|
246
|
+
financial_txns.each do |financial_txn|
|
247
|
+
#push into delayed job so we can fire off more payments if needed
|
248
|
+
ErpTxnsAndAccts::DelayedJobs::PaymentGatewayJob.start(financial_txn, gateway, :authorize, gateway_options, credit_card)
|
249
|
+
end
|
250
|
+
#wait till all payments are complete
|
251
|
+
#wait a max of 120 seconds 2 minutes
|
252
|
+
wait_counter = 0
|
253
|
+
while !all_payment_jobs_completed?(financial_txns, :authorized)
|
254
|
+
break if wait_counter == 40
|
255
|
+
sleep 3
|
256
|
+
wait_counter += 1
|
257
|
+
end
|
258
|
+
|
259
|
+
result, gateway_message, authorized_txns = all_payment_jobs_successful?(financial_txns)
|
260
|
+
|
261
|
+
unless result
|
262
|
+
all_txns_authorized = false
|
263
|
+
end
|
264
|
+
end
|
265
|
+
return all_txns_authorized, authorized_txns, gateway_message
|
266
|
+
end
|
267
|
+
|
268
|
+
def capture_payments(authorized_txns, credit_card, gateway, gateway_options={}, use_delayed_jobs=true)
|
269
|
+
all_txns_captured = true
|
270
|
+
gateway_message = nil
|
271
|
+
|
272
|
+
#check if we are using delayed jobs or not
|
273
|
+
unless use_delayed_jobs
|
274
|
+
authorized_txns.each do |financial_txn|
|
275
|
+
result = financial_txn.capture(credit_card, gateway, gateway_options)
|
276
|
+
unless(result[:success])
|
277
|
+
all_txns_captured = false
|
278
|
+
gateway_message = result[:gateway_message]
|
279
|
+
break
|
280
|
+
end
|
281
|
+
end
|
282
|
+
else
|
283
|
+
authorized_txns.each do |financial_txn|
|
284
|
+
#push into delayed job so we can fire off more payments if needed
|
285
|
+
ErpTxnsAndAccts::DelayedJobs::PaymentGatewayJob.start(financial_txn, gateway, :capture, gateway_options, credit_card)
|
286
|
+
end
|
287
|
+
|
288
|
+
#wait till all payments are complete
|
289
|
+
#wait a max of 120 seconds 2 minutes
|
290
|
+
wait_counter = 0
|
291
|
+
while !all_payment_jobs_completed?(authorized_txns, :captured)
|
292
|
+
break if wait_counter == 40
|
293
|
+
sleep 3
|
294
|
+
wait_counter += 1
|
295
|
+
end
|
296
|
+
|
297
|
+
result, gateway_message, authorized_txns = all_payment_jobs_successful?(authorized_txns)
|
298
|
+
|
299
|
+
unless result
|
300
|
+
all_txns_captured = false
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
return all_txns_captured, gateway_message
|
305
|
+
end
|
306
|
+
|
307
|
+
def rollback_authorizations(authorized_txns, credit_card, gateway, gateway_options={}, use_delayed_jobs=true)
|
308
|
+
all_txns_rolledback = true
|
309
|
+
|
310
|
+
#check if we are using delayed jobs or not
|
311
|
+
unless use_delayed_jobs
|
312
|
+
authorized_txns.each do |financial_txn|
|
313
|
+
result = financial_txn.reverse_authorization(credit_card, gateway, gateway_options)
|
314
|
+
unless(result[:success])
|
315
|
+
all_txns_rolledback = false
|
316
|
+
end
|
317
|
+
end
|
318
|
+
else
|
319
|
+
authorized_txns.each do |financial_txn|
|
320
|
+
#push into delayed job so we can fire off more payments if needed
|
321
|
+
ErpTxnsAndAccts::DelayedJobs::PaymentGatewayJob.start(financial_txn, gateway, :reverse_authorization, gateway_options, credit_card)
|
322
|
+
end
|
323
|
+
|
324
|
+
#wait till all payments are complete
|
325
|
+
#wait a max of 120 seconds 2 minutes
|
326
|
+
wait_counter = 0
|
327
|
+
while !all_payment_jobs_completed?(authorized_txns, :authorization_reversed)
|
328
|
+
break if wait_counter == 40
|
329
|
+
sleep 3
|
330
|
+
wait_counter += 1
|
331
|
+
end
|
332
|
+
|
333
|
+
result, gateway_message, authorized_txns = all_payment_jobs_successful?(authorized_txns)
|
334
|
+
|
335
|
+
unless result
|
336
|
+
all_txns_rolledback = false
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
all_txns_rolledback
|
341
|
+
end
|
342
|
+
|
343
|
+
def all_payment_jobs_completed?(financial_txns, state)
|
344
|
+
result = true
|
345
|
+
|
346
|
+
#check the financial txns as they come back
|
347
|
+
financial_txns.each do |financial_txn|
|
348
|
+
payments = financial_txn.payments(true)
|
349
|
+
if payments.empty? || payments.first.current_state.to_sym != state
|
350
|
+
result = false
|
351
|
+
break
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
result
|
356
|
+
end
|
357
|
+
|
358
|
+
def all_payment_jobs_successful?(financial_txns)
|
359
|
+
result = true
|
360
|
+
message = nil
|
361
|
+
authorized_txns = []
|
362
|
+
|
363
|
+
#check the financial txns to see all were successful, if not get message
|
364
|
+
financial_txns.each do |financial_txn|
|
365
|
+
payments = financial_txn.payments(true)
|
366
|
+
if payments.empty? || !payments.first.success
|
367
|
+
result = false
|
368
|
+
unless payments.empty?
|
369
|
+
message = financial_txn.payments.first.payment_gateways.first.response
|
370
|
+
else
|
371
|
+
message = "Unknown Protobase Error"
|
372
|
+
end
|
373
|
+
else
|
374
|
+
authorized_txns << financial_txn
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
return result, message, authorized_txns
|
379
|
+
end
|
380
|
+
|
381
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>ErpOrders</title>
|
5
|
+
<%= stylesheet_link_tag "erp_orders/application" %>
|
6
|
+
<%= javascript_include_tag "erp_orders/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
ErpOrders::Engine.routes.draw do
|
2
|
+
#Desktop Applications
|
3
|
+
#
|
4
|
+
#order_manager
|
5
|
+
match '/erp_app/desktop/order_manager(/:action(/:id))' => 'erp_app/desktop/order_manager/base'
|
6
|
+
|
7
|
+
|
8
|
+
#Organizer Applications
|
9
|
+
#
|
10
|
+
#order_management
|
11
|
+
match '/erp_app/organizer/order_management(/:action(/:id))' => 'erp_app/organizer/order_management/base'
|
12
|
+
end
|
13
|
+
|
14
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class CreateOrderPartyRoles
|
2
|
+
|
3
|
+
def self.up
|
4
|
+
order_roles = BizTxnPartyRoleType.create(
|
5
|
+
:description => 'Order Roles',
|
6
|
+
:internal_identifier => 'order_roles'
|
7
|
+
)
|
8
|
+
|
9
|
+
buyor_role = BizTxnPartyRoleType.create(
|
10
|
+
:description => 'Payor',
|
11
|
+
:internal_identifier => 'payor'
|
12
|
+
)
|
13
|
+
|
14
|
+
buyor_role.move_to_child_of(order_roles)
|
15
|
+
buyor_role.save
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.down
|
19
|
+
BizTxnPartyRoleType.find_by_internal_identifier('payor').destroy
|
20
|
+
BizTxnPartyRoleType.find_by_internal_identifier('order_roles').destroy
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class CreateDesktopAppOrderManager
|
2
|
+
def self.up
|
3
|
+
app = DesktopApplication.create(
|
4
|
+
:description => 'Orders',
|
5
|
+
:icon => 'icon-package',
|
6
|
+
:javascript_class_name => 'Compass.ErpApp.Desktop.Applications.OrderManager',
|
7
|
+
:internal_identifier => 'order_manager',
|
8
|
+
:shortcut_id => 'order_manager-win'
|
9
|
+
)
|
10
|
+
|
11
|
+
pt = PreferenceType.iid('desktop_shortcut')
|
12
|
+
pt.preferenced_records << app
|
13
|
+
pt.save
|
14
|
+
|
15
|
+
pt = PreferenceType.iid('autoload_application')
|
16
|
+
pt.preferenced_records << app
|
17
|
+
pt.save
|
18
|
+
|
19
|
+
app.save
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.down
|
23
|
+
DesktopApplication.destroy_all(:conditions => ['internal_identifier = ?','hello_world'])
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateOrganizerAppOrderManagement
|
2
|
+
def self.up
|
3
|
+
OrganizerApplication.create(
|
4
|
+
:description => 'Orders',
|
5
|
+
:icon => 'icon-package',
|
6
|
+
:javascript_class_name => 'Compass.ErpApp.Organizer.Applications.OrderManagement.Base',
|
7
|
+
:internal_identifier => 'order_management'
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.down
|
12
|
+
OrganizerApplication.destroy_all(:conditions => ['internal_identifier = ?','order_management'])
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
class BaseOrders < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
|
4
|
+
unless table_exists?(:order_txns)
|
5
|
+
create_table :order_txns do |t|
|
6
|
+
t.column :state_machine, :string
|
7
|
+
t.column :description, :string
|
8
|
+
t.column :order_txn_type_id, :integer
|
9
|
+
# Multi-table inheritance info
|
10
|
+
# MTI implemented using Rails' polymorphic associations
|
11
|
+
# Contact Information
|
12
|
+
t.column :email, :string
|
13
|
+
t.column :phone_number, :string
|
14
|
+
# Shipping Address
|
15
|
+
t.column :ship_to_first_name, :string
|
16
|
+
t.column :ship_to_last_name, :string
|
17
|
+
t.column :ship_to_address_line_1, :string
|
18
|
+
t.column :ship_to_address_line_2, :string
|
19
|
+
t.column :ship_to_city, :string
|
20
|
+
t.column :ship_to_state, :string
|
21
|
+
t.column :ship_to_postal_code, :string
|
22
|
+
t.column :ship_to_country, :string
|
23
|
+
# Private parts
|
24
|
+
t.column :customer_ip, :string
|
25
|
+
t.column :order_number, :integer
|
26
|
+
t.column :status, :string
|
27
|
+
t.column :error_message, :string
|
28
|
+
t.column :order_txn_record_id, :integer
|
29
|
+
t.column :order_txn_record_type, :string
|
30
|
+
t.timestamps
|
31
|
+
end
|
32
|
+
|
33
|
+
add_index :order_txns, :order_txn_type_id
|
34
|
+
add_index :order_txns, [:order_txn_record_id, :order_txn_record_type], :name => 'order_txn_record_idx'
|
35
|
+
end
|
36
|
+
|
37
|
+
unless table_exists?(:order_txn_types)
|
38
|
+
create_table :order_txn_types do |t|
|
39
|
+
t.column :parent_id, :integer
|
40
|
+
t.column :lft, :integer
|
41
|
+
t.column :rgt, :integer
|
42
|
+
#custom columns go here
|
43
|
+
t.column :description, :string
|
44
|
+
t.column :comments, :string
|
45
|
+
t.column :internal_identifier, :string
|
46
|
+
t.column :external_identifier, :string
|
47
|
+
t.column :external_id_source, :string
|
48
|
+
t.timestamps
|
49
|
+
end
|
50
|
+
|
51
|
+
add_index :order_txn_types, :parent_id
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
unless table_exists?(:order_line_items)
|
56
|
+
create_table :order_line_items do |t|
|
57
|
+
t.column :order_txn_id, :integer
|
58
|
+
t.column :order_line_item_type_id, :integer
|
59
|
+
t.column :product_id, :integer
|
60
|
+
t.column :product_description, :string
|
61
|
+
t.column :product_instance_id, :integer
|
62
|
+
t.column :product_instance_description, :string
|
63
|
+
t.column :product_type_id, :integer
|
64
|
+
t.column :product_type_description, :string
|
65
|
+
t.column :sold_price, :float
|
66
|
+
t.column :sold_price_uom, :integer
|
67
|
+
t.column :sold_amount, :integer
|
68
|
+
t.column :sold_amount_uom, :integer
|
69
|
+
t.column :product_offer_id, :integer
|
70
|
+
t.timestamps
|
71
|
+
end
|
72
|
+
|
73
|
+
add_index :order_line_items, :order_txn_id
|
74
|
+
add_index :order_line_items, :order_line_item_type_id
|
75
|
+
add_index :order_line_items, :product_id
|
76
|
+
add_index :order_line_items, :product_instance_id
|
77
|
+
add_index :order_line_items, :product_type_id
|
78
|
+
add_index :order_line_items, :product_offer_id
|
79
|
+
end
|
80
|
+
|
81
|
+
unless table_exists?(:order_line_item_types)
|
82
|
+
create_table :order_line_item_types do |t|
|
83
|
+
t.column :parent_id, :integer
|
84
|
+
t.column :lft, :integer
|
85
|
+
t.column :rgt, :integer
|
86
|
+
#custom columns go here
|
87
|
+
t.column :description, :string
|
88
|
+
t.column :comments, :string
|
89
|
+
t.column :internal_identifier, :string
|
90
|
+
t.column :external_identifier, :string
|
91
|
+
t.column :external_id_source, :string
|
92
|
+
t.timestamps
|
93
|
+
end
|
94
|
+
|
95
|
+
add_index :order_line_item_types, :parent_id
|
96
|
+
end
|
97
|
+
|
98
|
+
unless table_exists?(:order_line_item_pty_roles)
|
99
|
+
create_table :order_line_item_pty_roles do |t|
|
100
|
+
t.column :description, :string
|
101
|
+
t.column :order_line_item_id, :integer
|
102
|
+
t.column :party_id, :integer
|
103
|
+
t.column :line_item_role_type_id, :integer
|
104
|
+
t.column :biz_txn_acct_root_id, :integer #optional for splitting orders across accounts
|
105
|
+
t.timestamps
|
106
|
+
end
|
107
|
+
|
108
|
+
add_index :order_line_item_pty_roles, :order_line_item_id
|
109
|
+
add_index :order_line_item_pty_roles, :party_id
|
110
|
+
add_index :order_line_item_pty_roles, :line_item_role_type_id
|
111
|
+
add_index :order_line_item_pty_roles, :biz_txn_acct_root_id
|
112
|
+
end
|
113
|
+
|
114
|
+
unless table_exists?(:line_item_role_types)
|
115
|
+
create_table :line_item_role_types do |t|
|
116
|
+
t.column :parent_id, :integer
|
117
|
+
t.column :lft, :integer
|
118
|
+
t.column :rgt, :integer
|
119
|
+
#custom columns go here
|
120
|
+
t.column :description, :string
|
121
|
+
t.column :comments, :string
|
122
|
+
t.column :internal_identifier, :string
|
123
|
+
t.column :external_identifier, :string
|
124
|
+
t.column :external_id_source, :string
|
125
|
+
t.timestamps
|
126
|
+
end
|
127
|
+
|
128
|
+
add_index :line_item_role_types, :parent_id
|
129
|
+
end
|
130
|
+
|
131
|
+
unless table_exists?(:charge_lines)
|
132
|
+
create_table :charge_lines do |t|
|
133
|
+
t.string :sti_type
|
134
|
+
t.references :money
|
135
|
+
t.string :description #could be expanded to include type information, etc.
|
136
|
+
t.string :external_identifier
|
137
|
+
t.string :external_id_source
|
138
|
+
|
139
|
+
#polymorphic
|
140
|
+
t.references :charged_item, :polymorphic => true
|
141
|
+
|
142
|
+
t.timestamps
|
143
|
+
end
|
144
|
+
|
145
|
+
add_index :charge_lines, [:charged_item_id, :charged_item_type], :name => 'charged_item_idx'
|
146
|
+
end
|
147
|
+
|
148
|
+
unless table_exists?(:charge_line_payment_txns)
|
149
|
+
create_table :charge_line_payment_txns do |t|
|
150
|
+
t.column :charge_line_id, :integer
|
151
|
+
|
152
|
+
#polymorphic
|
153
|
+
t.references :payment_txn, :polymorphic => true
|
154
|
+
|
155
|
+
t.timestamps
|
156
|
+
end
|
157
|
+
|
158
|
+
add_index :charge_line_payment_txns, [:payment_txn_id, :payment_txn_type], :name => 'payment_txn_idx'
|
159
|
+
add_index :charge_line_payment_txns, :charge_line_id
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def self.down
|
164
|
+
[
|
165
|
+
:charge_lines, :charge_line_payment_txns, :line_item_role_types, :order_line_item_pty_roles,
|
166
|
+
:order_line_item_types, :order_line_items, :order_txn_types,
|
167
|
+
:order_txns
|
168
|
+
].each do |tbl|
|
169
|
+
if table_exists?(tbl)
|
170
|
+
drop_table tbl
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class UpdateOrderTxnShipToBillTo < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_address_line_1')
|
4
|
+
rename_column :order_txns, :bill_to_address, :bill_to_address_line_1
|
5
|
+
add_column :order_txns, :bill_to_address_line_2, :string
|
6
|
+
end
|
7
|
+
|
8
|
+
unless columns(:order_txns).collect {|c| c.name}.include?('ship_to_address_line_1')
|
9
|
+
rename_column :order_txns, :ship_to_address, :ship_to_address_line_1
|
10
|
+
add_column :order_txns, :ship_to_address_line_2, :string
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.down
|
15
|
+
if columns(:order_txns).collect {|c| c.name}.include?('bill_to_address_line_1')
|
16
|
+
rename_column :order_txns, :bill_to_address_line_1, :bill_to_address
|
17
|
+
remove_column :order_txns, :bill_to_address_line_2
|
18
|
+
end
|
19
|
+
|
20
|
+
if columns(:order_txns).collect {|c| c.name}.include?('ship_to_address_line_1')
|
21
|
+
rename_column :order_txns, :ship_to_address_line_1, :ship_to_address
|
22
|
+
remove_column :order_txns, :ship_to_address_line_2
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ErpOrders
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
isolate_namespace ErpOrders
|
4
|
+
|
5
|
+
initializer "erp_orders_assets.merge_public" do |app|
|
6
|
+
app.middleware.insert_before Rack::Lock, ::ActionDispatch::Static, "#{root}/public"
|
7
|
+
end
|
8
|
+
|
9
|
+
ActiveSupport.on_load(:active_record) do
|
10
|
+
include ErpOrders::Extensions::ActiveRecord::ActsAsOrderTxn
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|