1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-11-28 09:24:24 +01:00
fab-manager/app/services/reservation_confirm_payment_service.rb

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