Files
openfoodnetwork/app/controllers/voucher_adjustments_controller.rb
2024-11-28 13:35:01 +01:00

134 lines
3.4 KiB
Ruby

# frozen_string_literal: true
class VoucherAdjustmentsController < BaseController
before_action :set_order
def create
if voucher_params[:voucher_code].blank?
@order.errors.add(:voucher_code, I18n.t('checkout.errors.voucher_not_found'))
return render_error
end
voucher = load_voucher
return render_error unless valid_voucher?(voucher)
if add_voucher_to_order(voucher)
update_payment_section
elsif @order.errors.present?
render_error
end
end
def destroy
# An order can have more than one adjustment linked to one voucher
adjustment = @order.voucher_adjustments.find_by(id: params[:id])
if adjustment.present?
@order.voucher_adjustments.where(originator_id: adjustment.originator_id)&.destroy_all
end
# Update order to make sure we display the appropriate payment method
@order.update_totals_and_states
update_payment_section
end
private
def set_order
@order = current_order
end
def valid_voucher?(voucher)
return false if @order.errors.present?
if voucher.nil?
@order.errors.add(:voucher_code, I18n.t('checkout.errors.voucher_not_found'))
return false
end
if !voucher.valid?
@order.errors.add(
:voucher_code,
I18n.t(
'checkout.errors.create_voucher_error', error: voucher.errors.full_messages.to_sentence
)
)
return false
end
true
end
def add_voucher_to_order(voucher)
adjustment = voucher.create_adjustment(voucher.code, @order)
unless adjustment.persisted?
@order.errors.add(:voucher_code, I18n.t('checkout.errors.add_voucher_error'))
adjustment.errors.each { |error| @order.errors.import(error) }
return false
end
# calculate_voucher_adjustment
clear_payments
OrderManagement::Order::Updater.new(@order).update_voucher
true
end
def load_voucher
voucher = Voucher.find_by(code: voucher_params[:voucher_code],
enterprise: @order.distributor)
return voucher unless voucher.nil? || voucher.is_a?(Vouchers::Vine)
vine_voucher
end
def vine_voucher
vine_voucher_validator = Vine::VoucherValidatorService.new(
voucher_code: voucher_params[:voucher_code], enterprise: @order.distributor
)
voucher = vine_voucher_validator.validate
return nil if vine_voucher_validator.errors[:not_found_voucher].present?
if vine_voucher_validator.errors.present?
@order.errors.add(:voucher_code, I18n.t('checkout.errors.add_voucher_error'))
return nil
end
voucher
end
def update_payment_section
render cable_ready: cable_car.replace(
selector: "#checkout-payment-methods",
html: render_to_string(partial: "checkout/payment", locals: { step: "payment" })
)
end
def render_error
flash.now[:error] = @order.errors.full_messages.to_sentence
render status: :unprocessable_entity, cable_ready: cable_car.
replace("#flashes", partial("shared/flashes", locals: { flashes: flash })).
replace(
"#voucher-section",
partial(
"checkout/voucher_section",
locals: { order: @order, voucher_adjustment: @order.voucher_adjustments.first }
)
)
end
def voucher_params
params.require(:order).permit(:voucher_code)
end
# Clear payments and payment fees, to not affect voucher adjustment calculation
def clear_payments
@order.payments.incomplete.destroy_all
end
end