Untitled
unknown
plain_text
4 years ago
5.2 kB
6
Indexable
# Representa a las reservas scheduled de la clase BookingSet y Suite::BookingsSet
# Agrupa toda su lógica para cálculos y otros.
class ScheduledBookingsSet
attr_reader :bookings
attr_reader :start_time, :end_time, :start_date, :end_date
def initialize(bookings:, start_time: nil, end_time: nil)
@bookings = bookings
@ordered_bookings = booking.respond_to?(&:booking_closed_time) ? @bookings.sort_by(&:booking_closed_time) : @bookings.sort_by(&:datetime_start)
@start_time = start_time || @ordered_bookings.first.try(:datetime_start)
@end_time = end_time || @ordered_bookings.last.try(:datetime_start)
@start_date = @start_time ? @start_time.to_date : nil
@end_date = @end_time ? @end_time.to_date : nil
end
# Valor total de ventas
def sales_value
@bookings.respond_to?(:booking_price) ? @sales_value ||= @bookings.map(&:booking_price).sum : @sales_value ||= @bookings.map(&:final_price).sum
end
# Valor total de comisiones
def commissions_value
@bookings.respond_to?(:booking_commission) ? @commissions_value ||= @bookings.map(&:booking_commission).sum : @commissions_value ||= @bookings.map(&:final_commission).sum
end
# Impuesto asociado, según motel y país
def tax_for_commissions(motel)
@tax_for_commissions ||= begin
if motel.invoiced_with_tax?
(commissions_value * Rails.configuration.motelnow['tax_rate']).round
else
0
end
end
end
# Valor para usar en facturación
def value_for_invoice(motel)
commissions_value + tax_for_commissions(motel)
end
# Calcula estadísticas de ventas día por día
def sales_data_by_day(motel)
data = {
start_date: @start_date.try(:strftime, '%Y-%m-%d'),
end_date: @end_date.try(:strftime, '%Y-%m-%d'),
sales: {}
}
unless @ordered_bookings.empty?
(@start_date..@end_date).each do |date|
date_format = date.strftime('%Y-%m-%d')
data[:sales][date_format] = { sales_value: 0 }
end
@ordered_bookings.each do |booking|
if booking.respond_to?(:booking_closed_time)
date_format = booking.booking_closed_time.strftime('%Y-%m-%d')
data[:sales][date_format][:sales_value] += booking.booking_price
else
date_format = booking.datetime_start.strftime('%Y-%m-%d')
data[:sales][date_format][:sales_value] += booking.final_price
end
end
end
data
end
# Calcula estadísticas de ventas por habitación
def sales_data_by_room(motel)
data = {
start_date: @start_date.try(:strftime, '%Y-%m-%d'),
end_date: @end_date.try(:strftime, '%Y-%m-%d'),
sales: {
by_room: {},
total: { value: 0, net_commission: 0, vat: 0, other_taxes: {}, total_commission: 0 }
}
}
motel.other_taxes.each { |name, _| data[:sales][:total][:other_taxes][name] = 0 }
# Tasa de impuesto según motel
if motel.invoiced_with_tax?
vat_rate = Rails.configuration.motelnow['tax_rate']
else
vat_rate = 0
end
# Calcula datos reserva por reserva
unless @ordered_bookings.empty?
@ordered_bookings.each do |booking|
room_type_id = booking.respond_to?(:booking_room_type_id) ? booking.booking_room_type_id : booking.price.room.type_id
unless current = data[:sales][:by_room][room_type_id]
current = data[:sales][:by_room][room_type_id] = {
name: booking.respond_to?(:booking_room_type_name) ? booking.booking_room_type_name : booking.price.room.room_type.name,
value: 0,
net_commission: 0,
vat: 0,
other_taxes: {},
total_commission: 0
}
motel.other_taxes.each { |name, _| current[:other_taxes][name] = 0 }
end
if booking.respond_to?(:booking_price)
current[:value] += booking.booking_price
current[:net_commission] += booking.booking_commission
current[:vat] += (booking.booking_commission * vat_rate).round
motel.other_taxes.each { |name, rate| current[:other_taxes][name] += (booking.booking_commission * rate).round }
else
current[:value] += booking.final_price
current[:net_commission] += booking.final_commission
current[:vat] += (booking.final_commission * vat_rate).round
motel.other_taxes.each { |name, rate| current[:other_taxes][name] += (booking.final_commission * rate).round }
end
end
end
# Calcula totales
data[:sales][:by_room].each do |id, room|
other_taxes = room[:other_taxes].sum { |_, value| value }
room[:total_commission] = room[:net_commission] + room[:vat] + other_taxes
data[:sales][:total][:value] += room[:value]
data[:sales][:total][:net_commission] += room[:net_commission]
data[:sales][:total][:vat] += room[:vat]
data[:sales][:total][:total_commission] += room[:total_commission]
motel.other_taxes.each { |name, _| data[:sales][:total][:other_taxes][name] += room[:other_taxes][name] }
end
data
end
endEditor is loading...