1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-15 00:24:09 +01:00
fab-manager/app/models/cart_item/training_reservation.rb
Sylvain c7a59c8cb7 WIP: refactoring to singularize the booking process
We need to achieve only one process for all booking, not one for subscription, one for reservations, etc.
Moreover we must store one object per invoice_item/payment_schedule_object and stop using Invoice.invoiced or PaymentSchedule.scheduled
2021-05-21 18:25:18 +02:00

53 lines
1.7 KiB
Ruby

# frozen_string_literal: true
# A training reservation added to the shopping cart
class CartItem::TrainingReservation < CartItem::Reservation
# @param plan {Plan} a subscription bought at the same time of the reservation OR an already running subscription
# @param new_subscription {Boolean} true is new subscription is being bought at the same time of the reservation
def initialize(customer, operator, training, slots, plan: nil, new_subscription: false)
raise TypeError unless training.is_a? Training
super(customer, operator, training, slots)
@plan = plan
@new_subscription = new_subscription
end
def price
base_amount = @reservable.amount_by_group(@customer.group_id).amount
is_privileged = @operator.admin? || (@operator.manager? && @operator.id != @customer.id)
elements = { slots: [] }
amount = 0
hours_available = credits
@slots.each do |slot|
amount += get_slot_price(base_amount,
slot,
is_privileged,
elements: elements,
has_credits: (@customer.training_credits.size < hours_available),
is_division: false)
end
{ elements: elements, amount: amount }
end
def to_object
::Reservation.new(
reservable_id: @reservable.id,
reservable_type: Training.name,
slots_attributes: slots_params,
statistic_profile_id: StatisticProfile.find_by(user: @customer).id
)
end
protected
def credits
return 0 if @plan.nil?
is_creditable = @plan.training_credits.select { |credit| credit.creditable_id == @reservable.id }.any?
is_creditable ? @plan.training_credit_nb : 0
end
end