Module: Modules::Owners::Reports::SoldOutReport
- Included in:
- Modules::Owners::Reports
- Defined in:
- app/my_lib/modules/owners/reports/sold_out_report.rb
Instance Method Summary collapse
Instance Method Details
#build_sold_out_report ⇒ Object
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'app/my_lib/modules/owners/reports/sold_out_report.rb', line 5 def build_sold_out_report date = params.require(:date).to_date time_type = params.require(:time_type) if restaurant == :nil # Return empty data return { covers: 0, status_seat: 'full', date: date.day.ordinalize } end reservations = if restaurant.is_a?(RestaurantGroup) restaurant.reservations.includes(:restaurant).where(date: date) else restaurant.reservations.where(date: date) end # FIXME rename to `lunch` if time_type == 'dine_in' reservations = reservations.where(start_time: '12:00'..'16:00') elsif time_type == 'dinner' reservations = reservations.where(start_time: '16:00'..'23:45') else raise NotImplementedError end cache_key = "Modules:Owners:Reports:SoldOutReport:#{restaurants_cache_key}:#{reservations.cache_key}:#{date}:#{I18n.locale}" Rails.cache.fetch(cache_key) do reservations_group = reservations.group_by(&:date_format) date_format = date.strftime('%d/%m/%Y') { covers: reservations_group[date_format]&.sum(&:party_size) || 0, status_seat: status_seat_by(date, time_type), date: date.day.ordinalize, } end end |
#status_seat_by(date, time_type) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'app/my_lib/modules/owners/reports/sold_out_report.rb', line 40 def status_seat_by(date, time_type) date_format = date.strftime('%d/%m/%Y') @seat_left_status ||= Hash.new do |h, key| inv = InvCheckerFactory.new(restaurant.id, restaurant.time_zone).create_inv_checker_service inv.skip_past_time_error = true seat_status = [] _date_format = key[0] _time_type = key[1] inv.get_inv_by_date(_date_format.to_date).select do |_start_time, _inv| if time_type == 'dine_in' Reservation::LUNCH_PERIODS.include?(_start_time) else Reservation::DINNER_PERIODS.include?(_start_time) end end.keys.each do |start_time| # TODO use InvCheckerFactory#seat_lefts seat_left = inv.seat_left(date, start_time) || 0 seat_status << seat_left end h[key.join(':')] = seat_status end seat_left_status = @seat_left_status[[date_format, time_type]] contain_positive = seat_left_status.map(&:positive?).include?(true) contain_zero = seat_left_status.map(&:zero?).include?(true) if !contain_positive && contain_zero 'full' elsif contain_positive && contain_zero 'low' elsif contain_positive && !contain_zero 'available' else 'full' end end |