2021-06-01 12:20:20 +00:00
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
2015-04-27 23:19:26 +00:00
module Ticket::ScreenOptions
2013-08-17 21:10:11 +00:00
= begin
list attributes
result = Ticket :: ScreenOptions . attributes_to_change (
2015-06-30 22:26:24 +00:00
ticket_id : 123 ,
2013-08-17 21:10:11 +00:00
2015-06-30 22:26:24 +00:00
ticket : ticket_model ,
2017-06-16 20:43:09 +00:00
current_user : User . find ( 123 ) ,
2021-08-25 12:24:42 +00:00
screen : 'create_middle' ,
2013-08-17 21:10:11 +00:00
)
2018-01-12 12:44:02 +00:00
or only with user
result = Ticket :: ScreenOptions . attributes_to_change (
current_user : User . find ( 123 ) ,
)
2013-08-17 21:10:11 +00:00
returns
result = {
2018-01-12 12:44:02 +00:00
:form_meta = > {
:filter = > {
:state_id = > [ 1 , 2 , 4 , 7 , 3 ] ,
:priority_id = > [ 2 , 1 , 3 ] ,
:type_id = > [ 10 , 5 ] ,
:group_id = > [ 12 ]
} ,
} ,
2021-08-25 12:24:42 +00:00
}
2013-08-17 21:10:11 +00:00
= end
2015-04-27 23:19:26 +00:00
def self . attributes_to_change ( params )
2017-06-16 20:43:09 +00:00
raise 'current_user param needed' if ! params [ :current_user ]
2018-01-12 12:44:02 +00:00
if params [ :ticket ] . blank? && params [ :ticket_id ] . present?
2015-11-17 14:04:36 +00:00
params [ :ticket ] = Ticket . find ( params [ :ticket_id ] )
2015-04-27 23:19:26 +00:00
end
2013-08-17 21:10:11 +00:00
2015-04-27 23:19:26 +00:00
assets = { }
2021-08-25 12:24:42 +00:00
filter = { }
2015-04-27 23:19:26 +00:00
type_ids = [ ]
if params [ :ticket ]
2017-11-23 08:09:44 +00:00
types = %w[ note phone ]
2015-04-27 23:19:26 +00:00
if params [ :ticket ] . group . email_address_id
types . push 'email'
2013-08-17 21:10:11 +00:00
end
2017-06-16 20:43:09 +00:00
types . each do | type_name |
2018-01-28 18:10:22 +00:00
type = Ticket :: Article :: Type . lookup ( name : type_name )
2017-06-16 20:43:09 +00:00
next if type . blank?
2018-10-09 06:17:41 +00:00
2017-06-16 20:43:09 +00:00
type_ids . push type . id
end
2015-04-27 23:19:26 +00:00
end
filter [ :type_id ] = type_ids
2021-08-25 12:24:42 +00:00
# get group / user relations (for bulk actions)
dependencies = nil
if params [ :view ] == 'ticket_overview'
dependencies = { group_id : { '' = > { owner_id : [ ] } } }
groups = params [ :current_user ] . groups_access ( %w[ create ] )
agents = { }
agent_role_ids = Role . with_permissions ( 'ticket.agent' ) . pluck ( :id )
agent_user_ids = User . joins ( :roles ) . where ( users : { active : true } ) . where ( 'roles_users.role_id' = > agent_role_ids ) . pluck ( :id )
groups . each do | group |
assets = group . assets ( assets )
dependencies [ :group_id ] [ group . id ] = { owner_id : [ ] }
group_agent_user_ids = User . joins ( ', groups_users' ) . where ( " users.id = groups_users.user_id AND groups_users.access = 'full' AND groups_users.group_id = ? AND users.id IN (?) " , group . id , agent_user_ids ) . pluck ( :id )
group_agent_roles_ids = Role . joins ( ', roles_groups' ) . where ( " roles.id = roles_groups.role_id AND roles_groups.access = 'full' AND roles_groups.group_id = ? AND roles.id IN (?) " , group . id , agent_role_ids ) . pluck ( :id )
group_agent_role_user_ids = User . joins ( :roles ) . where ( roles : { id : group_agent_roles_ids } ) . pluck ( :id )
User . where ( id : group_agent_user_ids . concat ( group_agent_role_user_ids ) . uniq , active : true ) . pluck ( :id ) . each do | user_id |
dependencies [ :group_id ] [ group . id ] [ :owner_id ] . push user_id
next if agents [ user_id ]
agents [ user_id ] = true
next if assets [ :User ] && assets [ :User ] [ user_id ]
user = User . lookup ( id : user_id )
next if ! user
assets = user . assets ( assets )
end
2018-01-12 12:44:02 +00:00
end
end
2017-06-16 20:43:09 +00:00
2020-08-20 07:10:08 +00:00
configure_attributes = nil
if params [ :ticket ] . present?
configure_attributes = ObjectManager :: Object . new ( 'Ticket' ) . attributes ( params [ :current_user ] , params [ :ticket ] )
2017-06-16 20:43:09 +00:00
end
2020-08-20 07:10:08 +00:00
2021-08-25 12:24:42 +00:00
core_workflow = CoreWorkflow . perform ( payload : {
'event' = > 'core_workflow' ,
'request_id' = > 'default' ,
'class_name' = > 'Ticket' ,
'screen' = > params [ :screen ] ,
'params' = > Hash ( params [ :ticket ] & . attributes )
} , user : params [ :current_user ] , assets : assets , assets_in_result : false )
2015-04-27 23:19:26 +00:00
{
2017-06-16 20:43:09 +00:00
assets : assets ,
2015-11-17 14:04:36 +00:00
form_meta : {
2020-08-20 07:10:08 +00:00
filter : filter ,
dependencies : dependencies ,
configure_attributes : configure_attributes ,
2021-08-25 12:24:42 +00:00
core_workflow : core_workflow
2015-11-17 14:04:36 +00:00
}
2015-04-27 23:19:26 +00:00
}
end
2013-08-17 21:10:11 +00:00
= begin
2019-07-31 08:23:48 +00:00
list tickets by customer group in state categories open and closed
2013-08-17 21:10:11 +00:00
result = Ticket :: ScreenOptions . list_by_customer (
2015-06-30 22:26:24 +00:00
customer_id : 123 ,
limit : 15 , # optional, default 15
2013-08-17 21:10:11 +00:00
)
returns
result = {
2015-06-30 22:26:24 +00:00
ticket_ids_open : tickets_open ,
ticket_ids_closed : tickets_closed ,
assets : { ... list of assets ... } ,
2013-08-17 21:10:11 +00:00
}
= end
2015-04-27 23:19:26 +00:00
def self . list_by_customer ( data )
2021-07-21 14:04:17 +00:00
base_query = TicketPolicy :: ReadScope . new ( data [ :current_user ] ) . resolve
. joins ( state : :state_type )
. where ( customer_id : data [ :customer_id ] )
. limit ( data [ :limit ] || 15 )
. order ( created_at : :desc )
2015-04-27 23:19:26 +00:00
2021-07-21 14:04:17 +00:00
open_tickets = base_query . where ( ticket_state_types : { name : Ticket :: State :: TYPES [ :open ] } )
closed_tickets = base_query . where ( ticket_state_types : { name : Ticket :: State :: TYPES [ :closed ] } )
2015-04-27 23:19:26 +00:00
{
2021-07-21 14:04:17 +00:00
ticket_ids_open : open_tickets . map ( & :id ) ,
ticket_ids_closed : closed_tickets . map ( & :id ) ,
assets : ( open_tickets | closed_tickets ) . reduce ( { } ) { | hash , ticket | ticket . assets ( hash ) } ,
2015-04-27 23:19:26 +00:00
}
2015-04-27 21:27:51 +00:00
end
2015-04-27 14:15:29 +00:00
end