spree_loyalty_points 1.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/LICENSE +26 -0
- data/README.md +68 -0
- data/app/assets/javascripts/admin/spree_loyalty_points.js +83 -0
- data/app/assets/javascripts/store/spree_loyalty_points.js +1 -0
- data/app/assets/stylesheets/admin/spree_loyalty_points.css +3 -0
- data/app/assets/stylesheets/store/spree_loyalty_points.css +13 -0
- data/app/controllers/spree/admin/general_settings_controller_decorator.rb +17 -0
- data/app/controllers/spree/admin/loyalty_points_transactions_controller.rb +80 -0
- data/app/controllers/spree/admin/resource_controller_decorator.rb +21 -0
- data/app/controllers/spree/admin/return_authorizations_controller_decorator.rb +11 -0
- data/app/controllers/spree/checkout_controller_decorator.rb +17 -0
- data/app/controllers/spree/loyalty_points_controller.rb +9 -0
- data/app/models/concerns/spree/loyalty_points.rb +22 -0
- data/app/models/concerns/spree/order/loyalty_points.rb +55 -0
- data/app/models/concerns/spree/payment/loyalty_points.rb +39 -0
- data/app/models/concerns/spree/transactions_total_validation.rb +25 -0
- data/app/models/spree/app_configuration_decorator.rb +8 -0
- data/app/models/spree/loyalty_points_credit_transaction.rb +18 -0
- data/app/models/spree/loyalty_points_debit_transaction.rb +18 -0
- data/app/models/spree/loyalty_points_transaction.rb +45 -0
- data/app/models/spree/order_decorator.rb +18 -0
- data/app/models/spree/payment_decorator.rb +34 -0
- data/app/models/spree/payment_method/loyalty_points.rb +27 -0
- data/app/models/spree/payment_method_decorator.rb +7 -0
- data/app/models/spree/return_authorization_decorator.rb +23 -0
- data/app/models/spree/user_decorator.rb +20 -0
- data/app/overrides/add_condition_to_amount_on_return_authorization_page.rb +8 -0
- data/app/overrides/add_loyalty_points_balance_to_account_page.rb +9 -0
- data/app/overrides/add_loyalty_points_debiting_to_return_authorization_page.rb +28 -0
- data/app/overrides/add_loyalty_points_preferences_to_general_settings_page.rb +18 -0
- data/app/overrides/add_loyalty_points_to_admin_user_show_page.rb +15 -0
- data/app/overrides/add_loyalty_points_to_cart_page.rb +8 -0
- data/app/overrides/add_loyalty_points_to_order_checkout_page.rb +16 -0
- data/app/overrides/add_loyalty_points_to_return_authorization_index_page.rb +13 -0
- data/app/overrides/add_loyalty_points_transaction_table_to_return_authorization_form.rb +6 -0
- data/app/views/spree/admin/loyalty_points_transactions/index.html.erb +16 -0
- data/app/views/spree/admin/loyalty_points_transactions/new.html.erb +62 -0
- data/app/views/spree/admin/payments/source_forms/_loyaltypoints.html.erb +0 -0
- data/app/views/spree/admin/payments/source_views/_loyaltypoints.html.erb +0 -0
- data/app/views/spree/checkout/payment/_loyaltypoints.html.erb +8 -0
- data/app/views/spree/loyalty_points/_transaction_table.html.erb +44 -0
- data/app/views/spree/loyalty_points/index.html.erb +4 -0
- data/config/locales/en.yml +18 -0
- data/config/routes.rb +14 -0
- data/db/migrate/20140116090042_add_loyalty_points_balance_to_spree_user.rb +5 -0
- data/db/migrate/20140116110437_create_loyalty_points_transactions.rb +10 -0
- data/db/migrate/20140117062720_add_timestamps_to_loyalty_points_transaction.rb +7 -0
- data/db/migrate/20140117065314_add_fields_to_spree_loyalty_points_transaction.rb +7 -0
- data/db/migrate/20140122084005_add_comment_to_spree_loyalty_points_transaction.rb +5 -0
- data/db/migrate/20140123092709_add_paid_at_to_spree_order.rb +5 -0
- data/db/migrate/20140123120355_add_loyalty_points_to_spree_return_authorization.rb +6 -0
- data/db/migrate/20140124121728_add_loyalty_points_awarded_to_spree_order.rb +5 -0
- data/db/migrate/20140130131957_rename_fields_in_spree_loyalty_points_transaction.rb +6 -0
- data/db/migrate/20140131072702_remove_loyalty_points_awarded_from_spree_order.rb +5 -0
- data/db/migrate/20140203063433_add_indexing_to_spree_loyalty_points_transaction.rb +7 -0
- data/db/migrate/20140205111553_add_transaction_id_to_spree_loyalty_points_transactions.rb +5 -0
- data/db/migrate/20140207055836_add_lock_version_to_spree_user.rb +5 -0
- data/lib/generators/spree_loyalty_points/install/install_generator.rb +31 -0
- data/lib/spree_loyalty_points/engine.rb +26 -0
- data/lib/spree_loyalty_points/factories.rb +75 -0
- data/lib/spree_loyalty_points.rb +2 -0
- data/lib/tasks/loyalty_points/award.rake +10 -0
- metadata +124 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
module Spree
|
2
|
+
class PaymentMethod::LoyaltyPoints < PaymentMethod
|
3
|
+
def actions
|
4
|
+
%w{capture void}
|
5
|
+
end
|
6
|
+
|
7
|
+
def can_void?(payment)
|
8
|
+
payment.state != 'void'
|
9
|
+
end
|
10
|
+
|
11
|
+
def can_capture?(payment)
|
12
|
+
['checkout', 'pending'].include?(payment.state)
|
13
|
+
end
|
14
|
+
|
15
|
+
def capture(payment, source, gateway)
|
16
|
+
ActiveMerchant::Billing::Response.new(true, "", {}, {})
|
17
|
+
end
|
18
|
+
|
19
|
+
def void(source, gateway)
|
20
|
+
ActiveMerchant::Billing::Response.new(true, "", {}, {})
|
21
|
+
end
|
22
|
+
|
23
|
+
def source_required?
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Spree::ReturnAuthorization.class_eval do
|
2
|
+
include Spree::TransactionsTotalValidation
|
3
|
+
validate :transactions_total_range, if: -> { order.present? && order.loyalty_points_transactions.present? }
|
4
|
+
|
5
|
+
def update_loyalty_points
|
6
|
+
if loyalty_points_transaction_type == "Debit"
|
7
|
+
loyalty_points_debit_quantity = [order.user.loyalty_points_balance, order.loyalty_points_for(order.item_total), loyalty_points].min
|
8
|
+
order.create_debit_transaction(loyalty_points_debit_quantity)
|
9
|
+
else
|
10
|
+
loyalty_points_credit_quantity = [order.loyalty_points_for(order.total), loyalty_points].min
|
11
|
+
order.create_credit_transaction(loyalty_points_credit_quantity)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def transactions_total_range
|
18
|
+
validate_transactions_total_range(loyalty_points_transaction_type, order)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
Spree::ReturnAuthorization.state_machine.after_transition :to => :received, :do => :update_loyalty_points
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Spree::User.class_eval do
|
2
|
+
validates :loyalty_points_balance, numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
3
|
+
|
4
|
+
has_many :loyalty_points_transactions
|
5
|
+
has_many :loyalty_points_debit_transactions
|
6
|
+
has_many :loyalty_points_credit_transactions
|
7
|
+
|
8
|
+
def loyalty_points_balance_sufficient?
|
9
|
+
loyalty_points_balance >= Spree::Config.loyalty_points_redeeming_balance
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_sufficient_loyalty_points?(order)
|
13
|
+
loyalty_points_equivalent_currency >= order.total
|
14
|
+
end
|
15
|
+
|
16
|
+
def loyalty_points_equivalent_currency
|
17
|
+
loyalty_points_balance * Spree::Config.loyalty_points_conversion_rate
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/admin/return_authorizations/_form',
|
2
|
+
:name => 'surround_amount_with_condition_in_return_authorization_form',
|
3
|
+
:surround => "erb[loud]:contains('field_container :amount')",
|
4
|
+
:text => "
|
5
|
+
<% if !@return_authorization.order.loyalty_points_used? %>
|
6
|
+
<%= render_original %>
|
7
|
+
<% end %>
|
8
|
+
")
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/users/show',
|
2
|
+
:name => 'add_loyalty_points_balance_to_account_page',
|
3
|
+
:insert_after => "#user-info",
|
4
|
+
:text => "
|
5
|
+
<dl id='loyalty-points-info'>
|
6
|
+
<dt><%= Spree.t(:loyalty_points_balance) %></dt>
|
7
|
+
<dd><%= @user.loyalty_points_balance %> (<%= link_to Spree.t(:details), spree.loyalty_points_path %>)</dd>
|
8
|
+
</dl>
|
9
|
+
")
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/admin/return_authorizations/_form',
|
2
|
+
:name => 'add_loyalty_points_to_return_authorization_page',
|
3
|
+
:insert_before => "erb[loud]:contains('field_container :reason')",
|
4
|
+
:text => "
|
5
|
+
<% if !@order.loyalty_points_used? && @order.eligible_for_loyalty_points?(@order.item_total) %>
|
6
|
+
<%= f.field_container :loyalty_points do %>
|
7
|
+
<%= label :loyalty_points, Spree.t(:loyalty_points_debit) %> <span class='required'>*</span><br />
|
8
|
+
<% if @return_authorization.received? %>
|
9
|
+
<%= @return_authorization.loyalty_points %> points Debited <br />
|
10
|
+
<% else %>
|
11
|
+
<%= f.text_field :loyalty_points, {:style => 'width:80px;'} %>
|
12
|
+
<%= f.hidden_field :loyalty_points_transaction_type, { value: :Debit } %>
|
13
|
+
<br /> User's Loyalty Points Balance: <%= @order.user.loyalty_points_balance %> <br /> Net Loyalty Points Credited for this Order: <%= @order.loyalty_points_total %>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
16
|
+
<% elsif @order.loyalty_points_used? %>
|
17
|
+
<%= f.field_container :loyalty_points do %>
|
18
|
+
<br /><%= label :loyalty_points, Spree.t(:loyalty_points_credit) %> <span class='required'>*</span><br />
|
19
|
+
<% if @return_authorization.received? %>
|
20
|
+
<%= @return_authorization.loyalty_points %> points Credited <br />
|
21
|
+
<% else %>
|
22
|
+
<%= f.text_field :loyalty_points, {:style => 'width:80px;'} %>
|
23
|
+
<%= f.hidden_field :loyalty_points_transaction_type, { value: :Credit } %>
|
24
|
+
<br /> User's Loyalty Points Balance: <%= @order.user.loyalty_points_balance %> <br /> Net Loyalty Points Debited for this Order: <%= -@order.loyalty_points_total %>
|
25
|
+
<% end %>
|
26
|
+
<% end %>
|
27
|
+
<% end %>
|
28
|
+
")
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/admin/general_settings/edit',
|
2
|
+
:name => 'add_loyalty_points_preferences_to_general_settings_page',
|
3
|
+
:insert_before => "div.row",
|
4
|
+
:text => "
|
5
|
+
<div class='row'>
|
6
|
+
<fieldset class='loyalty-points no-border-bottom'>
|
7
|
+
<legend align='center'><%= Spree.t(:loyalty_points_settings)%></legend>
|
8
|
+
<% @preferences_loyalty_points.each do |key, value|
|
9
|
+
type = Spree::Config.preference_type(key) %>
|
10
|
+
<div class='field'>
|
11
|
+
<%= label_tag(key, Spree.t(key)) + tag(:br) if type != :boolean %>
|
12
|
+
<%= preference_field_tag(key, Spree::Config[key], :type => type) %>
|
13
|
+
<p><%= value[0] %></p>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
16
|
+
</fieldset>
|
17
|
+
</div>
|
18
|
+
")
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/admin/users/show',
|
2
|
+
:name => 'add_loyalty_points_to_admin_user_show_page',
|
3
|
+
:insert_after => "tr[data-hook='roles']",
|
4
|
+
:text => "
|
5
|
+
<tr data-hook='loyalty-points'>
|
6
|
+
<th><%= Spree.t(:loyalty_points_balance) %></th>
|
7
|
+
<td>
|
8
|
+
<% if @user.loyalty_points_balance.present? %>
|
9
|
+
<%= link_to @user.loyalty_points_balance, spree.admin_user_loyalty_points_path(@user) %>
|
10
|
+
<% else %>
|
11
|
+
<%= 'No loyalty points yet' %>
|
12
|
+
<% end %>
|
13
|
+
</td>
|
14
|
+
</tr>
|
15
|
+
")
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/orders/edit',
|
2
|
+
:name => 'add_loyalty_points_to_cart_page',
|
3
|
+
:insert_after => "#subtotal h5",
|
4
|
+
:text => "
|
5
|
+
<% if @order.loyalty_points_for(@order.item_total) > 0 %>
|
6
|
+
<h5><%= Spree.t(:loyalty_points_earnable, :quantity => \"<span class='order-total'> \#{@order.loyalty_points_for(@order.item_total)}</span>\").html_safe %></h5>
|
7
|
+
<% end %>
|
8
|
+
")
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/shared/_order_details',
|
2
|
+
:name => 'add_loyalty_points_to_order_checkout_page',
|
3
|
+
:insert_after => "#order-charges",
|
4
|
+
:text => "
|
5
|
+
<tfoot id='loyalty_points'>
|
6
|
+
<tr id='loyalty-points-row'>
|
7
|
+
<% if @order.loyalty_points_awarded? %>
|
8
|
+
<td></td>
|
9
|
+
<td colspan='4' class='total'><span><%= @order.loyalty_points_for(@order.item_total) %></span> <b><%= Spree.t(:loyalty_points) %> have been credited to your account.</b></td>
|
10
|
+
<% else %>
|
11
|
+
<td></td>
|
12
|
+
<td colspan='4' class='total'><span><%= @order.loyalty_points_for(@order.item_total) %></span> <b><%= Spree.t(:loyalty_points) %> will be credited to your account soon.</b></td>
|
13
|
+
<% end %>
|
14
|
+
</tr>
|
15
|
+
</tfoot>
|
16
|
+
")
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/admin/return_authorizations/index',
|
2
|
+
:name => 'add_loyalty_points_to_return_authorization_index_page_head',
|
3
|
+
:insert_after => "thead[data-hook='rma_header'] th:contains('amount')",
|
4
|
+
:text => "
|
5
|
+
<th><%= Spree.t(:loyalty_points) %></th>
|
6
|
+
")
|
7
|
+
|
8
|
+
Deface::Override.new(:virtual_path => 'spree/admin/return_authorizations/index',
|
9
|
+
:name => 'add_loyalty_points_to_return_authorization_index_page_row',
|
10
|
+
:insert_after => "tr[data-hook='rma_row'] td:contains('display_amount')",
|
11
|
+
:text => "
|
12
|
+
<td><%= return_authorization.loyalty_points %> pts <%= return_authorization.loyalty_points_transaction_type %></td>
|
13
|
+
")
|
@@ -0,0 +1,6 @@
|
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/admin/return_authorizations/_form',
|
2
|
+
:name => 'add_loyalty_points_transaction_table_to_return_authorization_form',
|
3
|
+
:insert_after => "div[data-hook='admin_return_authorization_form_fields']",
|
4
|
+
:text => "
|
5
|
+
<%= render partial: 'spree/loyalty_points/transaction_table' %>
|
6
|
+
")
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% content_for :page_title do %>
|
2
|
+
<%= Spree.t(:loyalty_points) %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :page_actions do %>
|
6
|
+
<li>
|
7
|
+
<%= button_link_to Spree.t(:back_to_user_profile), :back, :icon => 'icon-arrow-left', :id => 'admin_user_link' %>
|
8
|
+
</li>
|
9
|
+
<li>
|
10
|
+
<%= button_link_to Spree.t(:update_loyalty_points), new_admin_user_loyalty_point_path(@user), :icon => 'icon-plus', :id => 'admin_user_new_loyalty_point_link' %>
|
11
|
+
</li>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<p>Current Balance: <%= @user.loyalty_points_balance %></p>
|
15
|
+
<%= render partial: 'spree/loyalty_points/transaction_table' %>
|
16
|
+
<br />
|
@@ -0,0 +1,62 @@
|
|
1
|
+
<% content_for :page_title do %>
|
2
|
+
<%= Spree.t(:loyalty_points) %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :page_actions do %>
|
6
|
+
<li><%= button_link_to Spree.t(:back_to_users_list), admin_users_path, :icon => 'icon-arrow-left' %></li>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @loyalty_points_transaction.user } %>
|
10
|
+
<%= render :partial => 'spree/shared/error_messages', :locals => { :target => @loyalty_points_transaction } %>
|
11
|
+
|
12
|
+
<div id='loyalty-points-order-transactions'></div>
|
13
|
+
|
14
|
+
<%= form_for @loyalty_points_transaction, as: :loyalty_points_transaction, url: admin_user_loyalty_points_path(@user) do |f| %>
|
15
|
+
<fieldset data-hook="update_loyalty_points">
|
16
|
+
|
17
|
+
<legend align="center"><%= Spree.t(:update_loyalty_points) %></legend>
|
18
|
+
|
19
|
+
<div data-hook="update_loyalty_points_attrs" class="row">
|
20
|
+
|
21
|
+
<div class="four columns">
|
22
|
+
<%= f.field_container :loyalty_points do %>
|
23
|
+
<%= f.label :loyalty_points, Spree.t(:loyalty_points) %> <span class="required">*</span><br />
|
24
|
+
<%= f.text_field :loyalty_points, :class => 'fullwidth title' %>
|
25
|
+
<%= f.error_message_on :loyalty_points %>
|
26
|
+
<% end %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div class="field four columns">
|
30
|
+
<%= f.label :type, Spree.t(:transaction_type) %> <span class="required">*</span><br />
|
31
|
+
<%= f.select :type, options_for_select(Spree::LoyaltyPointsTransaction::CLASS_TO_TRANSACTION_TYPE.invert), {}, :class => 'select2 fullwidth' %>
|
32
|
+
<%= f.error_message_on :type %>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div class="field four columns">
|
36
|
+
<%= label_tag nil, Spree.t(:order) %>
|
37
|
+
<%= f.select :source_id, @user.orders.collect {|o| [o.number, o.id]}, {:include_blank => true}, :class => 'select2 fullwidth', :"data-transactions-link" => admin_user_loyalty_points_path(@user) %>
|
38
|
+
<%= f.hidden_field :source_type, { :value => 'Spree::Order' } %>
|
39
|
+
</div>
|
40
|
+
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div data-hook="comment_row" class="row">
|
44
|
+
|
45
|
+
<div class="four columns">
|
46
|
+
<%= f.field_container :comment do %>
|
47
|
+
<%= f.label :comment, Spree.t(:comment) %> <span class="required">*</span><br />
|
48
|
+
<%= f.text_area :comment, :class => 'fullwidth' %>
|
49
|
+
<%= f.error_message_on :comment %>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
</div>
|
54
|
+
|
55
|
+
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
56
|
+
<%= button Spree.t('actions.update'), 'icon-ok' %>
|
57
|
+
<span class="or"><%= Spree.t(:or) %></span>
|
58
|
+
<%= link_to_with_icon 'icon-remove', Spree.t('actions.cancel'), admin_users_path, :class => 'button' %>
|
59
|
+
</div>
|
60
|
+
|
61
|
+
</fieldset>
|
62
|
+
<% end %>
|
File without changes
|
File without changes
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%- lp_balance = spree_current_user.loyalty_points_balance %>
|
2
|
+
<%- equivalent_currency_balance = spree_current_user.loyalty_points_equivalent_currency %>
|
3
|
+
Loyalty Points Balance: <%= lp_balance %><%= "($" + equivalent_currency_balance.to_s + ")" %>
|
4
|
+
<%- lp_needed = @order.loyalty_points_for(@order.total, 'redeem') %>
|
5
|
+
<br/>Loyalty Points Needed: <%= lp_needed %>
|
6
|
+
<% if lp_needed > lp_balance %>
|
7
|
+
<br/><b>Insufficient Balance!</b>
|
8
|
+
<% end %>
|
@@ -0,0 +1,44 @@
|
|
1
|
+
<%= paginate @loyalty_points_transactions %>
|
2
|
+
|
3
|
+
<% if @loyalty_points_transactions.present? %>
|
4
|
+
<table class="loyalty-points-summary">
|
5
|
+
<thead>
|
6
|
+
<tr>
|
7
|
+
<th class="loyalty-points-date"><%= Spree.t(:date) %></th>
|
8
|
+
<th class="loyalty-points-source"><%= Spree.t(:source) %></th>
|
9
|
+
<th class="loyalty-points-source-id"><%= Spree.t(:source_reference) %></th>
|
10
|
+
<th class="loyalty-points-comment"><%= Spree.t(:comment) %></th>
|
11
|
+
<th class="loyalty-points-type"><%= Spree.t(:transaction_type) %></th>
|
12
|
+
<th class="loyalty-points"><%= Spree.t(:loyalty_points) %></th>
|
13
|
+
<th class="loyalty-points-balance"><%= Spree.t(:updated_balance) %></th>
|
14
|
+
</tr>
|
15
|
+
</thead>
|
16
|
+
<tbody>
|
17
|
+
<% @loyalty_points_transactions.each do |loyalty_point_transaction| %>
|
18
|
+
<tr class="<%= cycle('even', 'odd') %>">
|
19
|
+
<td class="loyalty-points-date"><%= pretty_time(loyalty_point_transaction.updated_at) %></td>
|
20
|
+
<% if loyalty_point_transaction.source.present? %>
|
21
|
+
<% transaction_source = loyalty_point_transaction.source_type.gsub('Spree::','') -%>
|
22
|
+
<td class="loyalty-points-source"><%= transaction_source %></td>
|
23
|
+
<% if transaction_source == "Order" %>
|
24
|
+
<td class="loyalty-points-source-id"><%= link_to loyalty_point_transaction.source.number, order_path(loyalty_point_transaction.source) %></td>
|
25
|
+
<% else %>
|
26
|
+
<td class="loyalty-points-source-id"><%= loyalty_point_transaction.source_id %></td>
|
27
|
+
<% end %>
|
28
|
+
<% else %>
|
29
|
+
<td class="loyalty-points-source"></td>
|
30
|
+
<td class="loyalty-points-source-id"></td>
|
31
|
+
<% end %>
|
32
|
+
<td class="loyalty-points-comment"><%= loyalty_point_transaction.comment %></td>
|
33
|
+
<td class="loyalty-points-type"><%= loyalty_point_transaction.transaction_type %></td>
|
34
|
+
<td class="loyalty-points"><%= loyalty_point_transaction.loyalty_points %></td>
|
35
|
+
<td class="loyalty-points-balance"><%= loyalty_point_transaction.balance %></td>
|
36
|
+
</tr>
|
37
|
+
<% end %>
|
38
|
+
</tbody>
|
39
|
+
</table>
|
40
|
+
<% else %>
|
41
|
+
<p><%= Spree.t(:you_have_not_earned_any_loyalty_points_yet) %></p>
|
42
|
+
<% end %>
|
43
|
+
|
44
|
+
<%= paginate @loyalty_points_transactions %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Sample localization file for English. Add more files in this directory for other locales.
|
2
|
+
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
3
|
+
|
4
|
+
en:
|
5
|
+
spree:
|
6
|
+
loyalty_points_balance: Loyalty Points Balance
|
7
|
+
loyalty_points: Loyalty Points
|
8
|
+
loyalty_points_debit: Loyalty Points To Be Deducted Against this Return
|
9
|
+
loyalty_points_credit: Loyalty Points To Be Awarded Against this Return
|
10
|
+
details: Details
|
11
|
+
min_amount_required_to_get_loyalty_points: "Minimum amount to be spent per order(item total, excluding shipping and any other charges) to award loyalty points."
|
12
|
+
loyalty_points_awarding_unit: "Number of Loyalty Points to be awarded per Unit Amount Spent"
|
13
|
+
loyalty_points_redeeming_balance: Minimum Loyalty Points Balance Required for Redeeming
|
14
|
+
loyalty_points_conversion_rate: "Loyalty point to amount conversion rate"
|
15
|
+
loyalty_points_award_period: Time(in hours) after payment to award loyalty points
|
16
|
+
back_to_user_profile: Back to User Profile
|
17
|
+
update_loyalty_points: Update Loyalty Points
|
18
|
+
loyalty_points_earnable: "%{quantity} Loyalty Points Will Be Awarded for this Order"
|
data/config/routes.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Spree::Core::Engine.routes.draw do
|
2
|
+
# Add your extension routes here
|
3
|
+
|
4
|
+
resources :loyalty_points, only: [:index]
|
5
|
+
|
6
|
+
namespace :admin do
|
7
|
+
resources :users do
|
8
|
+
resources :loyalty_points, only: [:index, :new, :create], controller: 'loyalty_points_transactions' do
|
9
|
+
get 'order_transactions/:order_id', action: :order_transactions, on: :collection
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class CreateLoyaltyPointsTransactions < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :spree_loyalty_points_transactions do |t|
|
4
|
+
t.integer :loyalty_points
|
5
|
+
t.string :transaction_type
|
6
|
+
t.integer :user_id, :null => false
|
7
|
+
t.integer :order_id
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class AddFieldsToSpreeLoyaltyPointsTransaction < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :spree_loyalty_points_transactions, :source_type, :string
|
4
|
+
rename_column :spree_loyalty_points_transactions, :order_id, :source_id
|
5
|
+
add_column :spree_loyalty_points_transactions, :updated_balance, :integer, default: 0, null: false
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
class AddLoyaltyPointsToSpreeReturnAuthorization < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :spree_return_authorizations, :loyalty_points, :integer, default: 0, null: false
|
4
|
+
add_column :spree_return_authorizations, :loyalty_points_transaction_type, :string
|
5
|
+
end
|
6
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class AddIndexingToSpreeLoyaltyPointsTransaction < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_index :spree_loyalty_points_transactions, [:source_type, :source_id], name: 'by_source'
|
4
|
+
add_index :spree_loyalty_points_transactions, :user_id
|
5
|
+
add_index :spree_loyalty_points_transactions, :type
|
6
|
+
end
|
7
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module SpreeLoyaltyPoints
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
class_option :auto_run_migrations, :type => :boolean, :default => false
|
6
|
+
|
7
|
+
def add_javascripts
|
8
|
+
append_file 'app/assets/javascripts/store/all.js', "//= require store/spree_loyalty_points\n"
|
9
|
+
append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_loyalty_points\n"
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_stylesheets
|
13
|
+
inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_loyalty_points\n", :before => /\*\//, :verbose => true
|
14
|
+
inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_loyalty_points\n", :before => /\*\//, :verbose => true
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_migrations
|
18
|
+
run 'bundle exec rake railties:install:migrations FROM=spree_loyalty_points'
|
19
|
+
end
|
20
|
+
|
21
|
+
def run_migrations
|
22
|
+
run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
|
23
|
+
if run_migrations
|
24
|
+
run 'bundle exec rake db:migrate'
|
25
|
+
else
|
26
|
+
puts 'Skipping rake db:migrate, don\'t forget to run it!'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SpreeLoyaltyPoints
|
2
|
+
class Engine < Rails::Engine
|
3
|
+
require 'spree/core'
|
4
|
+
isolate_namespace Spree
|
5
|
+
engine_name 'spree_loyalty_points'
|
6
|
+
|
7
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
8
|
+
|
9
|
+
# use rspec for tests
|
10
|
+
config.generators do |g|
|
11
|
+
g.test_framework :rspec
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.activate
|
15
|
+
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
16
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
initializer "spree.register.payment_methods" do |app|
|
21
|
+
app.config.spree.payment_methods << Spree::PaymentMethod::LoyaltyPoints
|
22
|
+
end
|
23
|
+
|
24
|
+
config.to_prepare &method(:activate).to_proc
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
FactoryGirl.define do
|
2
|
+
# Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
|
3
|
+
#
|
4
|
+
# Example adding this to your spec_helper will load these Factories for use:
|
5
|
+
# require 'spree_loyalty_points/factories'
|
6
|
+
|
7
|
+
factory :loyalty_points_transaction, :class => Spree::LoyaltyPointsTransaction do
|
8
|
+
loyalty_points { (10..99).to_a.sample }
|
9
|
+
balance { (100..999).to_a.sample }
|
10
|
+
comment { Faker::Lorem.words(3).join(' ') }
|
11
|
+
type "Spree::LoyaltyPointsCreditTransaction"
|
12
|
+
|
13
|
+
association :user, factory: :user_with_loyalty_points
|
14
|
+
|
15
|
+
factory :loyalty_points_credit_transaction, :class => Spree::LoyaltyPointsCreditTransaction do
|
16
|
+
type "Spree::LoyaltyPointsCreditTransaction"
|
17
|
+
end
|
18
|
+
|
19
|
+
factory :loyalty_points_debit_transaction, :class => Spree::LoyaltyPointsDebitTransaction do
|
20
|
+
type "Spree::LoyaltyPointsDebitTransaction"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
factory :user_with_loyalty_points, parent: :user do
|
26
|
+
loyalty_points_balance { (100..999).to_a.sample }
|
27
|
+
|
28
|
+
ignore do
|
29
|
+
transactions_count 5
|
30
|
+
end
|
31
|
+
|
32
|
+
after(:create) do |user, evaluator|
|
33
|
+
create_list(:loyalty_points_transaction, evaluator.transactions_count, user: user)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
factory :order_with_loyalty_points, parent: :order do
|
38
|
+
|
39
|
+
association :user, factory: :user_with_loyalty_points
|
40
|
+
|
41
|
+
ignore do
|
42
|
+
transactions_count 5
|
43
|
+
end
|
44
|
+
|
45
|
+
after(:create) do |order, evaluator|
|
46
|
+
create_list(:loyalty_points_transaction, evaluator.transactions_count, source: order)
|
47
|
+
end
|
48
|
+
|
49
|
+
factory :shipped_order_with_loyalty_points do
|
50
|
+
ignore do
|
51
|
+
shipments_count 5
|
52
|
+
end
|
53
|
+
|
54
|
+
after(:create) do |order, evaluator|
|
55
|
+
create_list(:shipment, evaluator.shipments_count, order: order, state: "shipped")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
factory :payment_with_loyalty_points, parent: :payment do
|
62
|
+
|
63
|
+
association :order, factory: :order_with_loyalty_points
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
factory :return_authorization_with_loyalty_points, parent: :return_authorization do
|
68
|
+
loyalty_points { (50..99).to_a.sample }
|
69
|
+
loyalty_points_transaction_type "Debit"
|
70
|
+
|
71
|
+
association :order, factory: :shipped_order_with_loyalty_points
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|