Sha256: 62a43be74f1f0db59eebe470afc18572f8fe57008709f683d9dcade3762d6592

Contents?: true

Size: 1.72 KB

Versions: 26

Compression:

Stored size: 1.72 KB

Contents

module Spree
  module Checkout
    class AddStoreCredit
      prepend Spree::ServiceModule::Base

      def call(order:, amount: nil)
        @order = order
        return failed unless @order

        remaining_total = amount ? [amount, @order.outstanding_balance].min : @order.outstanding_balance

        return failure(nil, Spree.t(:error_user_does_not_have_any_store_credits)) unless @order.user&.store_credits&.any?

        ApplicationRecord.transaction do
          @order.payments.store_credits.where(state: :checkout).map(&:invalidate!)

          apply_store_credits(remaining_total)
        end

        @order.reload.payments.store_credits.valid.any? ? success(@order) : failure(@order)
      end

      private

      def apply_store_credits(remaining_total)
        payment_method = Spree::PaymentMethod::StoreCredit.available.first
        raise 'Store credit payment method could not be found' unless payment_method

        @order.user.store_credits.for_store(@order.store).order_by_priority.each do |credit|
          break if remaining_total.zero?
          next if credit.amount_remaining.zero?

          amount_to_take = store_credit_amount(credit, remaining_total)
          create_store_credit_payment(payment_method, credit, amount_to_take)
          remaining_total -= amount_to_take
        end
      end

      def create_store_credit_payment(payment_method, credit, amount)
        @order.payments.create!(
          source: credit,
          payment_method: payment_method,
          amount: amount,
          state: 'checkout',
          response_code: credit.generate_authorization_code
        )
      end

      def store_credit_amount(credit, total)
        [credit.amount_remaining, total].min
      end
    end
  end
end

Version data entries

26 entries across 26 versions & 1 rubygems

Version Path
spree_core-4.10.1 app/services/spree/checkout/add_store_credit.rb
spree_core-4.10.0 app/services/spree/checkout/add_store_credit.rb
spree_core-4.9.0 app/services/spree/checkout/add_store_credit.rb
spree_core-4.8.3 app/services/spree/checkout/add_store_credit.rb
spree_core-4.8.2 app/services/spree/checkout/add_store_credit.rb
spree_core-4.7.3 app/services/spree/checkout/add_store_credit.rb
spree_core-4.6.6 app/services/spree/checkout/add_store_credit.rb
spree_core-4.5.5 app/services/spree/checkout/add_store_credit.rb
spree_core-4.4.1 app/services/spree/checkout/add_store_credit.rb
spree_core-4.5.4 app/services/spree/checkout/add_store_credit.rb
spree_core-4.6.5 app/services/spree/checkout/add_store_credit.rb
spree_core-4.7.2 app/services/spree/checkout/add_store_credit.rb
spree_core-4.7.1 app/services/spree/checkout/add_store_credit.rb
spree_core-4.6.4 app/services/spree/checkout/add_store_credit.rb
spree_core-4.7.0 app/services/spree/checkout/add_store_credit.rb
spree_core-4.6.3 app/services/spree/checkout/add_store_credit.rb
spree_core-4.6.2 app/services/spree/checkout/add_store_credit.rb
spree_core-4.6.1 app/services/spree/checkout/add_store_credit.rb
spree_core-4.6.0 app/services/spree/checkout/add_store_credit.rb
spree_core-4.5.3 app/services/spree/checkout/add_store_credit.rb