mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2024-11-28 09:24:24 +01:00
87 lines
2.8 KiB
Ruby
87 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# confirm payment of a pre-registration reservation
|
|
class ReservationConfirmPaymentService
|
|
def initialize(reservation, operator, coupon, offered)
|
|
@reservation = reservation
|
|
@operator = operator
|
|
@offered = offered
|
|
@coupon = CartItem::Coupon.new(
|
|
customer_profile: @reservation.user.invoicing_profile,
|
|
operator_profile: @operator.invoicing_profile,
|
|
coupon: Coupon.find_by(code: coupon)
|
|
)
|
|
end
|
|
|
|
def total
|
|
slots_reservations = @reservation.slots_reservations.map do |sr|
|
|
{
|
|
slot_id: sr.slot_id,
|
|
offered: @offered
|
|
}
|
|
end
|
|
tickets = @reservation.tickets.map do |t|
|
|
{
|
|
event_price_category_id: t.event_price_category_id,
|
|
booked: t.booked
|
|
}
|
|
end
|
|
booking_users = @reservation.booking_users.map do |bu|
|
|
{
|
|
name: bu.name,
|
|
event_price_category_id: bu.event_price_category_id,
|
|
booked_id: bu.booked_id,
|
|
booked_type: bu.booked_type
|
|
}
|
|
end
|
|
event_reservation = CartItem::EventReservation.new(customer_profile: @reservation.user.invoicing_profile,
|
|
operator_profile: @operator.invoicing_profile,
|
|
event: @reservation.reservable,
|
|
cart_item_reservation_slots_attributes: slots_reservations,
|
|
normal_tickets: @reservation.nb_reserve_places,
|
|
cart_item_event_reservation_tickets_attributes: tickets,
|
|
cart_item_event_reservation_booking_users_attributes: booking_users)
|
|
|
|
all_elements = {
|
|
slots: @reservation.slots_reservations.map do |sr|
|
|
{ start_at: sr.slot.start_at, end_at: sr.slot.end_at, price: event_reservation.price[:amount] }
|
|
end
|
|
}
|
|
|
|
total_amount = event_reservation.price[:amount]
|
|
|
|
coupon_info = @coupon.price(total_amount)
|
|
|
|
# return result
|
|
{
|
|
elements: all_elements,
|
|
total: coupon_info[:total_with_coupon].to_i,
|
|
before_coupon: coupon_info[:total_without_coupon].to_i,
|
|
coupon: @coupon.coupon
|
|
}
|
|
end
|
|
|
|
def call
|
|
price = total
|
|
invoice = InvoicesService.create(
|
|
price,
|
|
@operator.invoicing_profile.id,
|
|
[@reservation],
|
|
@reservation.user
|
|
)
|
|
if Setting.get('prevent_invoices_zero') && price[:total].zero?
|
|
@reservation.slots_reservations.first.update(is_confirm: true)
|
|
return invoice
|
|
end
|
|
|
|
ActiveRecord::Base.transaction do
|
|
WalletService.debit_user_wallet(invoice, @reservation.user)
|
|
|
|
invoice.save
|
|
invoice.post_save
|
|
@reservation.slots_reservations.first.update(is_confirm: true)
|
|
end
|
|
invoice
|
|
end
|
|
end
|