solidus_virtual_gift_card 1.0.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +8 -0
- data/Gemfile +7 -4
- data/README.md +1 -1
- data/app/assets/javascripts/spree/frontend/solidus_virtual_gift_card.js +0 -0
- data/app/assets/stylesheets/spree/backend/solidus_virtual_gift_card.css +0 -11
- data/app/assets/stylesheets/spree/frontend/solidus_virtual_gift_card.css +0 -0
- data/app/controllers/spree/admin/gift_cards_controller.rb +15 -2
- data/app/mailers/spree/gift_card_mailer.rb +2 -2
- data/app/models/concerns/spree/gift_cards/inventory_unit_concerns.rb +10 -0
- data/app/models/concerns/spree/gift_cards/order_concerns.rb +3 -2
- data/app/models/spree/inventory_unit_decorator.rb +1 -0
- data/app/models/spree/virtual_gift_card.rb +27 -2
- data/app/overrides/admin_user_sub_menu.rb +7 -4
- data/app/overrides/spree/admin/products/_form/add_gift_card.html.erb.deface +8 -0
- data/app/views/spree/admin/gift_cards/_lookup_form.html.erb +35 -27
- data/app/views/spree/admin/gift_cards/edit.html.erb +12 -4
- data/app/views/spree/admin/gift_cards/index.html.erb +7 -1
- data/app/views/spree/admin/orders/_gift_card_details.html.erb +6 -1
- data/app/views/spree/admin/users/_sub_menu.html.erb +5 -9
- data/config/locales/en.yml +11 -0
- data/config/locales/it.yml +27 -0
- data/config/routes.rb +2 -1
- data/db/migrate/20151109202300_add_deactivated_at_to_gift_card.rb +5 -0
- data/db/migrate/20151110202752_add_inventory_unit_to_gift_card.rb +5 -0
- data/db/migrate/20151111211220_backfill_inventory_units_on_gift_card.rb +27 -0
- data/lib/generators/solidus_virtual_gift_card/install/install_generator.rb +0 -4
- data/lib/spree_virtual_gift_card/factories.rb +5 -0
- data/solidus_virtual_gift_card.gemspec +8 -6
- data/spec/controllers/spree/admin/gift_cards_controller_spec.rb +56 -0
- data/spec/features/admin/products_card_spec.rb +26 -0
- data/spec/mailers/spree/gift_card_mailer_spec.rb +20 -0
- data/spec/models/spree/line_item_spec.rb +1 -1
- data/spec/models/spree/virtual_gift_card_spec.rb +121 -1
- data/spec/spec_helper.rb +20 -6
- metadata +50 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea5a0d37ac45be094a61721f9f91b948a4713063
|
4
|
+
data.tar.gz: 31f391fb4340bbded183df0bd9fdd5e828c12de5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 652d0b4ace4f835d099d5f518bdca86fb708a809198fa08a7cfad4f0c8011f472c8f8a89e9dc0572e8b76f10e36818aae20b875f2ea210440d73e8d839aeef53
|
7
|
+
data.tar.gz: 78cd94b6aa0d3e4b89b937ffdbabc83af98940ef1b42edff365ff30600c9787e29c5ac9715d3141d65d6c43e22ca65bcedb262af5150c753ae224f2cae4e8873
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
gem "
|
3
|
+
branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
|
4
|
+
gem "solidus", github: "solidusio/solidus", branch: branch
|
5
|
+
gem "solidus_auth_devise"
|
6
|
+
|
7
|
+
gem 'pg'
|
8
|
+
gem 'mysql2'
|
5
9
|
|
6
10
|
group :test, :development do
|
7
|
-
gem
|
8
|
-
gem 'selenium-webdriver'
|
11
|
+
gem 'pry-rails'
|
9
12
|
end
|
10
13
|
|
11
14
|
gemspec
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ A virtual gift card implementation for Solidus.
|
|
7
7
|
* The virtual gift card codes can be used to add store credit to a user's
|
8
8
|
account.
|
9
9
|
|
10
|
-
[![
|
10
|
+
[![Build Status](https://travis-ci.org/solidusio/solidus_virtual_gift_card.svg?branch=master)](https://travis-ci.org/solidusio/solidus_virtual_gift_card)
|
11
11
|
|
12
12
|
Installation
|
13
13
|
------------
|
File without changes
|
File without changes
|
@@ -1,8 +1,8 @@
|
|
1
1
|
class Spree::Admin::GiftCardsController < Spree::Admin::BaseController
|
2
2
|
before_filter :load_user, only: [:lookup, :redeem]
|
3
3
|
before_filter :load_gift_card_for_redemption, only: [:redeem]
|
4
|
-
before_filter :load_gift_card_by_id, only: [:edit, :update, :send_email]
|
5
|
-
before_filter :load_order, only: [:edit, :update]
|
4
|
+
before_filter :load_gift_card_by_id, only: [:edit, :update, :send_email, :deactivate]
|
5
|
+
before_filter :load_order, only: [:edit, :update, :deactivate]
|
6
6
|
|
7
7
|
def index
|
8
8
|
@search = Spree::VirtualGiftCard.purchased.search(params[:q])
|
@@ -35,6 +35,19 @@ class Spree::Admin::GiftCardsController < Spree::Admin::BaseController
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
def deactivate
|
39
|
+
if @gift_card.deactivate
|
40
|
+
flash[:success] = Spree.t("admin.gift_cards.deactivated_gift_card")
|
41
|
+
redirect_to edit_admin_order_path(@order)
|
42
|
+
else
|
43
|
+
flash[:error] = @gift_card.errors.full_messages.join(", ").presence || Spree.t("admin.gift_cards.errors.unable_to_reimburse_gift_card")
|
44
|
+
redirect_to edit_admin_order_gift_card_path(@order, @gift_card)
|
45
|
+
end
|
46
|
+
rescue Spree::Reimbursement::IncompleteReimbursementError
|
47
|
+
flash[:error] = Spree.t("admin.gift_cards.errors.unable_to_reimburse_gift_card")
|
48
|
+
redirect_to edit_admin_order_gift_card_path(@order, @gift_card)
|
49
|
+
end
|
50
|
+
|
38
51
|
def send_email
|
39
52
|
@gift_card.send_email
|
40
53
|
redirect_to :back
|
@@ -2,8 +2,8 @@ class Spree::GiftCardMailer < Spree::BaseMailer
|
|
2
2
|
def gift_card_email(gift_card)
|
3
3
|
@gift_card = gift_card.respond_to?(:id) ? gift_card : Spree::VirtualGiftCard.find(gift_card)
|
4
4
|
@order = @gift_card.line_item.order
|
5
|
-
send_to_address = @gift_card.recipient_email || @order.email
|
5
|
+
send_to_address = @gift_card.recipient_email.presence || @order.email
|
6
6
|
subject = "#{Spree::Store.current.name} #{Spree.t('gift_card_mailer.gift_card_email.subject')}"
|
7
|
-
mail(to: send_to_address, from: from_address, subject: subject)
|
7
|
+
mail(to: send_to_address, from: from_address(Spree::Store.current), subject: subject)
|
8
8
|
end
|
9
9
|
end
|
@@ -23,8 +23,9 @@ module Spree
|
|
23
23
|
|
24
24
|
def finalize!
|
25
25
|
super
|
26
|
-
|
27
|
-
|
26
|
+
inventory_units = self.inventory_units
|
27
|
+
gift_cards.each_with_index do |gift_card, index|
|
28
|
+
gift_card.make_redeemable!(purchaser: user, inventory_unit: inventory_units[index])
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
@@ -0,0 +1 @@
|
|
1
|
+
Spree::InventoryUnit.include Spree::GiftCards::InventoryUnitConcerns
|
@@ -5,6 +5,8 @@ class Spree::VirtualGiftCard < ActiveRecord::Base
|
|
5
5
|
belongs_to :purchaser, class_name: 'Spree::User'
|
6
6
|
belongs_to :redeemer, class_name: 'Spree::User'
|
7
7
|
belongs_to :line_item, class_name: 'Spree::LineItem'
|
8
|
+
belongs_to :inventory_unit, class_name: 'Spree::InventoryUnit'
|
9
|
+
has_one :order, through: :line_item
|
8
10
|
|
9
11
|
validates :amount, numericality: { greater_than: 0 }
|
10
12
|
validates_uniqueness_of :redemption_code, conditions: -> { where(redeemed_at: nil, redeemable: true) }
|
@@ -22,6 +24,10 @@ class Spree::VirtualGiftCard < ActiveRecord::Base
|
|
22
24
|
redeemed_at.present?
|
23
25
|
end
|
24
26
|
|
27
|
+
def deactivated?
|
28
|
+
deactivated_at.present?
|
29
|
+
end
|
30
|
+
|
25
31
|
def redeem(redeemer)
|
26
32
|
return false if redeemed? || !redeemable?
|
27
33
|
create_store_credit!({
|
@@ -36,8 +42,17 @@ class Spree::VirtualGiftCard < ActiveRecord::Base
|
|
36
42
|
self.update_attributes( redeemed_at: Time.now, redeemer: redeemer )
|
37
43
|
end
|
38
44
|
|
39
|
-
def make_redeemable!(purchaser:)
|
40
|
-
update_attributes!(redeemable: true, purchaser: purchaser, redemption_code: (self.redemption_code || generate_unique_redemption_code))
|
45
|
+
def make_redeemable!(purchaser:, inventory_unit:)
|
46
|
+
update_attributes!(redeemable: true, purchaser: purchaser, inventory_unit: inventory_unit, redemption_code: (self.redemption_code || generate_unique_redemption_code))
|
47
|
+
end
|
48
|
+
|
49
|
+
def deactivate
|
50
|
+
update_attributes(redeemable: false, deactivated_at: Time.now) &&
|
51
|
+
cancel_and_reimburse_inventory_unit
|
52
|
+
end
|
53
|
+
|
54
|
+
def can_deactivate?
|
55
|
+
order.completed? && order.paid? && !deactivated?
|
41
56
|
end
|
42
57
|
|
43
58
|
def memo
|
@@ -81,6 +96,10 @@ class Spree::VirtualGiftCard < ActiveRecord::Base
|
|
81
96
|
redeemed_at.localtime.strftime("%F %I:%M%p") if redeemed_at
|
82
97
|
end
|
83
98
|
|
99
|
+
def formatted_deactivated_at
|
100
|
+
deactivated_at.localtime.strftime("%F %I:%M%p") if deactivated_at
|
101
|
+
end
|
102
|
+
|
84
103
|
def store_credit_category
|
85
104
|
Spree::StoreCreditCategory.where(name: Spree::StoreCreditCategory::GIFT_CARD_CATEGORY_NAME).first
|
86
105
|
end
|
@@ -96,6 +115,12 @@ class Spree::VirtualGiftCard < ActiveRecord::Base
|
|
96
115
|
|
97
116
|
private
|
98
117
|
|
118
|
+
def cancel_and_reimburse_inventory_unit
|
119
|
+
cancellation = Spree::OrderCancellations.new(line_item.order)
|
120
|
+
cancellation.cancel_unit(inventory_unit)
|
121
|
+
!!cancellation.reimburse_units([inventory_unit])
|
122
|
+
end
|
123
|
+
|
99
124
|
def generate_unique_redemption_code
|
100
125
|
redemption_code = Spree::RedemptionCodeGenerator.generate_redemption_code
|
101
126
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
Deface::Override.new(
|
2
|
-
virtual_path: "spree/admin/shared/
|
2
|
+
virtual_path: "spree/admin/shared/_tabs",
|
3
3
|
name: "admin_user_sub_menu_index",
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
replace: "erb[loud]:contains('BackendConfiguration::USER_TABS')",
|
5
|
+
text: <<-ERB)
|
6
|
+
<%= tab *Spree::BackendConfiguration::USER_TABS, url: spree.admin_users_path, icon: 'user' do %>
|
7
|
+
<%- render "spree/admin/users/sub_menu" %>
|
8
|
+
<%- end %>
|
9
|
+
ERB
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<!-- insert_bottom '[data-hook="admin_product_form_right"]' -->
|
2
|
+
<div class="field">
|
3
|
+
<%= f.check_box(:gift_card) %>
|
4
|
+
<%= f.label :gift_card, Spree.t("admin.gift_cards.gift_card") %>
|
5
|
+
<span class="info">
|
6
|
+
<%= Spree.t("admin.gift_cards.convert_product_label") %>
|
7
|
+
</span>
|
8
|
+
</div>
|
@@ -1,33 +1,41 @@
|
|
1
|
-
|
2
|
-
<%=
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
<% content_for :table_filter_title do %>
|
2
|
+
<%= Spree.t(:search) %>
|
3
|
+
<% end %>
|
4
|
+
|
5
|
+
<% content_for :table_filter do %>
|
6
|
+
<div class='gift-card-code-lookup'>
|
7
|
+
<%= search_form_for @search, url: admin_gift_cards_path(@search) do |f| %>
|
8
|
+
<div class="alpha four columns">
|
9
|
+
<div class="field">
|
10
|
+
<%= label_tag nil, "Redemption Code" %>
|
11
|
+
<%= f.text_field :redemption_code_cont, size: 27 %>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<div class="four columns">
|
15
|
+
<div class="field">
|
16
|
+
<%= label_tag nil, "Recipient Email" %>
|
17
|
+
<%= f.text_field :recipient_email_cont, size: 25 %>
|
18
|
+
</div>
|
7
19
|
</div>
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
20
|
+
<div class="four columns">
|
21
|
+
<div class="field">
|
22
|
+
<%= label_tag nil, "Order Number" %>
|
23
|
+
<%= f.text_field :line_item_order_number_cont, size: 25 %>
|
24
|
+
</div>
|
13
25
|
</div>
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
26
|
+
<div class="omega four columns">
|
27
|
+
<div class="field">
|
28
|
+
<%= label_tag nil, "Send Date" %>
|
29
|
+
<%= f.text_field :sent_at_or_send_email_at_is, class: 'datepicker', size: 25 %>
|
30
|
+
</div>
|
19
31
|
</div>
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
<%=
|
32
|
+
|
33
|
+
<div class="clearfix"></div>
|
34
|
+
|
35
|
+
<div class="actions filter-actions">
|
36
|
+
<%= button 'Lookup Gift Card', 'search' %>
|
25
37
|
</div>
|
26
|
-
|
27
|
-
<div class="clearfix"></div>
|
28
|
-
<div class="actions filter-actions">
|
29
|
-
<%= button 'Lookup Gift Card', 'search', class: 'lookup-gift-card-button' %>
|
30
|
-
</div>
|
31
|
-
<% end %>
|
38
|
+
<% end %>
|
32
39
|
</div>
|
40
|
+
<% end %>
|
33
41
|
|
@@ -67,15 +67,23 @@
|
|
67
67
|
<%= f.text_field :send_email_at, :class => 'datepicker datepicker-from giftcard-datepicker' %>
|
68
68
|
<% end %>
|
69
69
|
<% end %>
|
70
|
+
|
71
|
+
<% if @gift_card.deactivated_at %>
|
72
|
+
<div class="deactivated-at">
|
73
|
+
Deactivated at: <%= @gift_card.formatted_deactivated_at %>
|
74
|
+
</div>
|
75
|
+
<% end %>
|
70
76
|
</div>
|
71
77
|
</div>
|
72
78
|
|
73
79
|
<%= render :partial => 'spree/admin/shared/edit_resource_links', locals: { collection_url: edit_admin_order_path(@order) } %>
|
74
80
|
</fieldset>
|
81
|
+
<% end %>
|
82
|
+
|
75
83
|
|
76
|
-
|
77
|
-
|
78
|
-
<%= button_link_to "Send email now", send_email_admin_order_gift_card_path(@order, @gift_card), :icon => 'email', :data => { :confirm => "Any changes that have not been updated will not send" } %>
|
79
|
-
|
84
|
+
<% if @gift_card.can_deactivate? && can?(:deactivate, @gift_card) %>
|
85
|
+
<div class="form-buttons filter-actions actions gift-card-actions" data-hook="buttons">
|
86
|
+
<%= button_link_to "Send email now", send_email_admin_order_gift_card_path(@order, @gift_card), :icon => 'email', :method => 'put', :data => { :confirm => "Any changes that have not been updated will not send" } %>
|
87
|
+
<%= button_link_to "Deactivate", deactivate_admin_order_gift_card_path(@order, @gift_card), :icon => 'ban', :method => 'put', :data => { :confirm => "Are you sure you want to deactivate the gift card?" } %>
|
80
88
|
</div>
|
81
89
|
<% end %>
|
@@ -1,2 +1,7 @@
|
|
1
1
|
<br><strong><%= Spree.t('admin.gift_cards.redemption_code') %>:</strong> <%= gift_card.redemption_code %>
|
2
|
-
<br
|
2
|
+
<br>
|
3
|
+
<% if gift_card.deactivated? %>
|
4
|
+
<b>DEACTIVATED</b>
|
5
|
+
<% end %>
|
6
|
+
<% edit_text = gift_card.deactivated? ? "(Details)" : "(Edit Details)" %>
|
7
|
+
<%= link_to edit_text, edit_admin_order_gift_card_path(@order, gift_card), class: 'edit-gift-card-details' %>
|
@@ -1,10 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
<% if can?(:display, Spree::VirtualGiftCard) %>
|
6
|
-
<%= tab :gift_cards, :match_path => '/users/gift_cards' %>
|
7
|
-
<% end %>
|
8
|
-
</ul>
|
1
|
+
<ul class="admin-subnav">
|
2
|
+
<%= tab :users, match_path: /\/users$/ %>
|
3
|
+
<% if can?(:display, Spree::VirtualGiftCard) %>
|
4
|
+
<%= tab :gift_cards, match_path: "/users/gift_cards" %>
|
9
5
|
<% end %>
|
10
|
-
|
6
|
+
</ul>
|
data/config/locales/en.yml
CHANGED
@@ -3,11 +3,17 @@ en:
|
|
3
3
|
spree:
|
4
4
|
admin:
|
5
5
|
gift_cards:
|
6
|
+
convert_product_label: "Turn this product into a gift card?"
|
7
|
+
deactivated_gift_card: "Gift card deactivated"
|
6
8
|
editing_gift_card: "Editing Gift Card"
|
7
9
|
gift_card: "Gift Card"
|
8
10
|
gift_card_details: "Gift Card Details"
|
9
11
|
gift_card_originator: "Gift Card - Order #%{order_number}"
|
10
12
|
gift_card_updated: "Gift card updated!"
|
13
|
+
gift_message: "Gift Message"
|
14
|
+
purchaser_name: "Purchaser Name"
|
15
|
+
recipient_email: "Recipient Email"
|
16
|
+
recipient_name: "Recipient Name"
|
11
17
|
redeem: "Redeem"
|
12
18
|
redeem_gift_card: "Redeem Gift Card"
|
13
19
|
redeemed_gift_card: "Redeemed Gift Card"
|
@@ -15,10 +21,15 @@ en:
|
|
15
21
|
errors:
|
16
22
|
not_found: "Gift card was not found"
|
17
23
|
please_try_again: "Please try again"
|
24
|
+
unable_to_deactivate_gift_card: "Unable to deactivate gift card"
|
18
25
|
unable_to_redeem_gift_card: "Unable to redeem gift card"
|
26
|
+
unable_to_reimburse_gift_card: "Unable to reimburse gift card"
|
27
|
+
tab:
|
28
|
+
gift_cards: "Gift Cards"
|
19
29
|
gift_card_mailer:
|
20
30
|
gift_card_email:
|
21
31
|
dear_customer: "Dear customer"
|
22
32
|
your_gift_card_code: "Here is your gift card code"
|
23
33
|
gift_card_code: "Gift card code: %{code}"
|
24
34
|
subject: "Your gift card code"
|
35
|
+
listing_gift_cards: "Listing Gift Cards"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
---
|
2
|
+
it:
|
3
|
+
spree:
|
4
|
+
admin:
|
5
|
+
gift_cards:
|
6
|
+
editing_gift_card: "Modifica Gift Card"
|
7
|
+
deactivated_gift_card: "Gift Card disattivata"
|
8
|
+
gift_card: "Gift Card"
|
9
|
+
gift_card_details: "Dettagli Gift Card"
|
10
|
+
gift_card_originator: "Gift Card - Ordine #%{order_number}"
|
11
|
+
gift_card_updated: "Gift Card aggiornata!"
|
12
|
+
redeem: "Riscuoti"
|
13
|
+
redeem_gift_card: "Utilizza Gift Card"
|
14
|
+
redeemed_gift_card: "Utilizza la tua Gift Card"
|
15
|
+
redemption_code: "Codice Gift Card"
|
16
|
+
errors:
|
17
|
+
not_found: "La Gift Card non è stata trovata"
|
18
|
+
please_try_again: "Si prega di riprovare"
|
19
|
+
unable_to_deactivate_gift_card: "Impossibile disattivate la Gift Card"
|
20
|
+
unable_to_redeem_gift_card: "Impossibile utilizzare la Gift Card"
|
21
|
+
unable_to_reimburse_gift_card: "Impossibile rimborsare la Gift Card"
|
22
|
+
gift_card_mailer:
|
23
|
+
gift_card_email:
|
24
|
+
dear_customer: "Gentile CLiente"
|
25
|
+
your_gift_card_code: "ecco il codice della tua Gift Card"
|
26
|
+
gift_card_code: "Codice Gift Card: %{code}"
|
27
|
+
subject: "Il codice della tua Gift Card"
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
class BackfillInventoryUnitsOnGiftCard < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
gift_card_products = Spree::Product.where(gift_card: true)
|
4
|
+
|
5
|
+
gift_card_products.find_each do |product|
|
6
|
+
line_items = product.line_items
|
7
|
+
|
8
|
+
line_items.find_each do |line_item|
|
9
|
+
if line_item.order.completed? && !line_item.gift_cards.all? {|gc| gc.inventory_unit.present? }
|
10
|
+
inventory_units = line_item.inventory_units
|
11
|
+
|
12
|
+
line_item.gift_cards.each_with_index do |gift_card, i|
|
13
|
+
inventory_unit = inventory_units[i]
|
14
|
+
gift_card.update_attributes!(inventory_unit: inventory_unit)
|
15
|
+
say "Updating gift card #{gift_card.id} to have inventory unit #{inventory_unit.id}"
|
16
|
+
end
|
17
|
+
else
|
18
|
+
say "Skipping line_item #{line_item.id}. Order incomplete or gift cards associated to inventory units"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def down
|
25
|
+
Spree::VirtualGiftCard.update_all(inventory_unit_id: nil)
|
26
|
+
end
|
27
|
+
end
|
@@ -8,10 +8,6 @@ module SolidusVirtualGiftCard
|
|
8
8
|
append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/solidus_virtual_gift_card\n"
|
9
9
|
end
|
10
10
|
|
11
|
-
def add_stylesheets
|
12
|
-
inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/solidus_virtual_gift_card\n", before: /\*\//, verbose: true
|
13
|
-
end
|
14
|
-
|
15
11
|
def include_seed_data
|
16
12
|
append_file "db/seeds.rb", <<-SEEDS
|
17
13
|
\n
|
@@ -12,6 +12,11 @@ FactoryGirl.define do
|
|
12
12
|
|
13
13
|
factory :redeemable_virtual_gift_card do
|
14
14
|
association :purchaser, factory: :user
|
15
|
+
inventory_unit do |gift_card|
|
16
|
+
gift_card.line_item.inventory_units.select{|iu| iu.gift_card.nil? }.first ||
|
17
|
+
create(:inventory_unit, line_item: gift_card.line_item)
|
18
|
+
end
|
19
|
+
|
15
20
|
redeemable true
|
16
21
|
|
17
22
|
before(:create) do |gift_card, evaluator|
|
@@ -3,21 +3,22 @@
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.name = "solidus_virtual_gift_card"
|
6
|
-
s.version = "1.0
|
6
|
+
s.version = "1.2.0"
|
7
7
|
s.summary = "Virtual gift card for purchase, drops into the user's account as store credit"
|
8
8
|
s.required_ruby_version = ">= 2.1"
|
9
9
|
|
10
|
-
s.author = "
|
11
|
-
s.email = "
|
12
|
-
s.homepage = "
|
13
|
-
s.license =
|
10
|
+
s.author = "Solidus Team"
|
11
|
+
s.email = "contact@solidus.io"
|
12
|
+
s.homepage = "https://solidus.io"
|
13
|
+
s.license = "BSD-3-Clause"
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
17
|
s.require_path = "lib"
|
18
18
|
s.requirements << "none"
|
19
19
|
|
20
|
-
s.add_dependency "solidus",
|
20
|
+
s.add_dependency "solidus", "~> 1.2.0"
|
21
|
+
s.add_dependency "deface"
|
21
22
|
|
22
23
|
s.add_development_dependency "rspec-rails", "~> 3.2"
|
23
24
|
s.add_development_dependency "simplecov"
|
@@ -26,6 +27,7 @@ Gem::Specification.new do |s|
|
|
26
27
|
s.add_development_dependency "coffee-rails"
|
27
28
|
s.add_development_dependency "factory_girl"
|
28
29
|
s.add_development_dependency "capybara"
|
30
|
+
s.add_development_dependency "poltergeist"
|
29
31
|
s.add_development_dependency "database_cleaner"
|
30
32
|
s.add_development_dependency "ffaker"
|
31
33
|
end
|
@@ -24,6 +24,62 @@ describe Spree::Admin::GiftCardsController do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
describe 'PUT deactivate' do
|
28
|
+
let(:user) { create :user }
|
29
|
+
let!(:gift_card) { create(:redeemable_virtual_gift_card, line_item: order.line_items.first) }
|
30
|
+
let(:order) { create(:shipped_order, line_items_count: 1) }
|
31
|
+
let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
|
32
|
+
|
33
|
+
subject { spree_put :deactivate, id: gift_card.id, order_id: order.number }
|
34
|
+
|
35
|
+
context "when successful" do
|
36
|
+
it "redirects to the admin order edit page" do
|
37
|
+
expect(subject).to redirect_to spree.edit_admin_order_path(order)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "deactivates the gift card" do
|
41
|
+
subject
|
42
|
+
expect(gift_card.reload.deactivated_at).to be_present
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when deactivating fails without raising an exception" do
|
47
|
+
before { expect_any_instance_of(Spree::VirtualGiftCard).to receive(:deactivate).and_return(false) }
|
48
|
+
|
49
|
+
it "does not deactivate the gift card" do
|
50
|
+
subject
|
51
|
+
expect(gift_card.reload.deactivated_at).to be_nil
|
52
|
+
end
|
53
|
+
|
54
|
+
it "redirects to gift card edit page" do
|
55
|
+
expect(subject).to redirect_to spree.edit_admin_order_gift_card_path(order, gift_card)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "sets the flash message" do
|
59
|
+
subject
|
60
|
+
expect(flash[:error]).to eq Spree.t('admin.gift_cards.errors.unable_to_reimburse_gift_card')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when deactivating fails from reimbursement" do
|
65
|
+
before { expect_any_instance_of(Spree::VirtualGiftCard).to receive(:deactivate).and_raise(Spree::Reimbursement::IncompleteReimbursementError) }
|
66
|
+
|
67
|
+
it "does not deactivate the gift card" do
|
68
|
+
subject
|
69
|
+
expect(gift_card.reload.deactivated_at).to be_nil
|
70
|
+
end
|
71
|
+
|
72
|
+
it "redirects to gift card edit page" do
|
73
|
+
expect(subject).to redirect_to spree.edit_admin_order_gift_card_path(order, gift_card)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "sets the flash message" do
|
77
|
+
subject
|
78
|
+
expect(flash[:error]).to eq Spree.t('admin.gift_cards.errors.unable_to_reimburse_gift_card')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
27
83
|
describe 'POST redeem' do
|
28
84
|
let(:user) { create :user }
|
29
85
|
let(:gift_card) { create(:redeemable_virtual_gift_card) }
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Gift Cards', type: :feature, js: true do
|
4
|
+
stub_authorization!
|
5
|
+
|
6
|
+
let(:admin_user) { create(:admin_user) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
allow_any_instance_of(Spree::Admin::BaseController).to receive(:spree_current_user).and_return(admin_user)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "edit product" do
|
13
|
+
let(:product) { create(:product, available_on: 1.year.from_now) }
|
14
|
+
|
15
|
+
it "can mark a product as a gift card" do
|
16
|
+
visit spree.admin_product_path(product)
|
17
|
+
|
18
|
+
find('#product_gift_card').click
|
19
|
+
|
20
|
+
click_on 'Update'
|
21
|
+
|
22
|
+
expect(page).to have_content("successfully updated!")
|
23
|
+
expect(page).to have_field('product_gift_card', checked: true)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spree::GiftCardMailer, type: :mailer do
|
4
|
+
context '#gift_card_email' do
|
5
|
+
let(:gift_card) { create(:redeemable_virtual_gift_card) }
|
6
|
+
|
7
|
+
subject { Spree::GiftCardMailer.gift_card_email(gift_card) }
|
8
|
+
|
9
|
+
context "the recipient email is blank" do
|
10
|
+
before do
|
11
|
+
gift_card.update_attributes!(recipient_email: "")
|
12
|
+
gift_card.line_item.order.update_attributes!(email: "gift_card_tester@example.com")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "uses the email associated with the order" do
|
16
|
+
expect(subject.to).to contain_exactly('gift_card_tester@example.com')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -39,7 +39,7 @@ describe Spree::LineItem do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it 'contains the correct keys and values' do
|
42
|
-
gift_card_details = subject.
|
42
|
+
gift_card_details = subject.detect{|x| x[:redemption_code] == gift_card.formatted_redemption_code }
|
43
43
|
expect(gift_card_details[:amount]).to eq gift_card.formatted_amount
|
44
44
|
expect(gift_card_details[:redemption_code]).to eq gift_card.formatted_redemption_code
|
45
45
|
expect(gift_card_details[:recipient_email]).to eq gift_card.recipient_email
|
@@ -19,10 +19,97 @@ describe Spree::VirtualGiftCard do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
describe "#can_deactivate?" do
|
23
|
+
subject { gift_card.can_deactivate? }
|
24
|
+
|
25
|
+
let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
|
26
|
+
let(:gift_card) { create(:redeemable_virtual_gift_card, line_item: order.line_items.first) }
|
27
|
+
|
28
|
+
context "the order is not complete" do
|
29
|
+
let(:order) { create(:order_with_line_items, line_items_count: 1) }
|
30
|
+
|
31
|
+
it "can't deactivate" do
|
32
|
+
expect(subject).to be_falsey
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "gift card is already deactivated" do
|
37
|
+
before { gift_card.deactivate }
|
38
|
+
let(:order) { create(:shipped_order, line_items_count: 1) }
|
39
|
+
|
40
|
+
it "can't deactivate" do
|
41
|
+
expect(subject).to be_falsey
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "order is not paid" do
|
46
|
+
let(:order) { create(:order_with_line_items, line_items_count: 1) }
|
47
|
+
|
48
|
+
it "can't deactivate" do
|
49
|
+
expect(subject).to be_falsey
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "order is paid and complete and gift card is active" do
|
54
|
+
let(:order) { create(:shipped_order, line_items_count: 1) }
|
55
|
+
|
56
|
+
it "can deactivate" do
|
57
|
+
expect(subject).to be_truthy
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#deactivate" do
|
63
|
+
let!(:gift_card) { create(:redeemable_virtual_gift_card, line_item: order.line_items.first) }
|
64
|
+
let(:order) { create(:shipped_order, line_items_count: 1) }
|
65
|
+
let!(:default_refund_reason) { Spree::RefundReason.find_or_create_by!(name: Spree::RefundReason::RETURN_PROCESSING_REASON, mutable: false) }
|
66
|
+
subject { gift_card.deactivate }
|
67
|
+
|
68
|
+
it "makes it not redeemable" do
|
69
|
+
subject
|
70
|
+
expect(gift_card.reload.redeemable?).to be_falsey
|
71
|
+
end
|
72
|
+
|
73
|
+
it "sets the deactivated_at" do
|
74
|
+
subject
|
75
|
+
expect(gift_card.reload.deactivated_at).to be_present
|
76
|
+
end
|
77
|
+
|
78
|
+
it "#deactivated? returns true" do
|
79
|
+
subject
|
80
|
+
expect(gift_card.reload.deactivated?).to be_truthy
|
81
|
+
end
|
82
|
+
|
83
|
+
it "cancels the inventory unit" do
|
84
|
+
subject
|
85
|
+
expect(gift_card.inventory_unit.unit_cancel).to be_present
|
86
|
+
end
|
87
|
+
|
88
|
+
it "creates a reimbursement" do
|
89
|
+
expect { subject }.to change { Spree::Reimbursement.count }.by(1)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "returns true" do
|
93
|
+
expect(subject).to be_truthy
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
22
97
|
describe '#make_redeemable!' do
|
23
98
|
let(:user) { create(:user) }
|
24
99
|
let(:gift_card) { create(:virtual_gift_card) }
|
25
|
-
|
100
|
+
let(:order) { create(:shipped_order, line_items_count: 1) }
|
101
|
+
let(:inventory_unit) { order.inventory_units.first }
|
102
|
+
subject { gift_card.make_redeemable!(purchaser: user, inventory_unit: inventory_unit) }
|
103
|
+
|
104
|
+
it "sets the purchaser" do
|
105
|
+
subject
|
106
|
+
expect(gift_card.purchaser).to be user
|
107
|
+
end
|
108
|
+
|
109
|
+
it "sets the inventory unit" do
|
110
|
+
subject
|
111
|
+
expect(gift_card.inventory_unit).to be inventory_unit
|
112
|
+
end
|
26
113
|
|
27
114
|
context 'no collision on redemption code' do
|
28
115
|
it 'sets a redemption code' do
|
@@ -85,6 +172,19 @@ describe Spree::VirtualGiftCard do
|
|
85
172
|
end
|
86
173
|
end
|
87
174
|
|
175
|
+
describe '#deactivated?' do
|
176
|
+
let(:gift_card) { build(:virtual_gift_card) }
|
177
|
+
|
178
|
+
it 'is deactivated if there is a deactivated_at set' do
|
179
|
+
gift_card.deactivated_at = Time.now
|
180
|
+
expect(gift_card.deactivated?).to be true
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'is not deactivated if there is no timestamp for deactivated_at' do
|
184
|
+
expect(gift_card.deactivated?).to be false
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
88
188
|
describe '#redeem' do
|
89
189
|
let(:gift_card) { create(:redeemable_virtual_gift_card) }
|
90
190
|
let(:redeemer) { create(:user) }
|
@@ -108,6 +208,26 @@ describe Spree::VirtualGiftCard do
|
|
108
208
|
end
|
109
209
|
end
|
110
210
|
|
211
|
+
context 'it has been deactivated' do
|
212
|
+
before do
|
213
|
+
expect(gift_card).to receive(:cancel_and_reimburse_inventory_unit).and_return(true)
|
214
|
+
gift_card.deactivate
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'should return false' do
|
218
|
+
expect(subject).to be false
|
219
|
+
end
|
220
|
+
|
221
|
+
context 'does nothing to the gift card' do
|
222
|
+
it 'should not create a store credit' do
|
223
|
+
expect(gift_card.store_credit).not_to be_present
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'should not update the gift card' do
|
227
|
+
expect { subject }.to_not change{ gift_card }
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
111
231
|
|
112
232
|
context 'it has already been redeemed' do
|
113
233
|
before { gift_card.redeemed_at = Date.yesterday }
|
data/spec/spec_helper.rb
CHANGED
@@ -30,6 +30,12 @@ require 'cancan/matchers'
|
|
30
30
|
|
31
31
|
require "spree_virtual_gift_card/factories"
|
32
32
|
|
33
|
+
require "capybara/poltergeist"
|
34
|
+
Capybara.register_driver :poltergeist do |app|
|
35
|
+
Capybara::Poltergeist::Driver.new(app, timeout: 120)
|
36
|
+
end
|
37
|
+
Capybara.javascript_driver = :poltergeist
|
38
|
+
|
33
39
|
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
|
34
40
|
|
35
41
|
RSpec.configure do |config|
|
@@ -52,16 +58,17 @@ RSpec.configure do |config|
|
|
52
58
|
config.include Spree::TestingSupport::ControllerRequests, type: :controller
|
53
59
|
config.include Spree::TestingSupport::UrlHelpers, type: :controller
|
54
60
|
|
55
|
-
# Ensure Suite is set to use transactions for speed.
|
56
61
|
config.before :suite do
|
57
|
-
DatabaseCleaner.strategy = :transaction
|
58
62
|
DatabaseCleaner.clean_with :truncation
|
59
63
|
end
|
60
64
|
|
61
|
-
# Before each spec check if it is a Javascript test and switch between using
|
62
|
-
# database transactions or not where necessary.
|
63
65
|
config.before :each do |example|
|
64
|
-
|
66
|
+
if RSpec.current_example.metadata[:js]
|
67
|
+
page.driver.browser.url_blacklist = ['http://fonts.googleapis.com']
|
68
|
+
DatabaseCleaner.strategy = :truncation
|
69
|
+
else
|
70
|
+
DatabaseCleaner.strategy = :transaction
|
71
|
+
end
|
65
72
|
DatabaseCleaner.start
|
66
73
|
|
67
74
|
Spree::Api::Config[:requires_authentication] = true
|
@@ -69,7 +76,14 @@ RSpec.configure do |config|
|
|
69
76
|
end
|
70
77
|
|
71
78
|
# After each spec clean the database.
|
72
|
-
config.
|
79
|
+
config.append_after :each do
|
73
80
|
DatabaseCleaner.clean
|
74
81
|
end
|
82
|
+
|
83
|
+
if defined?(VersionCake::TestHelpers)
|
84
|
+
config.include VersionCake::TestHelpers, type: :controller
|
85
|
+
config.before(:each, type: :controller) do
|
86
|
+
set_request_version('', 1)
|
87
|
+
end
|
88
|
+
end
|
75
89
|
end
|
metadata
CHANGED
@@ -1,35 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidus_virtual_gift_card
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Solidus Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solidus
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.0
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 1.2.0
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.2.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: deface
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
26
30
|
requirements:
|
27
31
|
- - ">="
|
28
32
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
31
39
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
40
|
+
version: '0'
|
33
41
|
- !ruby/object:Gem::Dependency
|
34
42
|
name: rspec-rails
|
35
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,6 +136,20 @@ dependencies:
|
|
128
136
|
- - ">="
|
129
137
|
- !ruby/object:Gem::Version
|
130
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: poltergeist
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
131
153
|
- !ruby/object:Gem::Dependency
|
132
154
|
name: database_cleaner
|
133
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,26 +179,31 @@ dependencies:
|
|
157
179
|
- !ruby/object:Gem::Version
|
158
180
|
version: '0'
|
159
181
|
description:
|
160
|
-
email:
|
182
|
+
email: contact@solidus.io
|
161
183
|
executables: []
|
162
184
|
extensions: []
|
163
185
|
extra_rdoc_files: []
|
164
186
|
files:
|
165
187
|
- ".gitignore"
|
166
188
|
- ".rspec"
|
189
|
+
- ".travis.yml"
|
167
190
|
- Gemfile
|
168
191
|
- LICENSE
|
169
192
|
- README.md
|
170
193
|
- Rakefile
|
171
194
|
- app/assets/javascripts/spree/backend/solidus_virtual_gift_card.coffee
|
195
|
+
- app/assets/javascripts/spree/frontend/solidus_virtual_gift_card.js
|
172
196
|
- app/assets/stylesheets/spree/backend/solidus_virtual_gift_card.css
|
197
|
+
- app/assets/stylesheets/spree/frontend/solidus_virtual_gift_card.css
|
173
198
|
- app/controllers/spree/admin/gift_cards_controller.rb
|
174
199
|
- app/controllers/spree/api/gift_cards_controller.rb
|
175
200
|
- app/mailers/spree/gift_card_mailer.rb
|
201
|
+
- app/models/concerns/spree/gift_cards/inventory_unit_concerns.rb
|
176
202
|
- app/models/concerns/spree/gift_cards/line_item_concerns.rb
|
177
203
|
- app/models/concerns/spree/gift_cards/order_concerns.rb
|
178
204
|
- app/models/concerns/spree/gift_cards/order_contents_concerns.rb
|
179
205
|
- app/models/concerns/spree/redemption_code_generator.rb
|
206
|
+
- app/models/spree/inventory_unit_decorator.rb
|
180
207
|
- app/models/spree/line_item_decorator.rb
|
181
208
|
- app/models/spree/order_contents_decorator.rb
|
182
209
|
- app/models/spree/order_decorator.rb
|
@@ -188,6 +215,7 @@ files:
|
|
188
215
|
- app/overrides/admin_item_view_gift_card_codes.rb
|
189
216
|
- app/overrides/admin_user_sidebar_store_credits.rb
|
190
217
|
- app/overrides/admin_user_sub_menu.rb
|
218
|
+
- app/overrides/spree/admin/products/_form/add_gift_card.html.erb.deface
|
191
219
|
- app/views/spree/admin/gift_cards/_lookup_form.html.erb
|
192
220
|
- app/views/spree/admin/gift_cards/_redemption_form.html.erb
|
193
221
|
- app/views/spree/admin/gift_cards/edit.html.erb
|
@@ -207,6 +235,7 @@ files:
|
|
207
235
|
- config/initializers/line_item_controller_gift_card_details.rb
|
208
236
|
- config/initializers/ransack.rb
|
209
237
|
- config/locales/en.yml
|
238
|
+
- config/locales/it.yml
|
210
239
|
- config/routes.rb
|
211
240
|
- db/migrate/20140623152903_create_virtual_gift_card.rb
|
212
241
|
- db/migrate/20140624175113_seed_gift_card_category.rb
|
@@ -217,6 +246,9 @@ files:
|
|
217
246
|
- db/migrate/20151013210615_add_active_flag_to_virtual_gift_card.rb
|
218
247
|
- db/migrate/20151013214647_set_redeemable_true_on_virtual_gift_cards.rb
|
219
248
|
- db/migrate/20151019190731_add_email_send_time_to_virtual_gift_card.rb
|
249
|
+
- db/migrate/20151109202300_add_deactivated_at_to_gift_card.rb
|
250
|
+
- db/migrate/20151110202752_add_inventory_unit_to_gift_card.rb
|
251
|
+
- db/migrate/20151111211220_backfill_inventory_units_on_gift_card.rb
|
220
252
|
- db/seeds.rb
|
221
253
|
- lib/generators/solidus_virtual_gift_card/install/install_generator.rb
|
222
254
|
- lib/solidus_virtual_gift_card.rb
|
@@ -227,7 +259,9 @@ files:
|
|
227
259
|
- spec/controllers/spree/admin/gift_cards_controller_spec.rb
|
228
260
|
- spec/controllers/spree/api/gift_cards_controller_spec.rb
|
229
261
|
- spec/features/admin/gift_cards_spec.rb
|
262
|
+
- spec/features/admin/products_card_spec.rb
|
230
263
|
- spec/lib/tasks/send_gift_card_emails_spec.rb
|
264
|
+
- spec/mailers/spree/gift_card_mailer_spec.rb
|
231
265
|
- spec/models/concerns/spree/redemption_code_generator_spec.rb
|
232
266
|
- spec/models/spree/line_item_spec.rb
|
233
267
|
- spec/models/spree/order_contents_spec.rb
|
@@ -237,9 +271,9 @@ files:
|
|
237
271
|
- spec/models/spree/store_credit_category_spec.rb
|
238
272
|
- spec/models/spree/virtual_gift_card_spec.rb
|
239
273
|
- spec/spec_helper.rb
|
240
|
-
homepage:
|
274
|
+
homepage: https://solidus.io
|
241
275
|
licenses:
|
242
|
-
- BSD-3
|
276
|
+
- BSD-3-Clause
|
243
277
|
metadata: {}
|
244
278
|
post_install_message:
|
245
279
|
rdoc_options: []
|
@@ -258,7 +292,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
258
292
|
requirements:
|
259
293
|
- none
|
260
294
|
rubyforge_project:
|
261
|
-
rubygems_version: 2.
|
295
|
+
rubygems_version: 2.4.5.1
|
262
296
|
signing_key:
|
263
297
|
specification_version: 4
|
264
298
|
summary: Virtual gift card for purchase, drops into the user's account as store credit
|
@@ -266,7 +300,9 @@ test_files:
|
|
266
300
|
- spec/controllers/spree/admin/gift_cards_controller_spec.rb
|
267
301
|
- spec/controllers/spree/api/gift_cards_controller_spec.rb
|
268
302
|
- spec/features/admin/gift_cards_spec.rb
|
303
|
+
- spec/features/admin/products_card_spec.rb
|
269
304
|
- spec/lib/tasks/send_gift_card_emails_spec.rb
|
305
|
+
- spec/mailers/spree/gift_card_mailer_spec.rb
|
270
306
|
- spec/models/concerns/spree/redemption_code_generator_spec.rb
|
271
307
|
- spec/models/spree/line_item_spec.rb
|
272
308
|
- spec/models/spree/order_contents_spec.rb
|