erp_orders 3.0.0
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.
- 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
|