diff --git a/app/models/spree/inventory_unit.rb b/app/models/spree/inventory_unit.rb index 7380bc40ec..c7cfeb3e68 100644 --- a/app/models/spree/inventory_unit.rb +++ b/app/models/spree/inventory_unit.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree class InventoryUnit < ActiveRecord::Base belongs_to :variant, class_name: "Spree::Variant" @@ -11,7 +13,7 @@ module Spree includes(:shipment) .where("spree_shipments.state != 'canceled'").references(:shipment) .where(variant_id: stock_item.variant_id) - .backordered.order("#{self.table_name}.created_at ASC") + .backordered.order("#{table_name}.created_at ASC") end # state machine (see http://github.com/pluginaweek/state_machine/tree/master for details) @@ -34,7 +36,7 @@ module Spree # lead to issues once users tried to modify the objects returned. That's due # to ActiveRecord `joins(shipment: :stock_location)` only return readonly # objects - # + # # Returns an array of backordered inventory units as per a given stock item def self.backordered_for_stock_item(stock_item) backordered_per_variant(stock_item).select do |unit| @@ -48,7 +50,7 @@ module Spree def find_stock_item Spree::StockItem.where(stock_location_id: shipment.stock_location_id, - variant_id: variant_id).first + variant_id: variant_id).first end # Remove variant default_scope `deleted_at: nil` @@ -58,13 +60,12 @@ module Spree private - def allow_ship? - Spree::Config[:allow_backorder_shipping] || self.on_hand? - end + def allow_ship? + Spree::Config[:allow_backorder_shipping] || on_hand? + end - def update_order - order.update! - end + def update_order + order.update! + end end end - diff --git a/app/models/spree/line_item.rb b/app/models/spree/line_item.rb index c84a3727db..4f39d97c2e 100644 --- a/app/models/spree/line_item.rb +++ b/app/models/spree/line_item.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'open_food_network/scope_variant_to_hub' require 'variant_units/variant_and_line_item_naming' @@ -219,20 +221,21 @@ module Spree end private - def update_inventory - if changed? - scoper.scope(variant) - Spree::OrderInventory.new(self.order).verify(self, target_shipment) - end - end - def update_order - if changed? || destroyed? - # update the order totals, etc. - order.create_tax_charge! - order.update! - end + def update_inventory + if changed? + scoper.scope(variant) + Spree::OrderInventory.new(order).verify(self, target_shipment) end + end + + def update_order + if changed? || destroyed? + # update the order totals, etc. + order.create_tax_charge! + order.update! + end + end def update_inventory_before_destroy # This is necessary before destroying the line item diff --git a/app/models/spree/order.rb b/app/models/spree/order.rb index 9eb46ae51c..0d67498e9f 100644 --- a/app/models/spree/order.rb +++ b/app/models/spree/order.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + require 'spree/core/validators/email' require 'spree/order/checkout' require 'open_food_network/enterprise_fee_calculator' @@ -162,7 +164,7 @@ module Spree # Use this method in other gems that wish to register their own custom logic # that should be called after Order#update def self.register_update_hook(hook) - self.update_hooks.add(hook) + update_hooks.add(hook) end # For compatiblity with Calculator::PriceSack @@ -246,7 +248,8 @@ module Spree # taxes in that case. def exclude_tax? return false unless Spree::Config[:prices_inc_tax] - return tax_zone != Zone.default_tax + + tax_zone != Zone.default_tax end # Returns the address for taxation based on configuration @@ -258,7 +261,7 @@ module Spree # adjustments on an invoice. For example, you can display tax breakout for # cases where tax is included in price. def line_item_adjustment_totals - Hash[self.line_item_adjustments.eligible.group_by(&:label).map do |label, adjustments| + Hash[line_item_adjustments.eligible.group_by(&:label).map do |label, adjustments| total = adjustments.sum(&:amount) [label, Spree::Money.new(total, { currency: currency })] end] @@ -272,21 +275,20 @@ module Spree updater.update end - def update_totals - updater.update_totals - end + delegate :update_totals, to: :updater def clone_billing_address - if bill_address and self.ship_address.nil? + if bill_address && ship_address.nil? self.ship_address = bill_address.clone else - self.ship_address.attributes = bill_address.attributes.except('id', 'updated_at', 'created_at') + ship_address.attributes = bill_address.attributes.except('id', 'updated_at', 'created_at') end true end def allow_cancel? - return false unless completed? and state != 'canceled' + return false unless completed? && (state != 'canceled') + shipment_state.nil? || %w{ready backorder pending}.include?(shipment_state) end @@ -294,11 +296,12 @@ module Spree # we shouldn't allow resume for legacy orders b/c we lack the information # necessary to restore to a previous state return false if state_changes.empty? || state_changes.last.previous_state.nil? + true end def awaiting_returns? - return_authorizations.any? { |return_authorization| return_authorization.authorized? } + return_authorizations.any?(&:authorized?) end # This is currently used when adding a variant to an order in the BackOffice. @@ -367,11 +370,11 @@ module Spree def associate_user!(user) self.user = user self.email = user.email - self.created_by = user if self.created_by.blank? + self.created_by = user if created_by.blank? if persisted? # immediately persist the changes we just made, but don't use save since we might have an invalid address associated - self.class.unscoped.where(id: id).update_all(email: user.email, user_id: user.id, created_by_id: self.created_by_id) + self.class.unscoped.where(id: id).update_all(email: user.email, user_id: user.id, created_by_id: created_by_id) end end @@ -379,11 +382,11 @@ module Spree def generate_order_number record = true while record - random = "R#{Array.new(9){rand(9)}.join}" + random = "R#{Array.new(9){ rand(9) }.join}" record = self.class.where(number: random).first end - self.number = random if self.number.blank? - self.number + self.number = random if number.blank? + number end def shipped_shipments @@ -422,7 +425,7 @@ module Spree end def outstanding_balance? - self.outstanding_balance != 0 + outstanding_balance != 0 end def name @@ -432,7 +435,7 @@ module Spree end def can_ship? - self.complete? || self.resumed? || self.awaiting_return? || self.returned? + complete? || resumed? || awaiting_return? || returned? end def credit_cards @@ -461,11 +464,11 @@ module Spree deliver_order_confirmation_email - self.state_changes.create( + state_changes.create( previous_state: 'cart', - next_state: 'complete', - name: 'order' , - user_id: self.user_id + next_state: 'complete', + name: 'order', + user_id: user_id ) end @@ -505,7 +508,7 @@ module Spree # def process_payments! if pending_payments.empty? - raise Core::GatewayError.new Spree.t(:no_pending_payments) + raise Core::GatewayError, Spree.t(:no_pending_payments) else pending_payments.each do |payment| break if payment_total >= total @@ -519,7 +522,7 @@ module Spree end rescue Core::GatewayError => e result = !!Spree::Config[:allow_checkout_on_gateway_error] - errors.add(:base, e.message) and return result + errors.add(:base, e.message) && (return result) end def billing_firstname @@ -545,12 +548,13 @@ module Spree def merge!(order) order.line_items.each do |line_item| next unless line_item.currency == currency - current_line_item = self.line_items.find_by(variant: line_item.variant) + + current_line_item = line_items.find_by(variant: line_item.variant) if current_line_item current_line_item.quantity += line_item.quantity current_line_item.save else - line_item.order_id = self.id + line_item.order_id = id line_item.save end end @@ -567,8 +571,8 @@ module Spree end def clear_adjustments! - self.adjustments.destroy_all - self.line_item_adjustments.destroy_all + adjustments.destroy_all + line_item_adjustments.destroy_all end def has_step?(step) @@ -578,12 +582,12 @@ module Spree def state_changed(name) state = "#{name}_state" if persisted? - old_state = self.send("#{state}_was") - self.state_changes.create( + old_state = send("#{state}_was") + state_changes.create( previous_state: old_state, - next_state: self.send(state), - name: name, - user_id: self.user_id + next_state: send(state), + name: name, + user_id: user_id ) end end @@ -635,11 +639,11 @@ module Spree # # At some point the might need to force the order to transition from address # to delivery again so that proper updated shipments are created. - # e.g. customer goes back from payment step and changes order items + # e.g. customer goes back from payment step and changes order items def ensure_updated_shipments if shipments.any? - self.shipments.destroy_all - self.update_column(:state, "address") + shipments.destroy_all + update_column(:state, "address") end end @@ -733,7 +737,7 @@ module Spree end def cap_quantity_at_stock! - line_items.includes(variant: :stock_items).all.each(&:cap_quantity_at_stock!) + line_items.includes(variant: :stock_items).all.find_each(&:cap_quantity_at_stock!) end def set_distributor!(distributor) @@ -802,57 +806,57 @@ module Spree private - def link_by_email - self.email = user.email if self.user - end + def link_by_email + self.email = user.email if user + end - # Determine if email is required (we don't want validation errors before we hit the checkout) - def require_email - return true unless new_record? or state == 'cart' - end + # Determine if email is required (we don't want validation errors before we hit the checkout) + def require_email + return true unless new_record? || (state == 'cart') + end - def ensure_line_items_present - unless line_items.present? - errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) and return false - end + def ensure_line_items_present + if line_items.blank? + errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) && (return false) end + end - def has_available_shipment - return unless has_step?("delivery") - return unless address? - return unless ship_address && ship_address.valid? - # errors.add(:base, :no_shipping_methods_available) if available_shipping_methods.empty? + def has_available_shipment + return unless has_step?("delivery") + return unless address? + return unless ship_address&.valid? + # errors.add(:base, :no_shipping_methods_available) if available_shipping_methods.empty? + end + + def ensure_available_shipping_rates + if shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? } + errors.add(:base, Spree.t(:items_cannot_be_shipped)) && (return false) end + end - def ensure_available_shipping_rates - if shipments.empty? || shipments.any? { |shipment| shipment.shipping_rates.blank? } - errors.add(:base, Spree.t(:items_cannot_be_shipped)) and return false - end - end + def has_available_payment + return unless delivery? + # errors.add(:base, :no_payment_methods_available) if available_payment_methods.empty? + end - def has_available_payment - return unless delivery? - # errors.add(:base, :no_payment_methods_available) if available_payment_methods.empty? - end + def after_cancel + shipments.each(&:cancel!) - def after_cancel - shipments.each { |shipment| shipment.cancel! } + OrderMailer.cancel_email(id).deliver + self.payment_state = 'credit_owed' unless shipped? + end - OrderMailer.cancel_email(self.id).deliver - self.payment_state = 'credit_owed' unless shipped? - end + def after_resume + shipments.each(&:resume!) + end - def after_resume - shipments.each { |shipment| shipment.resume! } - end + def use_billing? + @use_billing == true || @use_billing == 'true' || @use_billing == '1' + end - def use_billing? - @use_billing == true || @use_billing == 'true' || @use_billing == '1' - end - - def set_currency - self.currency = Spree::Config[:currency] if self[:currency].nil? - end + def set_currency + self.currency = Spree::Config[:currency] if self[:currency].nil? + end def using_guest_checkout? require_email && !user.andand.id diff --git a/app/models/spree/order_contents.rb b/app/models/spree/order_contents.rb index c629545578..74650adc1f 100644 --- a/app/models/spree/order_contents.rb +++ b/app/models/spree/order_contents.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree class OrderContents attr_accessor :order, :currency @@ -27,7 +29,7 @@ module Spree private - def add_to_line_item(line_item, variant, quantity, currency=nil, shipment=nil) + def add_to_line_item(line_item, variant, quantity, currency = nil, shipment = nil) if line_item line_item.target_shipment = shipment line_item.quantity += quantity.to_i @@ -48,9 +50,9 @@ module Spree line_item end - def remove_from_line_item(line_item, variant, quantity, shipment=nil) + def remove_from_line_item(line_item, _variant, quantity, shipment = nil) line_item.quantity += -quantity - line_item.target_shipment= shipment + line_item.target_shipment = shipment if line_item.quantity == 0 Spree::OrderInventory.new(order).verify(line_item, shipment) @@ -62,6 +64,5 @@ module Spree order.reload line_item end - end end diff --git a/app/models/spree/order_inventory.rb b/app/models/spree/order_inventory.rb index d04db006e9..69d1cf283e 100644 --- a/app/models/spree/order_inventory.rb +++ b/app/models/spree/order_inventory.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree class OrderInventory attr_accessor :order @@ -21,7 +23,7 @@ module Spree if variant_units.size < line_item.quantity quantity = line_item.quantity - variant_units.size - shipment = determine_target_shipment(line_item.variant) unless shipment + shipment ||= determine_target_shipment(line_item.variant) add_to_shipment(shipment, line_item.variant, quantity) elsif variant_units.size > line_item.quantity remove(line_item, variant_units, shipment) @@ -32,11 +34,12 @@ module Spree end def inventory_units_for(variant) - units = order.shipments.collect{|s| s.inventory_units.to_a}.flatten + units = order.shipments.collect{ |s| s.inventory_units.to_a }.flatten units.group_by(&:variant_id)[variant.id] || [] end private + def remove(line_item, variant_units, shipment = nil) quantity = variant_units.size - line_item.quantity @@ -45,6 +48,7 @@ module Spree else order.shipments.each do |shipment| break if quantity == 0 + quantity -= remove_from_shipment(shipment, line_item.variant, quantity) end end @@ -89,6 +93,7 @@ module Spree shipment_units.each do |inventory_unit| break if removed_quantity == quantity + inventory_unit.destroy removed_quantity += 1 end diff --git a/app/models/spree/return_authorization.rb b/app/models/spree/return_authorization.rb index 0a98f55fec..3a7da8ff25 100644 --- a/app/models/spree/return_authorization.rb +++ b/app/models/spree/return_authorization.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree class ReturnAuthorization < ActiveRecord::Base belongs_to :order, class_name: 'Spree::Order' @@ -55,49 +57,50 @@ module Spree end end - order.authorize_return! if inventory_units.reload.size > 0 && !order.awaiting_return? + order.authorize_return! if !inventory_units.reload.empty? && !order.awaiting_return? end def returnable_inventory - order.shipped_shipments.collect{|s| s.inventory_units.to_a}.flatten + order.shipped_shipments.collect{ |s| s.inventory_units.to_a }.flatten end private - def must_have_shipped_units - errors.add(:order, Spree.t(:has_no_shipped_units)) if order.nil? || !order.shipped_shipments.any? + + def must_have_shipped_units + errors.add(:order, Spree.t(:has_no_shipped_units)) if order.nil? || order.shipped_shipments.none? + end + + def generate_number + return if number + + record = true + while record + random = "RMA#{Array.new(9){ rand(9) }.join}" + record = self.class.where(number: random).first + end + self.number = random + end + + def process_return + inventory_units.each do |iu| + iu.return! + Spree::StockMovement.create!(stock_item_id: iu.find_stock_item.id, quantity: 1) end - def generate_number - return if number + credit = Adjustment.new(amount: amount.abs * -1, label: Spree.t(:rma_credit)) + credit.source = self + credit.adjustable = order + credit.save - record = true - while record - random = "RMA#{Array.new(9){rand(9)}.join}" - record = self.class.where(number: random).first - end - self.number = random - end + order.return if inventory_units.all?(&:returned?) + end - def process_return - inventory_units.each do |iu| - iu.return! - Spree::StockMovement.create!(stock_item_id: iu.find_stock_item.id, quantity: 1) - end + def allow_receive? + !inventory_units.empty? + end - credit = Adjustment.new(amount: amount.abs * -1, label: Spree.t(:rma_credit)) - credit.source = self - credit.adjustable = order - credit.save - - order.return if inventory_units.all?(&:returned?) - end - - def allow_receive? - !inventory_units.empty? - end - - def force_positive_amount - self.amount = amount.abs - end + def force_positive_amount + self.amount = amount.abs + end end end diff --git a/app/models/spree/state_change.rb b/app/models/spree/state_change.rb index 8954dffe81..9f52777095 100644 --- a/app/models/spree/state_change.rb +++ b/app/models/spree/state_change.rb @@ -1,3 +1,5 @@ +# frozen_string_literal: true + module Spree class StateChange < ActiveRecord::Base belongs_to :user @@ -9,7 +11,7 @@ module Spree end def assign_user - true # don't stop the filters + true # don't stop the filters end end end diff --git a/app/models/spree/tokenized_permission.rb b/app/models/spree/tokenized_permission.rb index 29cc24e8b4..58c5882c3a 100644 --- a/app/models/spree/tokenized_permission.rb +++ b/app/models/spree/tokenized_permission.rb @@ -1,6 +1,7 @@ +# frozen_string_literal: true + module Spree class TokenizedPermission < ActiveRecord::Base belongs_to :permissable, polymorphic: true end end -