Skip to content

Instantly share code, notes, and snippets.

@Blohinyuriy
Created September 23, 2016 11:24
Show Gist options
  • Save Blohinyuriy/272dc84cd0a32f33108101a0309e67f6 to your computer and use it in GitHub Desktop.
Save Blohinyuriy/272dc84cd0a32f33108101a0309e67f6 to your computer and use it in GitHub Desktop.
class OrderFactory
attr_accessor :order
attr_reader :user
def initialize user, params
@user = user
@params = params&.symbolize_keys || {}
@products = params.delete(:products)
@discount_code = params.delete(:discount_code)
end
def create!
Order.transaction do
initialize_order
build
Calculator.new(order).calculate
order.save!
after_create_callbacks
end
end
def build
@products.map do |params|
PurchaseFactory.build order: order, params: params
end
order.attributes = @params
order.location_id ||= DeliveryZone.find_by_postal_code(order.postal_code).id
order.out_of_worktime = !delivery_zone.open? if order.in_zone?
build_discount
order
end
private
def initialize_order
self.order = user.orders.initialize_with_default_params
end
def build_discount
discount = DiscountFinder.find(user, @discount_code)
case discount.class.name
when 'Coupon'
@order.coupon = discount
when 'GiftVoucher'
@order.gift_voucher = discount
end
end
def after_create_callbacks
user.update location_id: order.location_id, orders_total: user.orders_total += order.total
order.update alcohol: order.categories.alcohol.any?, previous_total: order.total
user.decrement! :points, order.total_points
if order.coupon&.single_use?
order.coupon.update active: false
end
V2::OrderMailer.delay(queue: :email).email order
end
class << self
def create! user: nil, params: nil
new(user, params).create!
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment