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 @@

<%= Spree.t(:my_returns_history, scope: :return_authorization_view)%> - <%= link_to(account_path, class: 'btn btn-primary pull-right') do %> - + <%= link_to(account_path, style:'float: right', class: 'btn btn-primary') do %> + <%= icon(name: 'person', classes: 'd-none d-xl-inline-block', width: 30, height: 30) %> <%= Spree.t(:back_to_account) %> <% end %>

@@ -29,7 +29,7 @@ <%= (return_authorization.created_at).strftime('%v') %> <%= link_to(order_return_authorization_path(order,id: return_authorization.number), class: 'btn btn-xs btn-primary') do %> - + <%= icon(name: 'plus', classes: 'd-none d-xl-inline-block', width: 20, height: 20) %> <%= Spree.t(:view_details) %> <% end %> diff --git a/app/views/spree/return_authorizations/show.html.erb b/app/views/spree/return_authorizations/show.html.erb index 67d9c8a..c044307 100644 --- a/app/views/spree/return_authorizations/show.html.erb +++ b/app/views/spree/return_authorizations/show.html.erb @@ -1,14 +1,15 @@ <% content_for :head do %> <%= javascript_include_tag 'spree/return_authorization' %> <% end %> +
+

<%= Spree.t(:return_request, scope: :return_authorizations_view) %>

+
+ <%= link_to Spree.t(:back_to_order, scope: :return_authorizations_view), spree.order_url(@order), class: "btn btn-primary" %> | + <%= link_to Spree.t(:back_to_return_history, scope: :return_authorizations_view), spree.return_authorizations_path, class: "btn btn-primary" %> +
+
-

<%= Spree.t(:return_request, scope: :return_authorizations_view) %>

-
- <%= link_to Spree.t(:back_to_order, scope: :return_authorizations_view), spree.order_url(@order) %> | - <%= link_to Spree.t(:back_to_return_history, scope: :return_authorizations_view), spree.return_authorizations_path %> -
- -<%= form_for [:admin, @order, @return_authorization] do |f| %> +<%= form_for [@order, @return_authorization] do |f| %>
<%= f.field_container :amount, class: ['alert alert-info'] do %> <%= Spree.t(:return_request_status)%> : <%= @return_authorization.state %> diff --git a/spec/models/spree/order_spec.rb b/spec/models/spree/order_spec.rb index 49a0dea..ad76d4f 100644 --- a/spec/models/spree/order_spec.rb +++ b/spec/models/spree/order_spec.rb @@ -5,7 +5,7 @@ describe 'Constants' do it 'is expected to initialize SHIPPED_STATES' do - expect(SHIPPED_STATES).to eq(['shipped', 'partial']) + expect(Spree::Order::SHIPPED_STATES).to eq(['shipped', 'partial']) end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index dbc7a61..6dfd262 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,7 +3,7 @@ SimpleCov.start 'rails' # Configure Rails Environment -ENV['RAILS_ENV'] = 'test' +ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../dummy/config/environment.rb', __FILE__) diff --git a/spree_item_returns.gemspec b/spree_item_returns.gemspec index 6f44925..260fed5 100644 --- a/spree_item_returns.gemspec +++ b/spree_item_returns.gemspec @@ -2,14 +2,14 @@ Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = 'spree_item_returns' - s.version = '3.3.0' + s.version = '3.4.0' s.summary = 'Spree Item Returns' s.description = ' At User-End - User can Initate items-return process - Can check return history ' - s.required_ruby_version = '>= 2.2.7' + s.required_ruby_version = '>= 2.5.0' s.author = 'Anurag Bhardwaj' s.email = 'info@vinsol.com' @@ -21,23 +21,23 @@ Gem::Specification.new do |s| s.require_path = 'lib' s.requirements << 'none' - s.add_dependency 'spree_core', '>= 3.2.0', '< 4.0' - s.add_dependency 'spree_extension', '~> 0.0.5' + s.add_dependency 'spree_core', '>= 4.0.0' + s.add_dependency 'spree_extension', '~> 0.0.9' s.add_development_dependency 'appraisal' - s.add_development_dependency 'capybara', '~> 2.6' - s.add_development_dependency 'coffee-rails', '~> 4.2.1' + s.add_development_dependency 'capybara', '>= 3.30.0' + s.add_development_dependency 'coffee-rails', '~> 5.0.0' s.add_development_dependency 'database_cleaner' s.add_development_dependency 'factory_bot' s.add_development_dependency 'ffaker' - s.add_development_dependency 'rails-controller-testing', '~> 1.0.1' - s.add_development_dependency 'rspec-activemodel-mocks', '~> 1.0.3' - s.add_development_dependency 'rspec-rails', '~> 3.4' - s.add_development_dependency 'sass-rails', '~> 5.0.0' + s.add_development_dependency 'rails-controller-testing', '~> 1.0.4' + s.add_development_dependency 'rspec-activemodel-mocks', '~> 1.1.0' + s.add_development_dependency 'rspec-rails', '~> 4.0.0' + s.add_development_dependency 'sass-rails', '>= 5.0.0' s.add_development_dependency 'selenium-webdriver', '~> 3.0.8' - s.add_development_dependency 'shoulda-matchers', '~> 3.1.1' + s.add_development_dependency 'shoulda-matchers', '~> 4.3' s.add_development_dependency 'shoulda-callback-matchers', '~> 1.1.1' - s.add_development_dependency 'simplecov', '~> 0.13.0' - s.add_development_dependency 'sqlite3', '~> 1.3.13' + s.add_development_dependency 'simplecov', '~> 0.18.0' + s.add_development_dependency 'sqlite3', '~> 1.4' end