class Returnly::Services::CreateReimbursement

Attributes

reimbursement[RW]

Public Class Methods

new(reimbursement) click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 8
def initialize(reimbursement)
  @reimbursement = reimbursement
end

Public Instance Methods

perform!() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 12
def perform!
  reimbursement.save!
  reimbursement.update!(total: calculated_total)
  performer.perform(reimbursement)

  if unpaid_amount_within_tolerance?
    reimbursement.reimbursed!
    Spree::Reimbursement.reimbursement_success_hooks.each { |h| h.call reimbursement }
    send_reimbursement_email
  else
    reimbursement.errored!
    Spree::Reimbursement.reimbursement_failure_hooks.each { |h| h.call reimbursement }
    raise incomplete_error_class, Spree.t('validation.unpaid_amount_not_zero', amount: unpaid_amount)
  end
end

Private Instance Methods

calculated_total() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 48
def calculated_total
  return_items.to_a.sum(&:total).to_d.round(2, :down)
end
incomplete_error_class() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 30
def incomplete_error_class
  Spree::Reimbursement::IncompleteReimbursementError
end
paid_amount() click to toggle source
performer() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 52
def performer
  Spree::Reimbursement.reimbursement_performer
end
reimbursement_models() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 34
def reimbursement_models
  Spree::Reimbursement.reimbursement_models
end
send_reimbursement_email() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 56
def send_reimbursement_email
  Spree::ReimbursementMailer.reimbursement_email(reimbursement.id).deliver_later
end
unpaid_amount() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 44
def unpaid_amount
  reimbursement.total - paid_amount
end
unpaid_amount_within_tolerance?() click to toggle source
# File lib/returnly/services/create_reimbursement.rb, line 60
def unpaid_amount_within_tolerance?
  reimbursement_count = reimbursement_models.count do |model|
    model.total_amount_reimbursed_for(reimbursement) > 0
  end

  leniency = if reimbursement_count > 0
               (reimbursement_count - 1) * 0.01.to_d
             else
               0
             end
  unpaid_amount.abs.between?(0, leniency)
end