From 7b4015179fc717ecf73e44663b9d9dbceab29539 Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Mon, 10 Nov 2014 08:34:20 +0100 Subject: [PATCH] New user and org zoom. --- .../controllers/organization_zoom.js.coffee | 165 ++++--------- .../app/controllers/user_zoom.js.coffee | 221 +----------------- .../controllers/widget/ticket_stats.js.coffee | 161 +++++++++++++ .../app/views/organization_zoom.jst.eco | 55 ++++- .../app/views/popover/ticket.jst.eco | 2 +- .../ticket_stats.jst.eco | 0 .../ticket_stats_frequency.jst.eco | 0 .../ticket_stats_list.jst.eco | 0 app/controllers/tickets_controller.rb | 199 ++++++++-------- app/models/ticket.rb | 30 +++ app/models/ticket/search.rb | 35 +-- config/routes/ticket.rb | 2 +- 12 files changed, 413 insertions(+), 457 deletions(-) create mode 100644 app/assets/javascripts/app/controllers/widget/ticket_stats.js.coffee rename app/assets/javascripts/app/views/{user_zoom => widget}/ticket_stats.jst.eco (100%) rename app/assets/javascripts/app/views/{user_zoom => widget}/ticket_stats_frequency.jst.eco (100%) rename app/assets/javascripts/app/views/{user_zoom => widget}/ticket_stats_list.jst.eco (100%) diff --git a/app/assets/javascripts/app/controllers/organization_zoom.js.coffee b/app/assets/javascripts/app/controllers/organization_zoom.js.coffee index 1b3a4567b..ddab7cc4c 100644 --- a/app/assets/javascripts/app/controllers/organization_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/organization_zoom.js.coffee @@ -1,7 +1,4 @@ class App.OrganizationZoom extends App.Controller - elements: - '.tabsSidebar' : 'sidebar' - constructor: (params) -> super @@ -12,7 +9,11 @@ class App.OrganizationZoom extends App.Controller @navupdate '#' - App.Organization.full( @organization_id, @render ) + # subscribe and reload data / fetch new data if triggered + @subscribeId = App.Organization.full( @organization_id, @render, false, true ) + + release: => + App.Organization.unsubscribe(@subscribeId) meta: => meta = @@ -36,10 +37,7 @@ class App.OrganizationZoom extends App.Controller @navupdate '#' changed: => - formCurrent = @formParam( @el.find('.ticket-update') ) - diff = difference( @formDefault, formCurrent ) - return false if !diff || _.isEmpty( diff ) - return true + false render: (organization) => @@ -47,12 +45,38 @@ class App.OrganizationZoom extends App.Controller @doNotLog = 1 @recentView( 'Organization', @organization_id ) + # get display data + organizationData = [] + for item2 in App.Organization.configure_attributes + item = _.clone( item2 ) + + # check if value for _id exists + itemNameValue = item.name + itemNameValueNew = itemNameValue.substr( 0, itemNameValue.length - 3 ) + if itemNameValueNew of organization + item.name = itemNameValueNew + + # add to show if value exists + if organization[item.name] || item.tag is 'textarea' + + # do not show firstname and lastname / already show via diplayName() + if item.name isnt 'name' + if item.info + organizationData.push item + @html App.view('organization_zoom')( - organization: organization + organization: organization + organizationData: organizationData ) - new Overviews( - el: @el + @$('[contenteditable]').ce({ + mode: 'textonly' + multiline: true + maxlength: 250 + }) + + new App.TicketStats( + el: @$('.js-ticket-stats') organization: organization ) @@ -60,125 +84,38 @@ class App.OrganizationZoom extends App.Controller genericObject: organization ) - new App.UpdateHeader( - el: @el - genericObject: organization - ) - # start action controller showHistory = => new App.OrganizationHistory( organization_id: organization.id ) + editOrganization = => + new App.ControllerGenericEdit( + id: organization.id + genericObject: 'Organization' + screen: 'edit' + pageData: + title: 'Organizations' + object: 'Organization' + objects: 'Organizations' + ) actions = [ + { + name: 'edit' + title: 'Edit' + callback: editOrganization + } { name: 'history' title: 'History' callback: showHistory } ] + new App.ActionRow( el: @el.find('.action') items: actions ) - new Sidebar( - el: @sidebar - organization: organization - ) - -class Overviews extends App.Controller - constructor: -> - super - - # subscribe and reload data / fetch new data if triggered - @subscribeId = App.Organization.full( @organization.id, @render, false, true ) - - release: => - App.Organization.unsubscribe(@subscribeId) - - render: (organization) => - - plugins = - main: - my_organization: - controller: App.DashboardTicketSearch, - params: - name: 'Tickets of Organization' - condition: - 'tickets.state_id': [ 1,2,3,4,6 ] - 'tickets.organization_id': organization.id - order: - by: 'created_at' - direction: 'DESC' - view: - d: [ 'number', 'title', 'customer', 'state', 'priority', 'created_at' ] - view_mode_default: 'd' - - for area, plugins of plugins - for name, plugin of plugins - target = area + '_' + name - @el.find('.' + area + '-overviews').append('
') - if plugin.controller - params = plugin.params || {} - params.el = @el.find( '#' + target ) - new plugin.controller( params ) - - dndOptions = - handle: 'h2.can-move' - placeholder: 'can-move-plcaeholder' - tolerance: 'pointer' - distance: 15 - opacity: 0.6 - forcePlaceholderSize: true - - @el.find( '#sortable' ).sortable( dndOptions ) - @el.find( '#sortable-sidebar' ).sortable( dndOptions ) - - -class Sidebar extends App.Controller - constructor: -> - super - - # render ui - @render() - - render: -> - - items = [] - - editOrganization = (e, el) => - new App.ControllerGenericEdit( - id: @organization.id - genericObject: 'Organization' - pageData: - title: 'Organizations' - object: 'Organization' - objects: 'Organizations' - ) - showOrganization = (el) => - new App.WidgetOrganization( - el: el - organization_id: @organization.id - ) - items.push { - head: 'Organization' - name: 'organization' - icon: 'group' - actions: [ - { - name: 'Edit Organization' - class: 'glyphicon glyphicon-edit' - callback: editOrganization - }, - ] - callback: showOrganization - } - - new App.Sidebar( - el: @el - items: items - ) - class Router extends App.ControllerPermanent constructor: (params) -> super diff --git a/app/assets/javascripts/app/controllers/user_zoom.js.coffee b/app/assets/javascripts/app/controllers/user_zoom.js.coffee index 8490c4844..be7cad668 100644 --- a/app/assets/javascripts/app/controllers/user_zoom.js.coffee +++ b/app/assets/javascripts/app/controllers/user_zoom.js.coffee @@ -77,12 +77,7 @@ class App.UserZoom extends App.Controller maxlength: 250 }) - #new Overviews( - # el: @el - # user: user - #) - - new TicketStats( + new App.TicketStats( el: @$('.js-ticket-stats') user: user ) @@ -132,220 +127,6 @@ class App.UserZoom extends App.Controller user.updateAttributes( note: note ) @log 'notice', 'update', e, note, user - -class TicketStats extends App.Controller - events: - 'click .js-userTab': 'showUserTab' - 'click .js-orgTab': 'showOrgTab' - - constructor: -> - super - - # subscribe and reload data / fetch new data if triggered - @subscribeId = App.User.full( @user.id, @load, false, true ) - - release: => - App.User.unsubscribe(@subscribeId) - - load: (user) => - @ajax( - id: 'ticket_stats_' + user.id, - type: 'GET', - url: @apiPath + '/ticket_stats/' + user.id, - success: (data) => - # load assets - App.Collection.loadAssets( data.assets ) - - @render(data) - ) - - showOrgTab: => - @$('.js-userTab').removeClass('active') - @$('.js-orgTab').addClass('active') - @$('.js-user').addClass('hide') - @$('.js-org').removeClass('hide') - - showUserTab: => - @$('.js-userTab').addClass('active') - @$('.js-orgTab').removeClass('active') - @$('.js-user').removeClass('hide') - @$('.js-org').addClass('hide') - - render: (data) => - - @html App.view('user_zoom/ticket_stats')( - user: @user - ) - - limit = 5 - new TicketStatsList( - el: @$('.js-user-open-tickets') - user: @user - head: 'Open Ticket' - ticket_ids: data.user_tickets_open_ids - limit: limit - ) - new TicketStatsList( - el: @$('.js-user-closed-tickets') - user: @user - head: 'Closed Ticket' - ticket_ids: data.user_tickets_closed_ids - limit: limit - ) - new TicketStatsFrequency( - el: @$('.js-user-frequency') - user: @user - ticket_volume_by_year: data.user_ticket_volume_by_year - ) - - new TicketStatsList( - el: @$('.js-org-open-tickets') - user: @user - head: 'Open Ticket' - ticket_ids: data.org_tickets_open_ids - limit: limit - ) - new TicketStatsList( - el: @$('.js-org-closed-tickets') - user: @user - head: 'Closed Ticket' - ticket_ids: data.org_tickets_closed_ids - limit: limit - ) - new TicketStatsFrequency( - el: @$('.js-org-frequency') - user: @user - ticket_volume_by_year: data.org_ticket_volume_by_year - ) - -class TicketStatsList extends App.Controller - events: - 'click .js-showAll': 'showAll' - - constructor: -> - super - @render() - - render: => - - ticket_ids_show = [] - if !@all - count = 0 - for ticket_id in @ticket_ids - count += 1 - if count <= @limit - ticket_ids_show.push ticket_id - else - ticket_ids_show = @ticket_ids - - @html App.view('user_zoom/ticket_stats_list')( - user: @user - head: @head - ticket_ids: @ticket_ids - ticket_ids_show: ticket_ids_show - limit: @limit - ) - @frontendTimeUpdate() - @ticketPopups() - - showAll: (e) => - e.preventDefault() - @all = true - @render() - -class TicketStatsFrequency extends App.Controller - constructor: -> - super - @render() - - render: (data) => - - # find 100% - max = 0 - for item in @ticket_volume_by_year - if item.closed > max - max = item.closed - if item.created > max - max = item.created - console.log('MM', max) - for item in @ticket_volume_by_year - item.created_in_percent = 100 / max * item.created - item.closed_in_percent = 100 / max * item.closed - - @html App.view('user_zoom/ticket_stats_frequency')( - user: @user - ticket_volume_by_year: @ticket_volume_by_year.reverse() - ) - -class Overviews extends App.Controller - constructor: -> - super - - # subscribe and reload data / fetch new data if triggered - @subscribeId = App.User.full( @user.id, @render, false, true ) - - release: => - App.User.unsubscribe(@subscribeId) - - render: (user) => - - plugins = { - main: { - my_assigned: { - controller: App.DashboardTicketSearch, - params: { - name: 'Tickets of User' - condition: - 'tickets.state_id': [ 1,2,3,4,6 ] - 'tickets.customer_id': user.id - order: - by: 'created_at' - direction: 'DESC' - view: - d: [ 'number', 'title', 'state', 'priority', 'created_at' ] - view_mode_default: 'd' - }, - }, - }, - } - if user.organization_id - plugins.main.my_organization = { - controller: App.DashboardTicketSearch, - params: { - name: 'Tickets of Organization' - condition: - 'tickets.state_id': [ 1,2,3,4,6 ] - 'tickets.organization_id': user.organization_id - order: - by: 'created_at' - direction: 'DESC' - view: - d: [ 'number', 'title', 'customer', 'state', 'priority', 'created_at' ] - view_mode_default: 'd' - }, - } - - for area, plugins of plugins - for name, plugin of plugins - target = area + '_' + name - @el.find('.' + area + '-overviews').append('
') - if plugin.controller - params = plugin.params || {} - params.el = @el.find( '#' + target ) - new plugin.controller( params ) - - dndOptions = - handle: 'h2.can-move' - placeholder: 'can-move-plcaeholder' - tolerance: 'pointer' - distance: 15 - opacity: 0.6 - forcePlaceholderSize: true - - @el.find( '#sortable' ).sortable( dndOptions ) - @el.find( '#sortable-sidebar' ).sortable( dndOptions ) - - class Router extends App.ControllerPermanent constructor: (params) -> super diff --git a/app/assets/javascripts/app/controllers/widget/ticket_stats.js.coffee b/app/assets/javascripts/app/controllers/widget/ticket_stats.js.coffee new file mode 100644 index 000000000..53904cc51 --- /dev/null +++ b/app/assets/javascripts/app/controllers/widget/ticket_stats.js.coffee @@ -0,0 +1,161 @@ +class App.TicketStats extends App.Controller + events: + 'click .js-userTab': 'showUserTab' + 'click .js-orgTab': 'showOrgTab' + + constructor: -> + super + + # subscribe and reload data / fetch new data if triggered + if @user + @subscribeId = App.User.full( @user.id, @load, false, true ) + if @organization + @subscribeId = App.Organization.full( @organization.id, @load, false, true ) + + release: => + App.User.unsubscribe(@subscribeId) + + load: (object) => + if @organization + ajaxKey = "org_" + @organization.id + data = + organization_id: @organization.id + else + ajaxKey = "user_" + @user.id + data = + user_id: @user.id + organization_id: @user.organization_id + @ajax( + id: 'ticket_stats_' + ajaxKey + type: 'GET' + url: @apiPath + '/ticket_stats' + data: data + processData: true + success: (data) => + # load assets + App.Collection.loadAssets( data.assets ) + + @render(data) + ) + + showOrgTab: => + @$('.js-userTab').removeClass('active') + @$('.js-orgTab').addClass('active') + @$('.js-user').addClass('hide') + @$('.js-org').removeClass('hide') + + showUserTab: => + @$('.js-userTab').addClass('active') + @$('.js-orgTab').removeClass('active') + @$('.js-user').removeClass('hide') + @$('.js-org').addClass('hide') + + render: (data) => + + @html App.view('widget/ticket_stats')( + user: @user + organization: @organization + ) + + if @organization + @showOrgTab() + + limit = 5 + new TicketStatsList( + el: @$('.js-user-open-tickets') + user: @user + head: 'Open Ticket' + ticket_ids: data.user_tickets_open_ids + limit: limit + ) + new TicketStatsList( + el: @$('.js-user-closed-tickets') + user: @user + head: 'Closed Ticket' + ticket_ids: data.user_tickets_closed_ids + limit: limit + ) + new TicketStatsFrequency( + el: @$('.js-user-frequency') + user: @user + ticket_volume_by_year: data.user_ticket_volume_by_year + ) + + new TicketStatsList( + el: @$('.js-org-open-tickets') + user: @user + head: 'Open Ticket' + ticket_ids: data.org_tickets_open_ids + limit: limit + ) + new TicketStatsList( + el: @$('.js-org-closed-tickets') + user: @user + head: 'Closed Ticket' + ticket_ids: data.org_tickets_closed_ids + limit: limit + ) + new TicketStatsFrequency( + el: @$('.js-org-frequency') + user: @user + ticket_volume_by_year: data.org_ticket_volume_by_year + ) + +class TicketStatsList extends App.Controller + events: + 'click .js-showAll': 'showAll' + + constructor: -> + super + @render() + + render: => + + ticket_ids_show = [] + if !@all + count = 0 + for ticket_id in @ticket_ids + count += 1 + if count <= @limit + ticket_ids_show.push ticket_id + else + ticket_ids_show = @ticket_ids + + @html App.view('widget/ticket_stats_list')( + user: @user + head: @head + ticket_ids: @ticket_ids + ticket_ids_show: ticket_ids_show + limit: @limit + ) + @frontendTimeUpdate() + @ticketPopups() + + showAll: (e) => + e.preventDefault() + @all = true + @render() + +class TicketStatsFrequency extends App.Controller + constructor: -> + super + @render() + + render: (data) => + + # find 100% + max = 0 + for item in @ticket_volume_by_year + if item.closed > max + max = item.closed + if item.created > max + max = item.created + + for item in @ticket_volume_by_year + item.created_in_percent = 100 / max * item.created + item.closed_in_percent = 100 / max * item.closed + + @html App.view('widget/ticket_stats_frequency')( + user: @user + ticket_volume_by_year: @ticket_volume_by_year.reverse() + ) diff --git a/app/assets/javascripts/app/views/organization_zoom.jst.eco b/app/assets/javascripts/app/views/organization_zoom.jst.eco index c2cf224d6..24d314255 100644 --- a/app/assets/javascripts/app/views/organization_zoom.jst.eco +++ b/app/assets/javascripts/app/views/organization_zoom.jst.eco @@ -1,18 +1,49 @@ -
-
-
-
- +
-
+
+
+ +

<%= @organization.displayName() %>

+
+
+
+ <% for row in @organizationData: %> + <% if @organization[row.name]: %> + <% if row.tag isnt 'textarea': %> +
+ + <%- @L( @P( @organization[row.name] ) ) %> +
+ <% end %> + <% end %> + <% end %> + <% for row in @organizationData: %> + <% if row.tag is 'textarea': %> +
+ +
<%= @organization[row.name] %>
+
+ <% end %> + <% end %>
-
+ <% if @organization.members: %> +
+ +
+ + <% for user in @organization.members: %> + + <% end %> + +
+
+ <% end %> + +
+
-
-
-
\ No newline at end of file diff --git a/app/assets/javascripts/app/views/popover/ticket.jst.eco b/app/assets/javascripts/app/views/popover/ticket.jst.eco index af8558e64..b743b0f10 100644 --- a/app/assets/javascripts/app/views/popover/ticket.jst.eco +++ b/app/assets/javascripts/app/views/popover/ticket.jst.eco @@ -24,7 +24,7 @@
<%- @T( @ticket.priority.name ) %>
-

<%- @T( 'Age' ) %>

+

<%- @T( 'Created' ) %>

<%- @P( @ticket.humanTime ) %>
diff --git a/app/assets/javascripts/app/views/user_zoom/ticket_stats.jst.eco b/app/assets/javascripts/app/views/widget/ticket_stats.jst.eco similarity index 100% rename from app/assets/javascripts/app/views/user_zoom/ticket_stats.jst.eco rename to app/assets/javascripts/app/views/widget/ticket_stats.jst.eco diff --git a/app/assets/javascripts/app/views/user_zoom/ticket_stats_frequency.jst.eco b/app/assets/javascripts/app/views/widget/ticket_stats_frequency.jst.eco similarity index 100% rename from app/assets/javascripts/app/views/user_zoom/ticket_stats_frequency.jst.eco rename to app/assets/javascripts/app/views/widget/ticket_stats_frequency.jst.eco diff --git a/app/assets/javascripts/app/views/user_zoom/ticket_stats_list.jst.eco b/app/assets/javascripts/app/views/widget/ticket_stats_list.jst.eco similarity index 100% rename from app/assets/javascripts/app/views/user_zoom/ticket_stats_list.jst.eco rename to app/assets/javascripts/app/views/widget/ticket_stats_list.jst.eco diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb index 043686a46..88fb57941 100644 --- a/app/controllers/tickets_controller.rb +++ b/app/controllers/tickets_controller.rb @@ -365,50 +365,96 @@ class TicketsController < ApplicationController } end - # GET /api/v1/ticket_stats/1 + # GET /api/v1/ticket_stats def stats - user = User.find(params[:id]) + + if !params[:user_id] && !params[:organization_id] + raise "Need user_id or organization_id as param" + end # permissin check #return if !ticket_permission(ticket) # lookup open user tickets - limit = 100 - assets = {} - condition = { - 'tickets.state_id' => Ticket::State.by_category('open'), - 'tickets.customer_id' => user.id, - } - user_tickets_open = Ticket.search( - :limit => limit, - #:query => params[:term], - :condition => condition, - :current_user => current_user, - :detail => true, - ) - user_tickets_open_ids = assets_of_tickets(user_tickets_open, assets) + limit = 100 + assets = {} + access_condition = Ticket.access_condition( current_user ) + now = DateTime.now + user_tickets_open_ids = [] + user_tickets_closed_ids = [] + user_ticket_volume_by_year = [] + if params[:user_id] + user = User.find( params[:user_id] ) + condition = { + 'tickets.state_id' => Ticket::State.by_category('open'), + 'tickets.customer_id' => user.id, + } + user_tickets_open = Ticket.search( + :limit => limit, + #:query => params[:term], + :condition => condition, + :current_user => current_user, + :detail => true, + ) + user_tickets_open_ids = assets_of_tickets(user_tickets_open, assets) - # lookup closed user tickets - condition = { - 'tickets.state_id' => Ticket::State.by_category('closed'), - 'tickets.customer_id' => user.id, - } - user_tickets_closed = Ticket.search( - :limit => limit, - #:query => params[:term], - :condition => condition, - :current_user => current_user, - :detail => true, - ) - user_tickets_closed_ids = assets_of_tickets(user_tickets_closed, assets) + # lookup closed user tickets + condition = { + 'tickets.state_id' => Ticket::State.by_category('closed'), + 'tickets.customer_id' => user.id, + } + user_tickets_closed = Ticket.search( + :limit => limit, + #:query => params[:term], + :condition => condition, + :current_user => current_user, + :detail => true, + ) + user_tickets_closed_ids = assets_of_tickets(user_tickets_closed, assets) + # generate stats by user + (0..11).each {|month_back| + date_to_check = DateTime.now - month_back.month + date_start = "#{date_to_check.year}-#{date_to_check.month}-#{01} 00:00:00" + date_end = "#{date_to_check.year}-#{date_to_check.month}-#{date_to_check.end_of_month.day} 00:00:00" + + condition = { + 'tickets.customer_id' => user.id, + } + + # created + created = Ticket.where('created_at > ? AND created_at < ?', date_start, date_end ). + where(access_condition). + where(condition). + count + + # closed + closed = Ticket.where('close_time > ? AND close_time < ?', date_start, date_end ). + where(access_condition). + where(condition). + count + + data = { + :month => date_to_check.month, + :year => date_to_check.year, + :text => Date::MONTHNAMES[date_to_check.month], + :created => created, + :closed => closed, + } + user_ticket_volume_by_year.push data + } + end # lookup open org tickets - org_tickets_open_ids = [] - if user.organization_id + org_tickets_open_ids = [] + org_tickets_closed_ids = [] + org_ticket_volume_by_year = [] + if params[:organization_id] && !params[:organization_id].empty? + organization = Organization.find( params[:organization_id] ) + condition = { 'tickets.state_id' => Ticket::State.by_category('open'), - 'tickets.organization_id' => user.organization_id, + 'tickets.organization_id' => params[:organization_id], } org_tickets_open = Ticket.search( :limit => limit, @@ -418,14 +464,11 @@ class TicketsController < ApplicationController :detail => true, ) org_tickets_open_ids = assets_of_tickets(org_tickets_open, assets) - end - # lookup closed org tickets - org_tickets_closed_ids = [] - if user.organization_id + # lookup closed org tickets condition = { 'tickets.state_id' => Ticket::State.by_category('closed'), - 'tickets.organization_id' => user.organization_id, + 'tickets.organization_id' => params[:organization_id], } org_tickets_closed = Ticket.search( :limit => limit, @@ -435,64 +478,34 @@ class TicketsController < ApplicationController :detail => true, ) org_tickets_closed_ids = assets_of_tickets(org_tickets_closed, assets) + + # generate stats by org + (0..11).each {|month_back| + date_to_check = DateTime.now - month_back.month + date_start = "#{date_to_check.year}-#{date_to_check.month}-#{01} 00:00:00" + date_end = "#{date_to_check.year}-#{date_to_check.month}-#{date_to_check.end_of_month.day} 00:00:00" + + condition = { + 'tickets.organization_id' => params[:organization_id], + } + + # created + created = Ticket.where('created_at > ? AND created_at < ?', date_start, date_end ).where(condition).count + + # closed + closed = Ticket.where('close_time > ? AND close_time < ?', date_start, date_end ).where(condition).count + + data = { + :month => date_to_check.month, + :year => date_to_check.year, + :text => Date::MONTHNAMES[date_to_check.month], + :created => created, + :closed => closed, + } + org_ticket_volume_by_year.push data + } end - # generate stats by user - user_ticket_volume_by_year = [] - now = DateTime.now - (0..11).each {|month_back| - date_to_check = DateTime.now - month_back.month - date_start = "#{date_to_check.year}-#{date_to_check.month}-#{01} 00:00:00" - date_end = "#{date_to_check.year}-#{date_to_check.month}-#{date_to_check.end_of_month.day} 00:00:00" - - condition = { - 'tickets.customer_id' => user.id, - } - - # created - created = Ticket.where('created_at > ? AND created_at < ?', date_start, date_end ).where(condition).count - - # closed - closed = Ticket.where('close_time > ? AND close_time < ?', date_start, date_end ).where(condition).count - - data = { - :month => date_to_check.month, - :year => date_to_check.year, - :text => Date::MONTHNAMES[date_to_check.month], - :created => created, - :closed => closed, - } - user_ticket_volume_by_year.push data - } - - # generate stats by org - org_ticket_volume_by_year = [] - now = DateTime.now - (0..11).each {|month_back| - date_to_check = DateTime.now - month_back.month - date_start = "#{date_to_check.year}-#{date_to_check.month}-#{01} 00:00:00" - date_end = "#{date_to_check.year}-#{date_to_check.month}-#{date_to_check.end_of_month.day} 00:00:00" - - condition = { - 'tickets.organization_id' => user.organization_id, - } - - # created - created = Ticket.where('created_at > ? AND created_at < ?', date_start, date_end ).where(condition).count - - # closed - closed = Ticket.where('close_time > ? AND close_time < ?', date_start, date_end ).where(condition).count - - data = { - :month => date_to_check.month, - :year => date_to_check.year, - :text => Date::MONTHNAMES[date_to_check.month], - :created => created, - :closed => closed, - } - org_ticket_volume_by_year.push data - } - # return result render :json => { :user_tickets_open_ids => user_tickets_open_ids, diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 01bbdc853..b9d35ed37 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -79,6 +79,36 @@ returns =begin +get user access conditions + + connditions = Ticket.access_condition( User.find(1) ) + +returns + + result = [user1, user2, ...] + +=end + + def self.access_condition(user) + access_condition = [] + if user.is_role('Agent') + group_ids = Group.select( 'groups.id' ).joins(:users). + where( 'groups_users.user_id = ?', user.id ). + where( 'groups.active = ?', true ). + map( &:id ) + access_condition = [ 'group_id IN (?)', group_ids ] + else + if !user.organization || ( !user.organization.shared || user.organization.shared == false ) + access_condition = [ 'customer_id = ?', user.id ] + else + access_condition = [ '( customer_id = ? OR organization_id = ? )', user.id, user.organization.id ] + end + end + access_condition + end + +=begin + merge tickets ticket = Ticket.find(123) diff --git a/app/models/ticket/search.rb b/app/models/ticket/search.rb index 84a4e27eb..2fb6d8a5f 100644 --- a/app/models/ticket/search.rb +++ b/app/models/ticket/search.rb @@ -4,7 +4,7 @@ module Ticket::Search =begin -search tickets +search tickets via search index result = Ticket.search( :current_user => User.find(123), @@ -17,7 +17,7 @@ returns result = [ticket_model1, ticket_model2] -search tickets +search tickets via search index result = Ticket.search( :current_user => User.find(123), @@ -30,6 +30,22 @@ returns result = [1,3,5,6,7] + +search tickets via database + + result = Ticket.search( + :current_user => User.find(123), + :condition => '', + :detail => true, + :limit => 15, + :full => 0 + ) + +returns + + result = [1,3,5,6,7] + + =end def search (params) @@ -94,20 +110,7 @@ returns end # fallback do sql query - access_condition = [] - if current_user.is_role('Agent') - group_ids = Group.select( 'groups.id' ).joins(:users). - where( 'groups_users.user_id = ?', current_user.id ). - where( 'groups.active = ?', true ). - map( &:id ) - access_condition = [ 'group_id IN (?)', group_ids ] - else - if !current_user.organization || ( !current_user.organization.shared || current_user.organization.shared == false ) - access_condition = [ 'customer_id = ?', current_user.id ] - else - access_condition = [ '( customer_id = ? OR organization_id = ? )', current_user.id, current_user.organization.id ] - end - end + access_condition = Ticket.access_condition( current_user ) # do query # - stip out * we already search for *query* - diff --git a/config/routes/ticket.rb b/config/routes/ticket.rb index 670f85f85..a14e0a0c8 100644 --- a/config/routes/ticket.rb +++ b/config/routes/ticket.rb @@ -13,7 +13,7 @@ Zammad::Application.routes.draw do match api_path + '/ticket_customer', :to => 'tickets#ticket_customer', :via => :get match api_path + '/ticket_related/:ticket_id', :to => 'tickets#ticket_related', :via => :get match api_path + '/ticket_merge/:slave_ticket_id/:master_ticket_number', :to => 'tickets#ticket_merge', :via => :get - match api_path + '/ticket_stats/:id', :to => 'tickets#stats', :via => :get + match api_path + '/ticket_stats', :to => 'tickets#stats', :via => :get # ticket overviews match api_path + '/ticket_overviews', :to => 'ticket_overviews#show', :via => :get