# frozen_string_literal: true # A training reservation added to the shopping cart class CartItem::TrainingReservation < CartItem::Reservation has_many :cart_item_reservation_slots, class_name: 'CartItem::ReservationSlot', dependent: :destroy, inverse_of: :cart_item, foreign_type: 'cart_item_type', as: :cart_item accepts_nested_attributes_for :cart_item_reservation_slots belongs_to :operator_profile, class_name: 'InvoicingProfile' belongs_to :customer_profile, class_name: 'InvoicingProfile' belongs_to :reservable, polymorphic: true belongs_to :plan belongs_to :reservation_context 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 cart_item_reservation_slots.each do |sr| amount += get_slot_price(base_amount, sr, is_privileged, elements: elements, has_credits: (customer.training_credits.size < hours_available), is_division: false) end { elements: elements, amount: amount } end def type 'training' 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 def reservation_deadline_minutes Setting.get('training_reservation_deadline').to_i end end