Given Reed
09/09/2021, 2:02 PMZayter Munive
09/09/2021, 2:35 PM# frozen_string_literal: true
module Spree
class Promotion < Spree::Base
module Actions
class GiftPromotion < Spree::PromotionAction
preference :group_size, :integer, default: 1
preference :product_id, :integer
include Spree::AdjustmentSource
has_many :adjustments, as: :source
delegate :eligible?, to: :promotion
def perform(payload = {})
order = payload[:order]
promotion = payload[:promotion]
promotion_code = payload[:promotion_code]
remove_from(order)
results = line_items_to_adjust(promotion, order).map do |line_item|
create_adjustment(line_item, order, promotion_code)
end
order.recalculate
results.any?
end
def remove_from(order)
variant = Spree::Variant.find(self.preferences[:product_id])
order.line_items.where(variant: variant, price: 0).destroy_all
end
def create_adjustment(adjustable, order, promotion_code)
variant = Spree::Variant.find(self.preferences[:product_id])
line_item = order.line_items.create(variant: variant, quantity: self.preferences[:group_size], price: 0)
line_item.adjustments.create!(
source: self,
amount: compute_amount(0),
order: order,
promotion_code: promotion_code,
label: I18n.t('spree.adjustment_labels.line_item', promotion: Spree::Promotion.model_name.human, promotion_name: promotion.name)
)
true
end
def compute_amount(adjustable)
0.00
end
def line_items_to_adjust(promotion, order)
excluded_ids = adjustments.
where(adjustable_id: order.line_items.all.pluck(:id), adjustable_type: 'Spree::LineItem').
pluck(:adjustable_id).
to_set
order.line_items.where.not(price: 0).select do |line_item|
!excluded_ids.include?(line_item.id) &&
promotion.line_item_actionable?(order, line_item)
end
end
end
end
end
endGiven Reed
09/09/2021, 2:37 PMZayter Munive
09/09/2021, 2:38 PM<!-- app/views/spree/admin/promotions/action/_gift_promotion.html.erb -->
<div class="field">
<% field_name = "#{param_prefix}[preferred_group_size]" %>
<%= label_tag field_name, t('spree.group_size') %>
<%= number_field_tag field_name, promotion_action.preferred_group_size, class: "fullwidth", min: 1 %>
</div>
<div class="row">
<div class="col-12">
<div class="field products_rule_products">
<%= label_tag "#{param_prefix}_preferred_product_id", t('spree.product_rule.choose_products') %>
<% field_name = "#{param_prefix}[preferred_product_id]" %>
<%= hidden_field_tag field_name, promotion_action.preferred_product_id, class: "product_picker fullwidth" %>
</div>
</div>
</div>Zayter Munive
09/09/2021, 2:38 PMGiven Reed
09/09/2021, 2:39 PMZayter Munive
09/09/2021, 2:41 PMGiven Reed
09/09/2021, 2:42 PMZayter Munive
09/09/2021, 2:42 PMZayter Munive
09/09/2021, 2:42 PMRails.application.config.spree.promotions.actions << Spree::Promotion::Actions::GiftPromotionZayter Munive
09/09/2021, 2:48 PMGiven Reed
09/13/2021, 8:25 PMZayter Munive
09/14/2021, 4:14 PMGiven Reed
03/07/2022, 9:46 PM