diff --git a/Gemfile b/Gemfile index 6685892..eaab950 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,10 @@ gem 'spree', github: 'spree/spree', branch: 'master' # Provides basic authentication functionality for testing parts of your engine gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master' -gem 'byebug', '~> 9.0.6' +gem 'byebug', '>= 9.0.6' + +group :test do + gem 'rails-controller-testing', '~> 1.0.4' +end gemspec diff --git a/README.md b/README.md index 036fd65..9e9745d 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ Try Spree Item Returns for Spree 3-4 with direct deployment on Heroku: [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/vinsol-spree-contrib/spree-demo-heroku/tree/spree-item-returns-3-4) +Try Spree Item Returns for Spree 4-1 with direct deployment on Heroku: + +[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/vinsol-spree-contrib/spree-demo-heroku/tree/spree-item-returns-4-1) + ## FEATURES diff --git a/app/assets/images/send.svg b/app/assets/images/send.svg new file mode 100644 index 0000000..8ef07bd --- /dev/null +++ b/app/assets/images/send.svg @@ -0,0 +1,14 @@ + + + diff --git a/app/assets/javascripts/spree/return_authorization.js b/app/assets/javascripts/spree/return_authorization.js index 4894d72..7a5c462 100644 --- a/app/assets/javascripts/spree/return_authorization.js +++ b/app/assets/javascripts/spree/return_authorization.js @@ -1,2 +1,3 @@ //= require 'spree/backend/returns/return_item_selection' //= require 'spree/frontend/return_item_options_selection' +//= require jquery diff --git a/app/helpers/spree/frontend_helper_decorator.rb b/app/helpers/spree/return_authorizations_helper.rb similarity index 91% rename from app/helpers/spree/frontend_helper_decorator.rb rename to app/helpers/spree/return_authorizations_helper.rb index b338a27..89270d8 100644 --- a/app/helpers/spree/frontend_helper_decorator.rb +++ b/app/helpers/spree/return_authorizations_helper.rb @@ -1,4 +1,4 @@ -Spree::FrontendHelper.class_eval do +module Spree::ReturnAuthorizationsHelper def exchange_for_item_return?(return_item) return_item.persisted? && return_item.exchange_variant_id? diff --git a/app/models/spree/app_configuration_decorator.rb b/app/models/spree/app_configuration_decorator.rb deleted file mode 100644 index 3824833..0000000 --- a/app/models/spree/app_configuration_decorator.rb +++ /dev/null @@ -1,3 +0,0 @@ -Spree::AppConfiguration.class_eval do - preference :return_initiation_admin_mail_address, :string, default: 'spree@example.com' -end diff --git a/app/models/spree/order_decorator.rb b/app/models/spree/order_decorator.rb deleted file mode 100644 index f8505e8..0000000 --- a/app/models/spree/order_decorator.rb +++ /dev/null @@ -1,14 +0,0 @@ -Spree::Order.class_eval do - - SHIPPED_STATES = ['shipped', 'partial'] - scope :returned, -> { where(shipment_state: SHIPPED_STATES) } - - def has_returnable_products? - products.returnable.exists? - end - - def has_returnable_line_items? - line_items.any?(&:is_returnable?) - end - -end diff --git a/app/models/spree/product_decorator.rb b/app/models/spree/product_decorator.rb deleted file mode 100644 index 9bc923a..0000000 --- a/app/models/spree/product_decorator.rb +++ /dev/null @@ -1,7 +0,0 @@ -Spree::Product.class_eval do - - validates :return_time, numericality: { greater_than_or_equal_to: 0 } - - scope :returnable, -> { where(returnable: true) } - -end diff --git a/app/models/spree/return_authorization_decorator.rb b/app/models/spree/return_authorization_decorator.rb deleted file mode 100644 index 5cd834b..0000000 --- a/app/models/spree/return_authorization_decorator.rb +++ /dev/null @@ -1,30 +0,0 @@ -Spree::ReturnAuthorization.class_eval do - - stock_location_validations = _validators[:stock_location] - if stock_location_validations.present? - stock_location_validations.reject! { |validation| validation.is_a? ActiveRecord::Validations::PresenceValidator } - end - - _validate_callbacks.each do |callback| - callback.raw_filter.attributes.delete :stock_location if callback.raw_filter.is_a?(ActiveModel::Validations::PresenceValidator) - end - - validates :stock_location, presence: true, unless: :user_initiated? - validates :return_items, presence: true, if: :user_initiated? - - after_commit :notify_admin, :notify_user, on: :create, if: :user_initiated? - - def allow_return_item_changes? - !customer_returned_items? - end - - private - def notify_admin - Spree::ReturnAuthorizationMailer.notify_return_initialization_to_admin(number).deliver_later - end - - def notify_user - Spree::ReturnAuthorizationMailer.notify_return_initialization_to_user(number).deliver_later - end - -end diff --git a/app/models/spree/user_decorator.rb b/app/models/spree/user_decorator.rb deleted file mode 100644 index 58cfc36..0000000 --- a/app/models/spree/user_decorator.rb +++ /dev/null @@ -1,3 +0,0 @@ -Spree::User.class_eval do - has_many :return_authorizations, through: :orders -end \ No newline at end of file diff --git a/app/models/spree_item_returns/app_configuration_decorator.rb b/app/models/spree_item_returns/app_configuration_decorator.rb new file mode 100644 index 0000000..3e7999a --- /dev/null +++ b/app/models/spree_item_returns/app_configuration_decorator.rb @@ -0,0 +1,8 @@ +module SpreeItemReturns::AppConfigurationDecorator + + def self.prepended(base) + base.preference :return_initiation_admin_mail_address, :string, default: 'spree@example.com' + end +end + +Spree::AppConfiguration.prepend SpreeItemReturns::AppConfigurationDecorator diff --git a/app/models/spree/line_item_decorator.rb b/app/models/spree_item_returns/line_item_decorator.rb similarity index 64% rename from app/models/spree/line_item_decorator.rb rename to app/models/spree_item_returns/line_item_decorator.rb index 8ca984a..6581e4a 100644 --- a/app/models/spree/line_item_decorator.rb +++ b/app/models/spree_item_returns/line_item_decorator.rb @@ -1,4 +1,4 @@ -Spree::LineItem.class_eval do +module SpreeItemReturns::LineItemDecorator def is_returnable? return false unless product.returnable? @@ -7,3 +7,5 @@ def is_returnable? end end + +Spree::LineItem.prepend SpreeItemReturns::LineItemDecorator diff --git a/app/models/spree_item_returns/order_decorator.rb b/app/models/spree_item_returns/order_decorator.rb new file mode 100644 index 0000000..dcf4bd0 --- /dev/null +++ b/app/models/spree_item_returns/order_decorator.rb @@ -0,0 +1,19 @@ +module SpreeItemReturns::OrderDecorator + + SHIPPED_STATES = ['shipped', 'partial'] + + def self.prepended(base) + base.scope :returned, -> { where(shipment_state: SHIPPED_STATES) } + end + + def has_returnable_products? + products.returnable.exists? + end + + def has_returnable_line_items? + line_items.any?(&:is_returnable?) + end + +end + +Spree::Order.prepend SpreeItemReturns::OrderDecorator diff --git a/app/models/spree_item_returns/product_decorator.rb b/app/models/spree_item_returns/product_decorator.rb new file mode 100644 index 0000000..d666890 --- /dev/null +++ b/app/models/spree_item_returns/product_decorator.rb @@ -0,0 +1,9 @@ +module SpreeItemReturns::ProductDecorator + + def self.prepended(base) + base.validates :return_time, numericality: { greater_than_or_equal_to: 0 } + base.scope :returnable, -> { where(returnable: true) } + end +end + +Spree::Product.prepend SpreeItemReturns::ProductDecorator diff --git a/app/models/spree_item_returns/return_authorization_decorator.rb b/app/models/spree_item_returns/return_authorization_decorator.rb new file mode 100644 index 0000000..ff1a62a --- /dev/null +++ b/app/models/spree_item_returns/return_authorization_decorator.rb @@ -0,0 +1,34 @@ +module SpreeItemReturns::ReturnAuthorizationDecorator + + def self.prepended(base) + stock_location_validations = base._validators[:stock_location] + if stock_location_validations.present? + stock_location_validations.reject! { |validation| validation.is_a? ActiveRecord::Validations::PresenceValidator } + end + + base._validate_callbacks.each do |callback| + callback.raw_filter.attributes.delete :stock_location if callback.raw_filter.is_a?(ActiveModel::Validations::PresenceValidator) + end + + base.validates :stock_location, presence: true, unless: :user_initiated? + base.validates :return_items, presence: true, if: :user_initiated? + + base.after_commit :notify_admin, :notify_user, on: :create, if: :user_initiated? + end + + def allow_return_item_changes? + !customer_returned_items? + end + + private + def notify_admin + Spree::ReturnAuthorizationMailer.notify_return_initialization_to_admin(number).deliver_later + end + + def notify_user + Spree::ReturnAuthorizationMailer.notify_return_initialization_to_user(number).deliver_later + end + +end + +Spree::ReturnAuthorization.prepend SpreeItemReturns::ReturnAuthorizationDecorator diff --git a/app/models/spree/return_item_decorator.rb b/app/models/spree_item_returns/return_item_decorator.rb similarity index 62% rename from app/models/spree/return_item_decorator.rb rename to app/models/spree_item_returns/return_item_decorator.rb index 50803d1..eec41af 100644 --- a/app/models/spree/return_item_decorator.rb +++ b/app/models/spree_item_returns/return_item_decorator.rb @@ -1,4 +1,4 @@ -Spree::ReturnItem.class_eval do +module SpreeItemReturns::ReturnItemDecorator def returnable? inventory_unit.variant.product.returnable? @@ -7,4 +7,6 @@ def returnable? def returned? inventory_unit.shipped? && return_authorization.allow_return_item_changes? && !reimbursement end -end \ No newline at end of file +end + +Spree::ReturnItem.prepend SpreeItemReturns::ReturnItemDecorator \ No newline at end of file diff --git a/app/models/spree_item_returns/user_decorator.rb b/app/models/spree_item_returns/user_decorator.rb new file mode 100644 index 0000000..f64aa03 --- /dev/null +++ b/app/models/spree_item_returns/user_decorator.rb @@ -0,0 +1,8 @@ +module SpreeItemReturns::UserDecorator + + def self.prepended(base) + base.has_many :return_authorizations, through: :orders + end +end + +Spree::User.prepend SpreeItemReturns::UserDecorator \ No newline at end of file diff --git a/app/overrides/spree/return_authorization/user_return_authorization_history_button.rb b/app/overrides/spree/return_authorization/user_return_authorization_history_button.rb index 3535c82..e3218a5 100644 --- a/app/overrides/spree/return_authorization/user_return_authorization_history_button.rb +++ b/app/overrides/spree/return_authorization/user_return_authorization_history_button.rb @@ -2,8 +2,8 @@ virtual_path: 'spree/users/show', name: 'user_return_authorization_history_button', insert_bottom: "[data-hook='account_my_orders'] h3", - text: "<%= link_to(spree.return_authorizations_path, class: 'btn btn-primary pull-right') do %> - + text: "<%= link_to(spree.return_authorizations_path, class: 'btn btn-primary float-right') do %> + <%= icon(name: 'burger', classes: 'd-none d-xl-inline-block', width: 20, height: 20) %> <%= Spree.t(:returns_history) %> <% end %>" ) diff --git a/app/overrides/spree/return_authorization/user_return_authorization_initailization_button.rb b/app/overrides/spree/return_authorization/user_return_authorization_initailization_button.rb index 14b2628..0e9bea7 100644 --- a/app/overrides/spree/return_authorization/user_return_authorization_initailization_button.rb +++ b/app/overrides/spree/return_authorization/user_return_authorization_initailization_button.rb @@ -1,11 +1,11 @@ Deface::Override.new( virtual_path: 'spree/orders/show', name: 'user_return_authorization_initailization_button', - insert_bottom: "#order_summary h1", + insert_bottom: ".order-show-number", text: " <% if spree_current_user.present? && @order.shipped? && @order.has_returnable_products? && @order.has_returnable_line_items? %> - <%= link_to(spree.new_order_return_authorization_path(@order), class: 'btn btn-primary pull-right') do %> - + <%= link_to(spree.new_order_return_authorization_path(@order), class: 'btn btn-primary float-right') do %> + <%= icon(name: 'send', classes: 'd-none d-xl-inline-block', width: 25, height: 25) %> <%= Spree.t(:return_products) %> <% end %> <% end %> diff --git a/app/views/spree/return_authorizations/index.html.erb b/app/views/spree/return_authorizations/index.html.erb index 3014a8b..b52d84d 100644 --- a/app/views/spree/return_authorizations/index.html.erb +++ b/app/views/spree/return_authorizations/index.html.erb @@ -1,8 +1,8 @@