1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-11 22:24:21 +01:00
fab-manager/app/models/cart_item/event_reservation.rb

100 lines
3.1 KiB
Ruby

# frozen_string_literal: true
# An event reservation added to the shopping cart
class CartItem::EventReservation < CartItem::Reservation
self.table_name = 'cart_item_event_reservations'
has_many :cart_item_event_reservation_tickets, class_name: 'CartItem::EventReservationTicket', dependent: :destroy,
inverse_of: :cart_item_event_reservation,
foreign_key: 'cart_item_event_reservation_id'
accepts_nested_attributes_for :cart_item_event_reservation_tickets
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
has_many :cart_item_event_reservation_booking_users, class_name: 'CartItem::EventReservationBookingUser', dependent: :destroy,
inverse_of: :cart_item_event_reservation,
foreign_key: 'cart_item_event_reservation_id'
accepts_nested_attributes_for :cart_item_event_reservation_booking_users
belongs_to :operator_profile, class_name: 'InvoicingProfile'
belongs_to :customer_profile, class_name: 'InvoicingProfile'
belongs_to :event
def reservable
event
end
def reservable_id
event_id
end
def reservable_type
'Event'
end
def price
amount = reservable.amount * normal_tickets
is_privileged = operator.privileged? && operator.id != customer.id
cart_item_event_reservation_tickets.each do |ticket|
amount += ticket.booked * ticket.event_price_category.amount
end
elements = { slots: [] }
total = 0
cart_item_reservation_slots.each do |sr|
total += get_slot_price(amount,
sr,
is_privileged,
elements: elements,
is_division: false)
end
{ elements: elements, amount: total }
end
def to_object
::Reservation.new(
reservable_id: reservable.id,
reservable_type: Event.name,
slots_reservations_attributes: slots_params,
tickets_attributes: cart_item_event_reservation_tickets.map do |t|
{
event_price_category_id: t.event_price_category_id,
booked: t.booked
}
end,
booking_users_attributes: cart_item_event_reservation_booking_users.map do |b|
{
event_price_category_id: b.event_price_category_id,
booked_type: b.booked_type,
booked_id: b.booked_id,
name: b.name
}
end,
nb_reserve_places: normal_tickets,
statistic_profile_id: StatisticProfile.find_by(user: customer).id
)
end
def name
reservable.title
end
def type
'event'
end
def total_tickets
(normal_tickets || 0) + (cart_item_event_reservation_tickets.map(&:booked).reduce(:+) || 0)
end
def reservation_deadline_minutes
Setting.get('event_reservation_deadline').to_i
end
end