erp_commerce 4.0.0 → 4.2.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.
- checksums.yaml +4 -4
- data/README.md +0 -1
- data/app/models/accepted_credit_card.rb +10 -0
- data/app/models/bank_account.rb +13 -0
- data/app/models/bank_account_type.rb +9 -0
- data/app/models/credit_card.rb +54 -19
- data/app/models/credit_card_account.rb +31 -9
- data/app/models/credit_card_account_party_role.rb +17 -0
- data/app/models/credit_card_account_purpose.rb +24 -0
- data/app/models/extensions/financial_txn.rb +62 -1
- data/app/models/extensions/order_txn.rb +48 -0
- data/app/models/extensions/party.rb +26 -13
- data/app/models/extensions/simple_product_offer.rb +3 -0
- data/app/models/payment.rb +21 -0
- data/app/models/payment_gateway.rb +12 -0
- data/app/models/payment_gateway_action.rb +12 -0
- data/app/models/pricing_plan.rb +29 -1
- data/db/data_migrations/20150125202814_add_payment_transaction_types.rb +14 -0
- data/db/migrate/20100823174238_erp_commerce_base.rb +196 -192
- data/db/migrate/20160310163057_add_created_by_updated_by_to_erp_commerce.rb +35 -0
- data/lib/erp_commerce.rb +1 -2
- data/lib/erp_commerce/config.rb +2 -3
- data/lib/erp_commerce/engine.rb +1 -5
- data/lib/erp_commerce/extensions/active_record/acts_as_priceable.rb +1 -2
- data/lib/erp_commerce/version.rb +1 -1
- metadata +12 -32
- data/app/mailers/checkout_mailer.rb +0 -9
- data/app/views/checkout_mailer/email_confirmation.html.erb +0 -15
- data/app/widgets/orders/base.rb +0 -36
- data/app/widgets/orders/javascript/orders.js +0 -12
- data/app/widgets/orders/views/index.html.erb +0 -63
- data/app/widgets/product_catalog/base.rb +0 -52
- data/app/widgets/product_catalog/javascript/product_catalog.js +0 -64
- data/app/widgets/product_catalog/views/add_to_cart.html.erb +0 -10
- data/app/widgets/product_catalog/views/index.html.erb +0 -69
- data/app/widgets/product_catalog/views/show.html.erb +0 -23
- data/app/widgets/shopping_cart/base.rb +0 -175
- data/app/widgets/shopping_cart/javascript/shopping_cart.js +0 -110
- data/app/widgets/shopping_cart/views/cart_items.html.erb +0 -83
- data/app/widgets/shopping_cart/views/confirmation.html.erb +0 -11
- data/app/widgets/shopping_cart/views/demographics.html.erb +0 -142
- data/app/widgets/shopping_cart/views/login.html.erb +0 -1
- data/app/widgets/shopping_cart/views/payment.html.erb +0 -81
- data/app/widgets/shopping_cart/views/price_summary.html.erb +0 -4
- data/lib/erp_commerce/active_merchant_wrappers.rb +0 -3
- data/lib/erp_commerce/active_merchant_wrappers/authorize_net_wrapper.rb +0 -66
- data/lib/erp_commerce/active_merchant_wrappers/brain_tree_gateway_wrapper.rb +0 -68
- data/lib/erp_commerce/active_merchant_wrappers/credit_card_validation.rb +0 -34
- data/lib/erp_commerce/order_helper.rb +0 -245
@@ -1,11 +0,0 @@
|
|
1
|
-
<div id="<%=widget_result_id%>">
|
2
|
-
<p>Your order is complete.
|
3
|
-
<br/>Your should receive a confirmation email.
|
4
|
-
<br/>Confirmation Number <%=@payment.authorization_code%>
|
5
|
-
<br/>Your order number is <%=@order.order_number%>
|
6
|
-
</p>
|
7
|
-
|
8
|
-
</div>
|
9
|
-
<script type="text/javascript">
|
10
|
-
Compass.ErpApp.Widgets.refreshWidget('shopping_cart', 'price_summary');
|
11
|
-
</script>
|
@@ -1,142 +0,0 @@
|
|
1
|
-
<div id="<%=widget_result_id%>">
|
2
|
-
<h2>What you're buying...</h2>
|
3
|
-
<table id="products-view">
|
4
|
-
<thead>
|
5
|
-
<tr>
|
6
|
-
<th>Product</th>
|
7
|
-
<th>Description</th>
|
8
|
-
<th>Quantity</th>
|
9
|
-
<th>Total</th>
|
10
|
-
<th>Remove</th>
|
11
|
-
</tr>
|
12
|
-
</thead>
|
13
|
-
<tbody>
|
14
|
-
<% @order.order_line_items.each do |order_line_item| %>
|
15
|
-
<tr class="product-wrap">
|
16
|
-
<td>
|
17
|
-
<div><img src="<%=order_line_item.product_type.images.empty? ? '/images/img_blank.png' : order_line_item.product_type.images.first.data.url%>" alt="Product Image" /></div>
|
18
|
-
<div>
|
19
|
-
<span><%= raw order_line_item.product_type.description %></span><br/>
|
20
|
-
</div>
|
21
|
-
</td>
|
22
|
-
<td><%= raw order_line_item.product_type.descriptions.find_by_internal_identifier('long_description').description%></td>
|
23
|
-
<td>1</td>
|
24
|
-
<td><%=link_to 'Remove', build_widget_url(:remove_from_cart, order_line_item.id), :remote => true, :class => 'ajax_replace'%></td>
|
25
|
-
<td><span><%=order_line_item.product_type.get_current_simple_amount_with_currency.nil? ? 'no price set' : order_line_item.product_type.get_current_simple_amount_with_currency%></span></td>
|
26
|
-
</tr>
|
27
|
-
<%end%>
|
28
|
-
</tbody>
|
29
|
-
</table>
|
30
|
-
<hr/>
|
31
|
-
<div style="text-align:right;"><h2>Total <%=@price%></h2></div>
|
32
|
-
<hr/>
|
33
|
-
|
34
|
-
<div>
|
35
|
-
<h2>Step 1 of 3 Billing Information</h2>
|
36
|
-
<div style="color:red">
|
37
|
-
<%= raw @billing_error_message%>
|
38
|
-
</div>
|
39
|
-
<%= form_remote_tag build_widget_url(:checkout_payment), :id => 'demographics_form' do %>
|
40
|
-
<div class="form_settings">
|
41
|
-
<p>
|
42
|
-
<span>First Name</span>
|
43
|
-
<%= text_field_tag :bill_to_first_name, params[:bill_to_first_name] %>
|
44
|
-
</p>
|
45
|
-
<p>
|
46
|
-
<span>Last Name</span>
|
47
|
-
<%= text_field_tag :bill_to_last_name, params[:bill_to_last_name] %>
|
48
|
-
</p>
|
49
|
-
<p>
|
50
|
-
<span>Address Line 1</span>
|
51
|
-
<%= text_field_tag :bill_to_address_line_1, params[:bill_to_address_line_1] %>
|
52
|
-
</p>
|
53
|
-
<p>
|
54
|
-
<span>Address Line 2</span>
|
55
|
-
<%= text_field_tag :bill_to_address_line_2, params[:bill_to_address_line_2] %>
|
56
|
-
</p>
|
57
|
-
<p>
|
58
|
-
<span>City</span>
|
59
|
-
<%= text_field_tag :bill_to_city, params[:bill_to_city] %>
|
60
|
-
</p>
|
61
|
-
<p>
|
62
|
-
<span>State</span>
|
63
|
-
<%= select_tag(:bill_to_state, options_for_select(GeoZone.all.collect{|item| [item.zone_name,item.zone_code]}, params[:bill_to_state])) %>
|
64
|
-
</p>
|
65
|
-
<p>
|
66
|
-
<span>Country</span>
|
67
|
-
<%= select_tag(:bill_to_country, options_for_select(GeoCountry.find_all_by_display(true).collect{|item| [item.name,item.iso_code_2]}, params[:bill_to_country])) %>
|
68
|
-
</p>
|
69
|
-
<p>
|
70
|
-
<span>Postal/Zip Code</span>
|
71
|
-
<%= text_field_tag :bill_to_postal_code, params[:bill_to_postal_code] %>
|
72
|
-
</p>
|
73
|
-
<p>
|
74
|
-
<span>Email</span>
|
75
|
-
<%= text_field_tag :bill_to_email, params[:bill_to_email] %>
|
76
|
-
</p>
|
77
|
-
<p>
|
78
|
-
<span>Phone Number</span>
|
79
|
-
<%= text_field_tag :bill_to_phone, params[:bill_to_phone] %>
|
80
|
-
</p>
|
81
|
-
<br/>
|
82
|
-
<input type="checkbox" name="ship_to_billing" style="width:10px;" <%= if params[:ship_to_billing] == 'on' then raw('checked="checked"') end%> onclick="
|
83
|
-
if(this.checked){
|
84
|
-
Ext.get('shippingToBillingMessage').setStyle('display','');
|
85
|
-
Ext.get('shippingInfoDiv').setStyle('display','none');
|
86
|
-
Ext.get('shipToErrorMessages').setStyle('display','none');
|
87
|
-
}
|
88
|
-
else{
|
89
|
-
Ext.get('shippingInfoDiv').setStyle('display','');
|
90
|
-
Ext.get('shipToErrorMessages').setStyle('display','');
|
91
|
-
Ext.get('shippingToBillingMessage').setStyle('display','none');
|
92
|
-
}"/> Ship items to the above billing address
|
93
|
-
<br/>
|
94
|
-
<div class="form_settings">
|
95
|
-
<h2>Step 2 of 3 Shipping Information</h2>
|
96
|
-
<div style="color:red" id="shipToErrorMessages">
|
97
|
-
<%= raw @shipping_error_message%>
|
98
|
-
</div>
|
99
|
-
<p id="shippingToBillingMessage" <%= if params[:ship_to_billing].blank? then raw('style="display:none;"') end%>>Item(s) will be shipped to your billing address.</p>
|
100
|
-
<div id="shippingInfoDiv" <%= if params[:ship_to_billing] == 'on' then raw('style="display:none;"') end%>>
|
101
|
-
<p>
|
102
|
-
<span>First Name</span>
|
103
|
-
<%= text_field_tag :ship_to_first_name, params[:ship_to_first_name] %>
|
104
|
-
</p>
|
105
|
-
<p>
|
106
|
-
<span>Last Name</span>
|
107
|
-
<%= text_field_tag :ship_to_last_name, params[:ship_to_last_name] %>
|
108
|
-
</p>
|
109
|
-
<p>
|
110
|
-
<span>Address Line 1</span>
|
111
|
-
<%= text_field_tag :ship_to_address_line_1, params[:ship_to_address_line_1] %>
|
112
|
-
</p>
|
113
|
-
<p>
|
114
|
-
<span>Address Line 2</span>
|
115
|
-
<%= text_field_tag :ship_to_address_line_2, params[:ship_to_address_line_2] %>
|
116
|
-
</p>
|
117
|
-
<p>
|
118
|
-
<span>City</span>
|
119
|
-
<%= text_field_tag :ship_to_city, params[:ship_to_city] %>
|
120
|
-
</p>
|
121
|
-
<p>
|
122
|
-
<span>State</span>
|
123
|
-
<%= select_tag(:ship_to_state, options_for_select(GeoZone.all.collect{|item| [item.zone_name,item.zone_code]}, params[:ship_to_state])) %>
|
124
|
-
</p>
|
125
|
-
<p>
|
126
|
-
<span>Country</span>
|
127
|
-
<%= select_tag(:ship_to_country, options_for_select(GeoCountry.find_all_by_display(true).collect{|item| [item.name,item.iso_code_2]}, params[:ship_to_country])) %>
|
128
|
-
</p>
|
129
|
-
<p>
|
130
|
-
<span>Postal/Zip Code</span>
|
131
|
-
<%= text_field_tag :ship_to_postal_code, params[:ship_to_postal_code] %>
|
132
|
-
</p>
|
133
|
-
</div>
|
134
|
-
</div>
|
135
|
-
<hr/>
|
136
|
-
<p style="padding-top: 15px">
|
137
|
-
<%= submit_tag "Continue", :disable_with => "Please wait...", :class => "submit", :style => 'margin:0px;' %> | <a href="<%=@products_url%>">Back to store</a>
|
138
|
-
</p>
|
139
|
-
</div>
|
140
|
-
<%end%>
|
141
|
-
</div>
|
142
|
-
</div>
|
@@ -1 +0,0 @@
|
|
1
|
-
<script type="text/javascript">window.location.href = '/login'</script>
|
@@ -1,81 +0,0 @@
|
|
1
|
-
<div id="<%=widget_result_id%>">
|
2
|
-
<h2>What you're buying...</h2>
|
3
|
-
<table id="products-view">
|
4
|
-
<thead>
|
5
|
-
<tr>
|
6
|
-
<th>Product</th>
|
7
|
-
<th>Description</th>
|
8
|
-
<th>Quantity</th>
|
9
|
-
<th>Total</th>
|
10
|
-
<th>Remove</th>
|
11
|
-
</tr>
|
12
|
-
</thead>
|
13
|
-
<tbody>
|
14
|
-
<% @order.order_line_items.each do |order_line_item| %>
|
15
|
-
<tr class="product-wrap">
|
16
|
-
<td>
|
17
|
-
<div><img src="<%=order_line_item.product_type.images.empty? ? '/images/img_blank.png' : order_line_item.product_type.images.first.data.url%>" alt="Product Image" /></div>
|
18
|
-
<div>
|
19
|
-
<span><%= raw order_line_item.product_type.description %></span><br/>
|
20
|
-
</div>
|
21
|
-
</td>
|
22
|
-
<td><%= raw order_line_item.product_type.descriptions.find_by_internal_identifier('long_description').description%></td>
|
23
|
-
<td>1</td>
|
24
|
-
<td><%=link_to_remote 'Remove', build_widget_url(:remove_from_cart, order_line_item.id)%></td>
|
25
|
-
<td><span><%=order_line_item.product_type.get_current_simple_amount_with_currency.nil? ? 'no price set' : order_line_item.product_type.get_current_simple_amount_with_currency%></span></td>
|
26
|
-
</tr>
|
27
|
-
<%end%>
|
28
|
-
</tbody>
|
29
|
-
</table>
|
30
|
-
<hr/>
|
31
|
-
<div style="text-align:right;"><h2>Total <%=@price%></h2></div>
|
32
|
-
<hr/>
|
33
|
-
<%= form_remote_tag build_widget_url(:checkout_finalize), :id => 'checkout_finalize_form' do %>
|
34
|
-
<div class="form_settings">
|
35
|
-
<h2>Step 3 of 3 Pay for it...</h2>
|
36
|
-
<div id="errors" style="color:red">
|
37
|
-
<%=raw @message%>
|
38
|
-
</div>
|
39
|
-
<br/>
|
40
|
-
<p>
|
41
|
-
<span>First Name</span>
|
42
|
-
<%= text_field_tag :first_name, params[:first_name] %>
|
43
|
-
</p>
|
44
|
-
<p>
|
45
|
-
<span>Last Name</span>
|
46
|
-
<%= text_field_tag :last_name, params[:last_name] %>
|
47
|
-
</p>
|
48
|
-
<p>
|
49
|
-
<span>Credit Card Number</span>
|
50
|
-
<%= text_field_tag :card_number, params[:card_number] %>
|
51
|
-
</p>
|
52
|
-
<p>
|
53
|
-
<span>Expiration Month</span>
|
54
|
-
<%= select_tag(:exp_month,
|
55
|
-
options_for_select([["1 - January", 1],
|
56
|
-
["2 - Febuary", 2],
|
57
|
-
["3 - March",3],
|
58
|
-
["4 - April",4],
|
59
|
-
["5 - May",5],
|
60
|
-
["6 - June",6],
|
61
|
-
["7 - July",7],
|
62
|
-
["8 - August",8],
|
63
|
-
["9 - September",9],
|
64
|
-
["10 - October",10],
|
65
|
-
["11 - November",11],
|
66
|
-
["12 - December",12]], params[:exp_month])) %>
|
67
|
-
</p>
|
68
|
-
<p>
|
69
|
-
<span>Expiration Year</span>
|
70
|
-
<%= select_tag(:exp_year, options_for_select((0..30).collect{|addition| Date.today.year + addition}, params[:exp_year])) %>
|
71
|
-
</p>
|
72
|
-
<p>
|
73
|
-
<span>Card Security Code</span>
|
74
|
-
<%= text_field_tag :cvvs, params[:cvvs] %>
|
75
|
-
</p>
|
76
|
-
<p style="padding-top: 15px">
|
77
|
-
<%= submit_tag "Purchase", :disable_with => "Please wait...", :class => "submit", :style => 'margin:0px;' %> | <a href="<%=@products_url%>">Back to store</a>
|
78
|
-
</p>
|
79
|
-
</div>
|
80
|
-
<%end%>
|
81
|
-
</div>
|
@@ -1,66 +0,0 @@
|
|
1
|
-
require 'active_merchant'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
module ErpCommerce
|
5
|
-
module ActiveMerchantWrappers
|
6
|
-
class AuthorizeNetWrapper
|
7
|
-
|
8
|
-
def self.purchase(credit_card, amount, cvv, gateway_options={})
|
9
|
-
result = {}
|
10
|
-
|
11
|
-
login_information = YAML.load_file(File.join(Rails.root, 'config/authorize_net.yml')).symbolize_keys
|
12
|
-
|
13
|
-
#setup gateway
|
14
|
-
gateway = ActiveMerchant::Billing::AuthorizeNetGateway.new(login_information)
|
15
|
-
|
16
|
-
#set credit card info
|
17
|
-
credit_card_result = ActiveMerchant::Billing::CreditCard.new({
|
18
|
-
:first_name => credit_card.first_name_on_card,
|
19
|
-
:last_name => credit_card.last_name_on_card,
|
20
|
-
:number => credit_card.private_card_number,
|
21
|
-
:month => credit_card.expiration_month,
|
22
|
-
:year => credit_card.expiration_year,
|
23
|
-
:verification_value => cvv,
|
24
|
-
:brand => ErpCommerce::ActiveMerchantWrappers::CreditCardValidation.get_card_type(credit_card.private_card_number)
|
25
|
-
})
|
26
|
-
|
27
|
-
if credit_card_result.valid?
|
28
|
-
cents = (amount.to_d * 100)
|
29
|
-
response = gateway.purchase(cents, credit_card_result, gateway_options)
|
30
|
-
|
31
|
-
if response.success?
|
32
|
-
result[:message] = response.message
|
33
|
-
result[:payment] = Payment.new
|
34
|
-
result[:payment].authorization_code = response.authorization
|
35
|
-
result[:payment].success = true
|
36
|
-
result[:payment].purchase
|
37
|
-
else
|
38
|
-
result[:message] = response.message
|
39
|
-
result[:payment] = Payment.new
|
40
|
-
result[:payment].success = false
|
41
|
-
result[:payment].decline
|
42
|
-
end
|
43
|
-
|
44
|
-
gateway = PaymentGateway.create(
|
45
|
-
:response => response.message,
|
46
|
-
:payment_gateway_action => PaymentGatewayAction.find_by_internal_identifier('authorize')
|
47
|
-
)
|
48
|
-
|
49
|
-
result[:payment].payment_gateways << gateway
|
50
|
-
result[:payment].save
|
51
|
-
else
|
52
|
-
result[:message] = "<ul>"
|
53
|
-
credit_card_result.errors.full_messages.each do |current_notice_msg|
|
54
|
-
result[:message] << "<li>"
|
55
|
-
result[:message] << current_notice_msg
|
56
|
-
result[:message] << "</li>"
|
57
|
-
end
|
58
|
-
result[:message] << "<ul>"
|
59
|
-
end
|
60
|
-
|
61
|
-
result
|
62
|
-
end
|
63
|
-
|
64
|
-
end #AuthorizeNetWrapper
|
65
|
-
end #ActiveMerchantWrapper
|
66
|
-
end #ErpCommerce
|
@@ -1,68 +0,0 @@
|
|
1
|
-
require 'active_merchant'
|
2
|
-
|
3
|
-
module ErpCommerce
|
4
|
-
module ActiveMerchantWrappers
|
5
|
-
class BrainTreeGatewayWrapper
|
6
|
-
|
7
|
-
def self.purchase(credit_card, amount, cvv, gateway_options={})
|
8
|
-
result = {}
|
9
|
-
|
10
|
-
#this needs config options
|
11
|
-
gateway_options.merge!({:login => 'demo', :password => 'password'})
|
12
|
-
|
13
|
-
ActiveMerchant::Billing::Base.mode = :test
|
14
|
-
|
15
|
-
#setup gateway
|
16
|
-
gateway = ActiveMerchant::Billing::BraintreeGateway.new(gateway_options)
|
17
|
-
|
18
|
-
#set credit card info
|
19
|
-
credit_card_result = ActiveMerchant::Billing::CreditCard.new({
|
20
|
-
:first_name => credit_card.first_name_on_card,
|
21
|
-
:last_name => credit_card.last_name_on_card,
|
22
|
-
:number => credit_card.private_card_number,
|
23
|
-
:month => credit_card.expiration_month,
|
24
|
-
:year => credit_card.expiration_year,
|
25
|
-
:verification_value => cvv,
|
26
|
-
:type => ErpCommerce::ActiveMerchantWrappers::CreditCardValidation.get_card_type(credit_card.private_card_number)
|
27
|
-
})
|
28
|
-
|
29
|
-
if credit_card_result.valid?
|
30
|
-
cents = (amount.to_d * 100)
|
31
|
-
response = gateway.purchase(cents, credit_card_result)
|
32
|
-
|
33
|
-
if response.success?
|
34
|
-
result[:message] = response.message
|
35
|
-
result[:payment] = Payment.new
|
36
|
-
result[:payment].authorization_code = response.authorization
|
37
|
-
result[:payment].success = true
|
38
|
-
result[:payment].purchase
|
39
|
-
else
|
40
|
-
result[:message] = response.message
|
41
|
-
result[:payment] = Payment.new
|
42
|
-
result[:payment].success = false
|
43
|
-
result[:payment].decline
|
44
|
-
end
|
45
|
-
|
46
|
-
gateway = PaymentGateway.create(
|
47
|
-
:response => response.message,
|
48
|
-
:payment_gateway_action => PaymentGatewayAction.find_by_internal_identifier('authorize')
|
49
|
-
)
|
50
|
-
|
51
|
-
result[:payment].payment_gateways << gateway
|
52
|
-
result[:payment].save
|
53
|
-
else
|
54
|
-
result[:message] = "<ul>"
|
55
|
-
credit_card_result.errors.full_messages.each do |current_notice_msg|
|
56
|
-
result[:message] << "<li>"
|
57
|
-
result[:message] << current_notice_msg
|
58
|
-
result[:message] << "</li>"
|
59
|
-
end
|
60
|
-
result[:message] << "<ul>"
|
61
|
-
end
|
62
|
-
|
63
|
-
result
|
64
|
-
end
|
65
|
-
|
66
|
-
end#BrainTreeGatewayWrapper
|
67
|
-
end#ActiveMerchantWrappers
|
68
|
-
end#ErpCommerce
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# To change this template, choose Tools | Templates
|
2
|
-
# and open the template in the editor.
|
3
|
-
|
4
|
-
module ErpCommerce
|
5
|
-
module ActiveMerchantWrappers
|
6
|
-
module CreditCardValidation
|
7
|
-
VISA_PATTERN = /^4[0-9]{12}(?:[0-9]{3})?$/
|
8
|
-
MASTER_CARD_PATTERN = /^5[1-5][0-9]{14}$/
|
9
|
-
AMEX_PATTERN = /^3[47][0-9]{13}$'/
|
10
|
-
DINERS_CLUB_PATTERN = /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/
|
11
|
-
DISCOVER_PATTERN = /^6(?:011|5[0-9]{2})[0-9]{12}$/
|
12
|
-
|
13
|
-
|
14
|
-
def self.get_card_type(number)
|
15
|
-
card_type = nil
|
16
|
-
|
17
|
-
if number =~ VISA_PATTERN
|
18
|
-
card_type = 'visa'
|
19
|
-
elsif number =~ MASTER_CARD_PATTERN
|
20
|
-
card_type = 'master'
|
21
|
-
elsif number =~ AMEX_PATTERN
|
22
|
-
card_type = 'american_express'
|
23
|
-
elsif number =~ DINERS_CLUB_PATTERN
|
24
|
-
card_type = 'diners_club'
|
25
|
-
elsif number =~ DISCOVER_PATTERN
|
26
|
-
card_type = 'discover'
|
27
|
-
end
|
28
|
-
|
29
|
-
card_type
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,245 +0,0 @@
|
|
1
|
-
module ErpCommerce
|
2
|
-
class OrderHelper
|
3
|
-
attr_accessor :widget
|
4
|
-
delegate :params, :session, :request, :logger, :current_user, :to => :widget
|
5
|
-
|
6
|
-
def initialize(widget)
|
7
|
-
self.widget = widget
|
8
|
-
end
|
9
|
-
|
10
|
-
def get_order(create=nil)
|
11
|
-
order = nil
|
12
|
-
unless session['order_txn_id'].nil?
|
13
|
-
order = OrderTxn.where('id = ?',session['order_txn_id']).first
|
14
|
-
order = create_order if order.nil?
|
15
|
-
else
|
16
|
-
order = create_order if create
|
17
|
-
end
|
18
|
-
order
|
19
|
-
end
|
20
|
-
|
21
|
-
#add a product type to cart
|
22
|
-
def add_to_cart(product_type)
|
23
|
-
order = get_order(true)
|
24
|
-
|
25
|
-
#see if we need to update quantity or create new line item
|
26
|
-
order_line_item = get_line_item_for_product_type(product_type)
|
27
|
-
if order_line_item.nil? || order_line_item.empty?
|
28
|
-
#create order line item
|
29
|
-
order_line_item = order.add_line_item(product_type)
|
30
|
-
|
31
|
-
#get pricing plan and create charge lines
|
32
|
-
pricing_plan = product_type.get_current_simple_plan
|
33
|
-
money = Money.create(
|
34
|
-
:description => pricing_plan.description,
|
35
|
-
:amount => pricing_plan.money_amount,
|
36
|
-
:currency => pricing_plan.currency)
|
37
|
-
|
38
|
-
charge_line = ChargeLine.create(
|
39
|
-
:charged_item => order_line_item,
|
40
|
-
:money => money,
|
41
|
-
:description => pricing_plan.description)
|
42
|
-
charge_line.save
|
43
|
-
order_line_item.charge_lines << charge_line
|
44
|
-
order.status = 'Items Added'
|
45
|
-
order.save
|
46
|
-
else
|
47
|
-
#update quantity
|
48
|
-
end
|
49
|
-
order
|
50
|
-
end
|
51
|
-
|
52
|
-
#set billing information
|
53
|
-
def set_demographic_info(params)
|
54
|
-
order = get_order
|
55
|
-
|
56
|
-
#if biz txn party roles have not been setup set them up
|
57
|
-
if order.root_txn.biz_txn_party_roles.nil? || order.root_txn.biz_txn_party_roles.empty?
|
58
|
-
setup_biz_txn_party_roles(order)
|
59
|
-
end
|
60
|
-
|
61
|
-
party = self.current_user.party
|
62
|
-
|
63
|
-
#set billing information on party
|
64
|
-
#get geo codes
|
65
|
-
geo_country = GeoCountry.find_by_iso_code_2(params[:bill_to_country])
|
66
|
-
geo_zone = GeoZone.find_by_zone_code(params[:bill_to_state])
|
67
|
-
party.update_or_add_contact_with_purpose(PostalAddress, ContactPurpose.billing,
|
68
|
-
{
|
69
|
-
:address_line_1 => params[:bill_to_address_line_1],
|
70
|
-
:address_line_2 => params[:bill_to_address_line_2],
|
71
|
-
:city => params[:bill_to_city],
|
72
|
-
:state => geo_zone.zone_name,
|
73
|
-
:zip => params[:bill_to_postal_code],
|
74
|
-
:country => geo_country.name
|
75
|
-
})
|
76
|
-
billing_postal_address = party.find_contact_mechanism_with_purpose(PostalAddress, ContactPurpose.billing)
|
77
|
-
billing_postal_address.geo_country = geo_country
|
78
|
-
billing_postal_address.geo_zone = geo_zone
|
79
|
-
billing_postal_address.save
|
80
|
-
|
81
|
-
#set shipping information on party
|
82
|
-
#same as billing us billing info
|
83
|
-
if params[:ship_to_billing] == 'on'
|
84
|
-
#get geo codes
|
85
|
-
geo_country = GeoCountry.find_by_iso_code_2(params[:bill_to_country])
|
86
|
-
geo_zone = GeoZone.find_by_zone_code(params[:bill_to_state])
|
87
|
-
party.update_or_add_contact_with_purpose(PostalAddress, ContactPurpose.shipping,
|
88
|
-
{
|
89
|
-
:address_line_1 => params[:bill_to_address_line_1],
|
90
|
-
:address_line_2 => params[:bill_to_address_line_2],
|
91
|
-
:city => params[:bill_to_city],
|
92
|
-
:state => geo_zone.zone_name,
|
93
|
-
:zip => params[:bill_to_postal_code],
|
94
|
-
:country => geo_country.name
|
95
|
-
})
|
96
|
-
shipping_postal_address = party.find_contact_mechanism_with_purpose(PostalAddress, ContactPurpose.shipping)
|
97
|
-
shipping_postal_address.geo_country = geo_country
|
98
|
-
shipping_postal_address.geo_zone = geo_zone
|
99
|
-
shipping_postal_address.save
|
100
|
-
else
|
101
|
-
#get geo codes
|
102
|
-
geo_country = GeoCountry.find_by_iso_code_2(params[:ship_to_country])
|
103
|
-
geo_zone = GeoZone.find_by_zone_code(params[:ship_to_state])
|
104
|
-
party.update_or_add_contact_with_purpose(PostalAddress, ContactPurpose.shipping,
|
105
|
-
{
|
106
|
-
:address_line_1 => params[:ship_to_address_line_1],
|
107
|
-
:address_line_2 => params[:ship_to_address_line_2],
|
108
|
-
:city => params[:ship_to_city],
|
109
|
-
:state => geo_zone.zone_name,
|
110
|
-
:zip => params[:ship_to_postal_code],
|
111
|
-
:country => geo_country.name
|
112
|
-
})
|
113
|
-
shipping_postal_address = party.find_contact_mechanism_with_purpose(PostalAddress, ContactPurpose.shipping)
|
114
|
-
shipping_postal_address.geo_country = geo_country
|
115
|
-
shipping_postal_address.geo_zone = geo_zone
|
116
|
-
shipping_postal_address.save
|
117
|
-
end
|
118
|
-
|
119
|
-
#set phone and email
|
120
|
-
party.update_or_add_contact_with_purpose(PhoneNumber, ContactPurpose.billing, {:phone_number => params[:bill_to_phone]})
|
121
|
-
party.update_or_add_contact_with_purpose(EmailAddress, ContactPurpose.billing, {:email_address => params[:bill_to_email]})
|
122
|
-
|
123
|
-
#set billing and shipping info on order
|
124
|
-
order.set_shipping_info(party)
|
125
|
-
order.set_billing_info(party)
|
126
|
-
|
127
|
-
#update status
|
128
|
-
order.status = 'Demographics Gathered'
|
129
|
-
order.save
|
130
|
-
|
131
|
-
order
|
132
|
-
end
|
133
|
-
|
134
|
-
#complete the order
|
135
|
-
def complete_order(params, charge_credit_card=true)
|
136
|
-
success = true
|
137
|
-
message = nil
|
138
|
-
order = get_order
|
139
|
-
|
140
|
-
if charge_credit_card
|
141
|
-
#make credit financial txns and payment txns
|
142
|
-
#create financial txn for order
|
143
|
-
financial_txn = create_financial_txns(order)
|
144
|
-
|
145
|
-
credit_card = CreditCard.new(
|
146
|
-
:first_name_on_card => params[:first_name],
|
147
|
-
:last_name_on_card => params[:last_name],
|
148
|
-
:expiration_month => params[:exp_month],
|
149
|
-
:expiration_year => params[:exp_year]
|
150
|
-
)
|
151
|
-
credit_card.card_number = params[:card_number]
|
152
|
-
result = CreditCardAccount.new.purchase(financial_txn, params[:cvvs], ErpCommerce::Config.active_merchant_gateway_wrapper, {}, credit_card)
|
153
|
-
|
154
|
-
#make sure cedit card payment was successful
|
155
|
-
if result[:payment].nil? or !result[:payment].success
|
156
|
-
success = false
|
157
|
-
message = result[:message]
|
158
|
-
order.status = 'Credit Card Failed'
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
if success
|
163
|
-
order.status = 'Pending Shipment'
|
164
|
-
#update inventory counts
|
165
|
-
#should be moved to model somewhere
|
166
|
-
order.order_line_items.each do |oli|
|
167
|
-
inventory_entry = oli.product_type.inventory_entries.first
|
168
|
-
inventory_entry.number_available -= 1
|
169
|
-
inventory_entry.number_sold += 1
|
170
|
-
inventory_entry.save
|
171
|
-
end
|
172
|
-
#clear order from session
|
173
|
-
clear_order
|
174
|
-
end
|
175
|
-
|
176
|
-
order.save
|
177
|
-
return success, message, order, result[:payment]
|
178
|
-
end
|
179
|
-
|
180
|
-
#remove line item
|
181
|
-
def remove_from_cart(order_line_item_id)
|
182
|
-
order = get_order
|
183
|
-
|
184
|
-
order.line_items.find(order_line_item_id).destroy
|
185
|
-
|
186
|
-
order
|
187
|
-
end
|
188
|
-
|
189
|
-
private
|
190
|
-
|
191
|
-
def get_line_item_for_product_type(product_type)
|
192
|
-
order = get_order(true)
|
193
|
-
order.line_items.select{|oli| oli.product_type == product_type.id}
|
194
|
-
end
|
195
|
-
|
196
|
-
def clear_order
|
197
|
-
session['order_txn_id'] = nil
|
198
|
-
end
|
199
|
-
|
200
|
-
def create_order
|
201
|
-
order = OrderTxn.create
|
202
|
-
order.status = 'Initialized'
|
203
|
-
order.order_number = (Time.now.to_i / (rand(100)+2)).round
|
204
|
-
order.save
|
205
|
-
session['order_txn_id'] = order.id
|
206
|
-
setup_biz_txn_party_roles(order) unless self.current_user.nil?
|
207
|
-
order
|
208
|
-
end
|
209
|
-
|
210
|
-
#sets up payor party role
|
211
|
-
def setup_biz_txn_party_roles(order)
|
212
|
-
payor_role = BizTxnPartyRoleType.find_by_internal_identifier('payor')
|
213
|
-
biz_txn_event = order.root_txn
|
214
|
-
tpr = BizTxnPartyRole.new
|
215
|
-
tpr.biz_txn_event = biz_txn_event
|
216
|
-
tpr.party = self.current_user.party
|
217
|
-
tpr.biz_txn_party_role_type = payor_role
|
218
|
-
tpr.save
|
219
|
-
end
|
220
|
-
|
221
|
-
#create financial_txn for charge lines
|
222
|
-
def create_financial_txns(order)
|
223
|
-
#total up all order line items charge lines
|
224
|
-
total_payment = 0
|
225
|
-
currency = nil
|
226
|
-
order.get_total_charges.each do |money|
|
227
|
-
total_payment += money.amount
|
228
|
-
currency = money.currency
|
229
|
-
end
|
230
|
-
|
231
|
-
financial_txn = FinancialTxn.create(:money => Money.create(:description => 'Order Payment', :amount => total_payment, :currency => currency))
|
232
|
-
financial_txn.description = 'Order Payment'
|
233
|
-
financial_txn.txn_type = BizTxnType.iid('payment_txn')
|
234
|
-
financial_txn.save
|
235
|
-
|
236
|
-
order.get_all_charge_lines.each do |charge_line|
|
237
|
-
charge_line.add_payment_txn(financial_txn)
|
238
|
-
charge_line.save
|
239
|
-
end
|
240
|
-
|
241
|
-
financial_txn
|
242
|
-
end
|
243
|
-
|
244
|
-
end#ErpCommerce
|
245
|
-
end#OrderHelper
|