erp_commerce 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.
Files changed (108) hide show
  1. data/GPL-3-LICENSE +674 -0
  2. data/README.rdoc +2 -0
  3. data/Rakefile +32 -0
  4. data/app/assets/javascripts/erp_commerce/application.js +9 -0
  5. data/app/assets/stylesheets/erp_commerce/application.css +7 -0
  6. data/app/controllers/erp_commerce/application_controller.rb +4 -0
  7. data/app/helpers/erp_commerce/application_helper.rb +4 -0
  8. data/app/models/credit_card.rb +54 -0
  9. data/app/models/credit_card_account.rb +4 -0
  10. data/app/models/credit_card_account_party_role.rb +8 -0
  11. data/app/models/credit_card_account_purpose.rb +6 -0
  12. data/app/models/credit_card_token.rb +12 -0
  13. data/app/models/extensions/charge_line.rb +3 -0
  14. data/app/models/extensions/currency.rb +3 -0
  15. data/app/models/extensions/financial_txn.rb +3 -0
  16. data/app/models/extensions/order_txn.rb +3 -0
  17. data/app/models/extensions/party.rb +21 -0
  18. data/app/models/extensions/product_instance.rb +5 -0
  19. data/app/models/extensions/product_type.rb +3 -0
  20. data/app/models/fee.rb +7 -0
  21. data/app/models/fee_type.rb +4 -0
  22. data/app/models/payment.rb +38 -0
  23. data/app/models/payment_gateway.rb +4 -0
  24. data/app/models/payment_gateway_action.rb +2 -0
  25. data/app/models/price.rb +25 -0
  26. data/app/models/price_component.rb +8 -0
  27. data/app/models/price_component_type.rb +3 -0
  28. data/app/models/pricing_plan.rb +37 -0
  29. data/app/models/pricing_plan_assignment.rb +6 -0
  30. data/app/models/pricing_plan_component.rb +36 -0
  31. data/app/models/valid_price_plan_component.rb +8 -0
  32. data/app/views/layouts/erp_commerce/application.html.erb +14 -0
  33. data/app/widgets/orders/base.rb +40 -0
  34. data/app/widgets/orders/javascript/orders.js +11 -0
  35. data/app/widgets/orders/views/index.html.erb +63 -0
  36. data/app/widgets/product_catalog/base.rb +56 -0
  37. data/app/widgets/product_catalog/javascript/product_catalog.js +62 -0
  38. data/app/widgets/product_catalog/views/add_to_cart.html.erb +10 -0
  39. data/app/widgets/product_catalog/views/index.html.erb +69 -0
  40. data/app/widgets/product_catalog/views/show.html.erb +23 -0
  41. data/app/widgets/shopping_cart/base.rb +178 -0
  42. data/app/widgets/shopping_cart/javascript/shopping_cart.js +107 -0
  43. data/app/widgets/shopping_cart/views/cart_items.html.erb +83 -0
  44. data/app/widgets/shopping_cart/views/confirmation.html.erb +10 -0
  45. data/app/widgets/shopping_cart/views/demographics.html.erb +142 -0
  46. data/app/widgets/shopping_cart/views/login.html.erb +1 -0
  47. data/app/widgets/shopping_cart/views/payment.html.erb +81 -0
  48. data/app/widgets/shopping_cart/views/price_summary.html.erb +4 -0
  49. data/config/routes.rb +2 -0
  50. data/db/data_migrations/20101011152441_payment_gateway_actions.rb +27 -0
  51. data/db/migrate/20100823174238_erp_commerce_base.rb +174 -0
  52. data/db/migrate/20100913154134_setup_payments.rb +57 -0
  53. data/db/migrate/20101103132342_pricing_migrations.rb +169 -0
  54. data/db/migrate/20110921150854_create_fees.rb +50 -0
  55. data/lib/erp_commerce/active_merchant_wrappers/brain_tree_gateway_wrapper.rb +66 -0
  56. data/lib/erp_commerce/active_merchant_wrappers/credit_card_validation.rb +34 -0
  57. data/lib/erp_commerce/active_merchant_wrappers.rb +2 -0
  58. data/lib/erp_commerce/engine.rb +15 -0
  59. data/lib/erp_commerce/extensions/active_record/acts_as_fee.rb +64 -0
  60. data/lib/erp_commerce/extensions/active_record/acts_as_priceable.rb +57 -0
  61. data/lib/erp_commerce/extensions.rb +2 -0
  62. data/lib/erp_commerce/order_helper.rb +254 -0
  63. data/lib/erp_commerce/version.rb +3 -0
  64. data/lib/erp_commerce.rb +8 -0
  65. data/lib/tasks/erp_commerce_tasks.rake +4 -0
  66. data/spec/dummy/Rakefile +7 -0
  67. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  68. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  69. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  70. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  71. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  72. data/spec/dummy/config/application.rb +49 -0
  73. data/spec/dummy/config/boot.rb +10 -0
  74. data/spec/dummy/config/database.yml +8 -0
  75. data/spec/dummy/config/environment.rb +5 -0
  76. data/spec/dummy/config/environments/spec.rb +27 -0
  77. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  78. data/spec/dummy/config/initializers/inflections.rb +10 -0
  79. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  80. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  81. data/spec/dummy/config/initializers/session_store.rb +8 -0
  82. data/spec/dummy/config/initializers/wrap_parameters.rb +12 -0
  83. data/spec/dummy/config/locales/en.yml +5 -0
  84. data/spec/dummy/config/routes.rb +3 -0
  85. data/spec/dummy/config.ru +4 -0
  86. data/spec/dummy/public/404.html +26 -0
  87. data/spec/dummy/public/422.html +26 -0
  88. data/spec/dummy/public/500.html +26 -0
  89. data/spec/dummy/public/favicon.ico +0 -0
  90. data/spec/dummy/script/rails +6 -0
  91. data/spec/models/credit_card_account_party_role_spec.rb +11 -0
  92. data/spec/models/credit_card_account_purpose_spec.rb +11 -0
  93. data/spec/models/credit_card_account_spec.rb +11 -0
  94. data/spec/models/credit_card_spec.rb +11 -0
  95. data/spec/models/fee_spec.rb +11 -0
  96. data/spec/models/fee_type_spec.rb +11 -0
  97. data/spec/models/payment_gateway_action_spec.rb +11 -0
  98. data/spec/models/payment_gateway_spec.rb +11 -0
  99. data/spec/models/payment_spec.rb +11 -0
  100. data/spec/models/price_component_spec.rb +11 -0
  101. data/spec/models/price_component_type_spec.rb +11 -0
  102. data/spec/models/price_spec.rb +11 -0
  103. data/spec/models/pricing_plan_assignment_spec.rb +11 -0
  104. data/spec/models/pricing_plan_component_spec.rb +11 -0
  105. data/spec/models/pricing_plan_spec.rb +11 -0
  106. data/spec/models/valid_price_plan_component_spec.rb +11 -0
  107. data/spec/spec_helper.rb +60 -0
  108. metadata +285 -0
@@ -0,0 +1,81 @@
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>
@@ -0,0 +1,4 @@
1
+ <a style="float:right;width:75px;" href="<%=@cart_items_url%>" id="shopping-cart-link">
2
+ <span><%=@item_count%> items<br/><%=@price%></span>
3
+ <img style="float:right;" src="/images/icons/shoppingcart_full/shoppingcart_full_24x24.png" alt="Check Out" />
4
+ </a>
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ ErpCommerce::Engine.routes.draw do
2
+ end
@@ -0,0 +1,27 @@
1
+ class PaymentGatewayActions
2
+
3
+ def self.up
4
+ PaymentGatewayAction.create(
5
+ :internal_identifier => 'capture',
6
+ :description => 'capture'
7
+ )
8
+
9
+ PaymentGatewayAction.create(
10
+ :internal_identifier => 'authorize',
11
+ :description => 'Authorize'
12
+ )
13
+
14
+ PaymentGatewayAction.create(
15
+ :internal_identifier => 'full_reverse_of_authorization',
16
+ :description => 'Full Reverse Of Authorization'
17
+ )
18
+ end
19
+
20
+ def self.down
21
+ ['sale','void_sale','authorize'].each do |iid|
22
+ type = PaymentGatewayAction.find_by_internal_identifier(iid)
23
+ type.destroy unless type.nil?
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,174 @@
1
+ class ErpCommerceBase < ActiveRecord::Migration
2
+ def self.up
3
+ #tables
4
+ unless table_exists?(:credit_cards)
5
+ create_table :credit_cards do |t|
6
+
7
+ t.column :crypted_private_card_number, :string
8
+ t.column :expiration_month, :integer
9
+ t.column :expiration_year, :integer
10
+
11
+ t.column :description, :string
12
+ t.column :first_name_on_card, :string
13
+ t.column :last_name_on_card, :string
14
+ t.column :card_type, :string
15
+
16
+ t.column :postal_address_id, :integer
17
+ t.column :credit_card_account_party_role_id, :integer
18
+ t.column :credit_card_account_purpose_id, :integer
19
+ t.column :credit_card_token, :string
20
+
21
+ t.timestamps
22
+ end
23
+ end
24
+
25
+ unless table_exists?(:credit_card_accounts)
26
+ create_table :credit_card_accounts do |t|
27
+
28
+ t.timestamps
29
+ end
30
+ end
31
+
32
+ unless table_exists?(:credit_card_account_party_roles)
33
+ create_table :credit_card_account_party_roles do |t|
34
+ t.column :credit_card_account_id, :integer
35
+ t.column :role_type_id, :integer
36
+ t.column :party_id, :integer
37
+
38
+ t.timestamps
39
+ end
40
+
41
+ add_index :credit_card_account_party_roles, :credit_card_account_id
42
+ add_index :credit_card_account_party_roles, :role_type_id
43
+ add_index :credit_card_account_party_roles, :party_id
44
+ end
45
+
46
+ unless table_exists?(:credit_card_account_purposes)
47
+ create_table :credit_card_account_purposes do |t|
48
+
49
+ t.column :parent_id, :integer
50
+ t.column :lft, :integer
51
+ t.column :rgt, :integer
52
+
53
+ #custom columns go here
54
+
55
+ t.column :description, :string
56
+ t.column :comments, :string
57
+
58
+ t.column :internal_identifier, :string
59
+ t.column :external_identifier, :string
60
+ t.column :external_id_source, :string
61
+
62
+ t.timestamps
63
+ end
64
+ end
65
+ #end tables
66
+
67
+ #columns
68
+ unless columns(:order_txns).collect {|c| c.name}.include?('payment_gateway_txn_id')
69
+ add_column :order_txns, :payment_gateway_txn_id, :string
70
+ end
71
+
72
+ unless columns(:order_txns).collect {|c| c.name}.include?('credit_card_id')
73
+ add_column :order_txns, :credit_card_id, :integer
74
+ end
75
+
76
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_first_name')
77
+ add_column :order_txns, :bill_to_first_name, :string
78
+ end
79
+
80
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_last_name')
81
+ add_column :order_txns, :bill_to_last_name, :string
82
+ end
83
+
84
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_address_line_1')
85
+ add_column :order_txns, :bill_to_address_line_1, :string
86
+ end
87
+
88
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_address_line_2')
89
+ add_column :order_txns, :bill_to_address_line_2, :string
90
+ end
91
+
92
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_city')
93
+ add_column :order_txns, :bill_to_city, :string
94
+ end
95
+
96
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_state')
97
+ add_column :order_txns, :bill_to_state, :string
98
+ end
99
+
100
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_postal_code')
101
+ add_column :order_txns, :bill_to_postal_code, :string
102
+ end
103
+
104
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_country')
105
+ add_column :order_txns, :bill_to_country, :string
106
+ end
107
+
108
+ unless columns(:order_txns).collect {|c| c.name}.include?('bill_to_country_name')
109
+ rename_column :order_txns, :bill_to_country, :bill_to_country_name
110
+ rename_column :order_txns, :ship_to_country, :ship_to_country_name
111
+ add_column :order_txns, :bill_to_country, :string
112
+ add_column :order_txns, :ship_to_country, :string
113
+ end
114
+ #end
115
+ end
116
+
117
+ def self.down
118
+
119
+ if columns(:order_txns).collect {|c| c.name}.include?('payment_gateway_txn_id')
120
+ remove_column :order_txns, :payment_gateway_txn_id
121
+ end
122
+
123
+ if columns(:order_txns).collect {|c| c.name}.include?('credit_card_id')
124
+ remove_column :order_txns, :credit_card_id, :integer
125
+ end
126
+
127
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_first_name')
128
+ remove_column :order_txns, :bill_to_first_name, :string
129
+ end
130
+
131
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_last_name')
132
+ remove_column :order_txns, :bill_to_last_name, :string
133
+ end
134
+
135
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_address')
136
+ remove_column :order_txns, :bill_to_address, :string
137
+ end
138
+
139
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_city')
140
+ remove_column :order_txns, :bill_to_city, :string
141
+ end
142
+
143
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_state')
144
+ remove_column :order_txns, :bill_to_state, :string
145
+ end
146
+
147
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_postal_code')
148
+ remove_column :order_txns, :bill_to_postal_code, :string
149
+ end
150
+
151
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_country')
152
+ remove_column :order_txns, :bill_to_country, :string
153
+ end
154
+
155
+ if columns(:order_txns).collect {|c| c.name}.include?('bill_to_country_name')
156
+ remove_column :order_txns, :bill_to_country, :bill_to_country_name
157
+ remove_column :order_txns, :ship_to_country, :ship_to_country_name
158
+ end
159
+
160
+ #tables
161
+ drop_tables = [
162
+ :credit_cards,
163
+ :credit_card_accounts,
164
+ :credit_card_account_party_roles,
165
+ :credit_card_account_purposes
166
+ ]
167
+ drop_tables.each do |table|
168
+ if table_exists?(table)
169
+ drop_table table
170
+ end
171
+ end
172
+
173
+ end
174
+ end
@@ -0,0 +1,57 @@
1
+ class SetupPayments < ActiveRecord::Migration
2
+ def self.up
3
+
4
+ unless table_exists?(:payments)
5
+ create_table :payments do |t|
6
+
7
+ t.column :success, :boolean
8
+ t.column :reference_number, :string
9
+ t.column :financial_txn_id, :integer
10
+ t.column :current_state, :string
11
+ t.column :authorization_code, :string
12
+
13
+ t.timestamps
14
+ end
15
+
16
+ add_index :payments, :financial_txn_id
17
+ end
18
+
19
+ unless table_exists?(:payment_gateways)
20
+ create_table :payment_gateways do |t|
21
+
22
+ t.column :params, :string
23
+ t.column :payment_gateway_action_id, :integer
24
+ t.column :payment_id, :integer
25
+ t.column :response, :string
26
+
27
+ t.timestamps
28
+ end
29
+ end
30
+
31
+ unless table_exists?(:payment_gateway_actions)
32
+ create_table :payment_gateway_actions do |t|
33
+
34
+ t.column :internal_identifier, :string
35
+ t.column :description, :string
36
+
37
+ t.timestamps
38
+ end
39
+ end
40
+
41
+ add_index :payment_gateway_actions, :internal_identifier
42
+ end
43
+
44
+ def self.down
45
+ drop_tables = [
46
+ :payments,
47
+ :payment_gateways,
48
+ :payment_gateway_actions
49
+ ]
50
+ drop_tables.each do |table|
51
+ if table_exists?(table)
52
+ drop_table table
53
+ end
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,169 @@
1
+ class PricingMigrations < ActiveRecord::Migration
2
+ def self.up
3
+
4
+ #tables
5
+ unless table_exists?(:price_component_types)
6
+ create_table :price_component_types do |t|
7
+
8
+ t.string :description
9
+ t.string :internal_identifier
10
+ t.string :external_identifier
11
+ t.string :external_id_source
12
+
13
+ t.timestamps
14
+ end
15
+ end
16
+
17
+ unless table_exists?(:pricing_plans)
18
+ create_table :pricing_plans do |t|
19
+
20
+ t.string :description
21
+ t.string :comments
22
+
23
+ t.string :internal_identifier
24
+
25
+ t.string :external_identifier
26
+ t.string :external_id_source
27
+
28
+ t.date :from_date
29
+ t.date :thru_date
30
+
31
+ #this is here as a placeholder for an 'interpreter' or 'rule' pattern
32
+ t.string :matching_rules
33
+ #this is here as a placeholder for an 'interpreter' or 'rule' pattern
34
+ t.string :pricing_calculation
35
+
36
+ #support for simple assignment of a single money amount
37
+ t.boolean :is_simple_amount
38
+ t.integer :currency_id
39
+ t.float :money_amount
40
+
41
+ t.timestamps
42
+ end
43
+ end
44
+
45
+ unless table_exists?(:pricing_plan_components)
46
+ create_table :pricing_plan_components do |t|
47
+
48
+ t.integer :price_component_type_id
49
+ t.string :description
50
+ t.string :comments
51
+
52
+ t.string :internal_identifier
53
+ t.string :external_identifier
54
+ t.string :external_id_source
55
+
56
+
57
+ #this is here as a placeholder for an 'interpreter' or 'rule' pattern
58
+ t.string :matching_rules
59
+ #this is here as a placeholder for an 'interpreter' or 'rule' pattern
60
+ t.string :pricing_calculation
61
+
62
+ #support for simple assignment of a single money amount
63
+ t.boolean :is_simple_amount
64
+ t.integer :currency_id
65
+ t.float :money_amount
66
+
67
+ t.timestamps
68
+
69
+ end
70
+ add_index :pricing_plan_components, :price_component_type_id
71
+ end
72
+
73
+ unless table_exists?(:valid_price_plan_components)
74
+ create_table :valid_price_plan_components do |t|
75
+
76
+ t.references :pricing_plan
77
+ t.references :pricing_plan_component
78
+
79
+ t.timestamps
80
+
81
+ end
82
+ add_index :valid_price_plan_components, :pricing_plan_id
83
+ add_index :valid_price_plan_components, :pricing_plan_component_id
84
+ end
85
+
86
+ unless table_exists?(:pricing_plan_assignments)
87
+ create_table :pricing_plan_assignments do |t|
88
+
89
+ t.references :pricing_plan
90
+
91
+ #support a polymorhic interface to the thing we want to price
92
+ t.integer :priceable_item_id
93
+ t.string :priceable_item_type
94
+
95
+ t.integer :priority
96
+
97
+ t.timestamps
98
+
99
+ end
100
+ add_index :pricing_plan_assignments, :pricing_plan_id
101
+ add_index :pricing_plan_assignments, [:priceable_item_id,:priceable_item_type], :name => 'priceable_item_idx'
102
+ end
103
+
104
+ unless table_exists?(:prices)
105
+ create_table :prices do |t|
106
+
107
+ t.string :description
108
+
109
+ #support a polymorhic interface to the thing that HAS BEEN priced
110
+ t.integer :priced_item_id
111
+ t.string :priced_item_type
112
+
113
+ #refer to the pricing plan by which this price was calculated
114
+ t.references :pricing_plan
115
+
116
+ t.references :money
117
+
118
+ t.timestamps
119
+
120
+ end
121
+ add_index :prices, :money_id
122
+ add_index :prices, :pricing_plan_id
123
+ add_index :prices, [:priced_item_id,:priced_item_type], :name => 'priced_item_idx'
124
+ end
125
+
126
+ unless table_exists?(:price_components)
127
+ create_table :price_components do |t|
128
+
129
+ t.string :description
130
+ t.references :pricing_plan_component
131
+ t.references :price
132
+ t.references :money
133
+
134
+ #polymorphic relationship
135
+ t.integer :priced_component_id
136
+ t.string :priced_component_type
137
+
138
+ t.timestamps
139
+
140
+ end
141
+ add_index :price_components, :money_id
142
+ add_index :price_components, :pricing_plan_component_id
143
+ add_index :price_components, :price_id
144
+ add_index :price_components, [:priced_component_id,:priced_component_type], :name => 'priced_component_idx'
145
+ end
146
+
147
+ end
148
+
149
+
150
+ def self.down
151
+
152
+ #tables
153
+ drop_tables = [
154
+ :pricing_plans,
155
+ :pricing_plan_components,
156
+ :valid_price_plan_components,
157
+ :pricing_plan_assignments,
158
+ :prices,
159
+ :price_components,
160
+ :price_component_types
161
+ ]
162
+ drop_tables.each do |table|
163
+ if table_exists?(table)
164
+ drop_table table
165
+ end
166
+ end
167
+
168
+ end
169
+ end
@@ -0,0 +1,50 @@
1
+ class CreateFees < ActiveRecord::Migration
2
+ def up
3
+ unless table_exists?(:fees)
4
+ create_table :fees do |t|
5
+ t.references :fee_record, :polymorphic => true
6
+ t.references :money
7
+ t.references :fee_type
8
+ t.string :description
9
+ t.datetime :start_date
10
+ t.datetime :end_date
11
+ t.string :external_identifier
12
+ t.string :external_id_source
13
+
14
+ t.timestamps
15
+ end
16
+
17
+ add_index :fees, [:fee_record_id, :fee_record_type], :name => 'fee_record_idx'
18
+ add_index :fees, :fee_type_id
19
+ add_index :fees, :money_id
20
+ end
21
+
22
+ unless table_exists?(:fee_types)
23
+ create_table :fee_types do |t|
24
+ t.string :internal_identifier
25
+ t.string :description
26
+ t.string :comments
27
+ t.string :external_identifier
28
+ t.string :external_id_source
29
+
30
+ #these columns are required to support the behavior of the plugin 'awesome_nested_set'
31
+ t.integer :parent_id
32
+ t.integer :lft
33
+ t.integer :rgt
34
+
35
+ t.timestamps
36
+ end
37
+
38
+ end
39
+ end
40
+
41
+ def down
42
+ #tables
43
+ drop_tables = [:fees,:fee_types]
44
+ drop_tables.each do |table|
45
+ if table_exists?(table)
46
+ drop_table table
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,66 @@
1
+ require 'active_merchant'
2
+
3
+ module ErpCommerce
4
+ module ActiveMerchantWrappers
5
+ class BrainTreeGatewayWrapper
6
+
7
+ def self.purchase(credit_card_hash, gateway_options={})
8
+ result = {}
9
+
10
+ #test
11
+ ActiveMerchant::Billing::Base.mode = :test
12
+
13
+ #setup gateway
14
+ gateway = ActiveMerchant::Billing::BraintreeGateway.new(gateway_options)
15
+
16
+ #set credit card info
17
+ credit_card = ActiveMerchant::Billing::CreditCard.new({
18
+ :first_name => credit_card_hash[:first_name],
19
+ :last_name => credit_card_hash[:last_name],
20
+ :number => credit_card_hash[:number],
21
+ :month => credit_card_hash[:exp_month],
22
+ :year => credit_card_hash[:exp_year],
23
+ :verification_value => credit_card_hash[:cvvs],
24
+ :type => ErpCommerce::ActiveMerchantWrappers::CreditCardValidation.get_card_type(credit_card_hash[:number])
25
+ })
26
+
27
+ if credit_card.valid?
28
+ cents = (credit_card_hash[:charge_amount].to_f * 100)
29
+ response = gateway.purchase(cents, credit_card)
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.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
65
+ end
66
+ end
@@ -0,0 +1,34 @@
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
@@ -0,0 +1,2 @@
1
+ require 'erp_commerce/active_merchant_wrappers/credit_card_validation'
2
+ require 'erp_commerce/active_merchant_wrappers/brain_tree_gateway_wrapper'
@@ -0,0 +1,15 @@
1
+ module ErpCommerce
2
+ class Engine < Rails::Engine
3
+ isolate_namespace ErpCommerce
4
+
5
+ initializer "erp_commerce.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 ErpCommerce::Extensions::ActiveRecord::ActsAsFee
11
+ include ErpCommerce::Extensions::ActiveRecord::ActsAsPriceable
12
+ end
13
+
14
+ end#Engine
15
+ end#ErpCommerce