55 lines
1.4 KiB
Ruby
55 lines
1.4 KiB
Ruby
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||
|
|
||
|
class Ticket::OverviewsPolicy < ApplicationPolicy
|
||
|
class Scope < ApplicationPolicy::Scope
|
||
|
def resolve
|
||
|
if user.permissions?('ticket.customer')
|
||
|
customer_scope
|
||
|
elsif user.permissions?('ticket.agent')
|
||
|
agent_scope
|
||
|
else
|
||
|
empty_scope
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def customer_scope
|
||
|
if user.organization&.shared
|
||
|
base_query
|
||
|
else
|
||
|
base_query.where(organization_shared: false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def agent_scope
|
||
|
if user_is_someones_out_of_office_replacement?
|
||
|
base_query
|
||
|
else
|
||
|
base_query.where.not(out_of_office: true)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def empty_scope
|
||
|
scope.where(id: nil)
|
||
|
end
|
||
|
|
||
|
def base_query
|
||
|
scope.joins(roles: :users)
|
||
|
.where(active: true)
|
||
|
.where(roles: { active: true })
|
||
|
.where(users: { id: user.id, active: true })
|
||
|
.left_joins(:users)
|
||
|
.where(overviews_users: { user_id: [nil, user.id] })
|
||
|
end
|
||
|
|
||
|
def user_is_someones_out_of_office_replacement?
|
||
|
User.where(out_of_office: true)
|
||
|
.where('out_of_office_start_at <= ?', Time.zone.today)
|
||
|
.where('out_of_office_end_at >= ?', Time.zone.today)
|
||
|
.where(out_of_office_replacement_id: user.id)
|
||
|
.exists?(active: true)
|
||
|
end
|
||
|
end
|
||
|
end
|