# frozen_string_literal: true # Build the title of the provided slot class Slots::TitleService def initialize(operator_role, user) @user = user @show_name = (%w[admin manager].include?(operator_role) || (operator_role && Setting.get('display_name_enable'))) end # @param slot [Slot] # @param reservables [Array] def call(slot, reservables = nil) reservables = all_reservables(slot) if reservables.nil? is_reserved = reservables.map { |r| slot.reserved?(r) }.reduce(:|) is_reserved_by_user = slot.reserved_by?(@user&.id, reservables) name = reservables.map(&:name).join(', ') if !slot.is_blocked if !is_reserved && !is_reserved_by_user name elsif is_reserved && !is_reserved_by_user "#{name} #{@show_name ? "- #{slot_users_names(slot, reservables)}" : ''}" else "#{name} - #{I18n.t('availabilities.i_ve_reserved')}" end else "#{name} - #{I18n.t('availabilities.blocked')}" end end private # @param slot [Slot] # @param reservables [Array] # @return [String] def slot_users_names(slot, reservables) user_ids = slot.reserved_users(reservables) User.where(id: user_ids).includes(:profile) .map { |u| u&.profile&.full_name || I18n.t('availabilities.deleted_user') } .join(', ') end # @param slot [Slot] # @return [Array] def all_reservables(slot) slot.places.pluck('reservable_type', 'reservable_id').map { |r| r[0].classify.constantize.find(r[1]) } end end