Merge pull request #6251 from betagouv/feat/6150
ETQ Usager / Instructeur, je peux voir les stats de dossiers acceptés/refusés/sans-suite pour chaque démarche
This commit is contained in:
commit
3bd6df8bbf
8 changed files with 88 additions and 28 deletions
|
@ -209,6 +209,7 @@ module Instructeurs
|
|||
@usual_traitement_time = @procedure.stats_usual_traitement_time
|
||||
@dossiers_funnel = @procedure.stats_dossiers_funnel
|
||||
@termines_states = @procedure.stats_termines_states
|
||||
@termines_by_week = @procedure.stats_termines_by_week
|
||||
end
|
||||
|
||||
private
|
||||
|
|
21
app/controllers/users/statistiques_controller.rb
Normal file
21
app/controllers/users/statistiques_controller.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
module Users
|
||||
class StatistiquesController < ApplicationController
|
||||
def statistiques
|
||||
@procedure = procedure
|
||||
return procedure_not_found if @procedure.blank? || @procedure.brouillon?
|
||||
|
||||
@usual_traitement_time = @procedure.stats_usual_traitement_time
|
||||
@dossiers_funnel = @procedure.stats_dossiers_funnel
|
||||
@termines_states = @procedure.stats_termines_states
|
||||
@termines_by_week = @procedure.stats_termines_by_week
|
||||
|
||||
render :show
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def procedure
|
||||
Procedure.publiees.or(Procedure.brouillons).find_by(path: params[:path])
|
||||
end
|
||||
end
|
||||
end
|
|
@ -27,4 +27,22 @@ module ProcedureStatsConcern
|
|||
]
|
||||
end
|
||||
end
|
||||
|
||||
def stats_termines_by_week
|
||||
Rails.cache.fetch("#{cache_key_with_version}/stats_termines_by_week", expires_in: 12.hours) do
|
||||
now = Time.zone.now
|
||||
chart_data = dossiers.joins(:traitements)
|
||||
.state_termine
|
||||
.where(traitements: { processed_at: (now.beginning_of_week - 6.months)..now.end_of_week })
|
||||
|
||||
dossier_state_values = chart_data.pluck(:state).sort.uniq
|
||||
|
||||
# rubocop:disable Style/HashTransformValues
|
||||
dossier_state_values
|
||||
.map do |state|
|
||||
{ name: state, data: chart_data.where(state: state).group_by_week { |dossier| dossier.traitements.first.processed_at }.map { |k, v| [k, v.count] }.to_h }
|
||||
# rubocop:enable Style/HashTransformValues
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -5,31 +5,4 @@
|
|||
locals: { steps: [link_to(@procedure.libelle, instructeur_procedure_path(@procedure)),
|
||||
'Statistiques'] }
|
||||
|
||||
.statistiques
|
||||
-# Load Chartkick lazily, by using our React lazy-loader.
|
||||
-# (Chartkick itself doesn't use React though)
|
||||
= react_component('Chartkick')
|
||||
|
||||
%h1.new-h1= title
|
||||
.stat-cards
|
||||
- if @usual_traitement_time.present?
|
||||
.stat-card.big-number-card
|
||||
%span.big-number-card-title TEMPS DE TRAITEMENT USUEL
|
||||
%span.big-number-card-number
|
||||
= distance_of_time_in_words(@usual_traitement_time)
|
||||
%span.big-number-card-detail
|
||||
90% des demandes du mois dernier ont été traitées en moins de #{distance_of_time_in_words(@usual_traitement_time)}.
|
||||
|
||||
.stat-cards
|
||||
.stat-card.stat-card-half.pull-left
|
||||
%span.stat-card-title AVANCÉE DES DOSSIERS
|
||||
.chart-container
|
||||
.chart
|
||||
= area_chart @dossiers_funnel
|
||||
|
||||
.stat-card.stat-card-half.pull-left
|
||||
%span.stat-card-title TAUX D’ACCEPTATION
|
||||
.chart-container
|
||||
.chart
|
||||
- colors = %w(#C3D9FF #0069CC #1C7EC9) # from _colors.scss
|
||||
= pie_chart @termines_states, colors: colors
|
||||
= render partial: 'shared/procedures/stats', locals: { title: title }
|
||||
|
|
35
app/views/shared/procedures/_stats.html.haml
Normal file
35
app/views/shared/procedures/_stats.html.haml
Normal file
|
@ -0,0 +1,35 @@
|
|||
.statistiques
|
||||
-# Load Chartkick lazily, by using our React lazy-loader.
|
||||
-# (Chartkick itself doesn't use React though)
|
||||
= react_component('Chartkick')
|
||||
|
||||
%h1.new-h1= title
|
||||
.stat-cards
|
||||
- if @usual_traitement_time.present?
|
||||
.stat-card.big-number-card
|
||||
%span.big-number-card-title TEMPS DE TRAITEMENT USUEL
|
||||
%span.big-number-card-number
|
||||
= distance_of_time_in_words(@usual_traitement_time)
|
||||
%span.big-number-card-detail
|
||||
90% des demandes du mois dernier ont été traitées en moins de #{distance_of_time_in_words(@usual_traitement_time)}.
|
||||
|
||||
.stat-cards
|
||||
.stat-card.stat-card-half.pull-left
|
||||
%span.stat-card-title AVANCÉE DES DOSSIERS
|
||||
.chart-container
|
||||
.chart
|
||||
= area_chart @dossiers_funnel
|
||||
|
||||
.stat-card.stat-card-half.pull-left
|
||||
%span.stat-card-title TAUX D’ACCEPTATION
|
||||
.chart-container
|
||||
.chart
|
||||
- colors = %w(#C3D9FF #0069CC #1C7EC9) # from _colors.scss
|
||||
= pie_chart @termines_states, colors: colors
|
||||
|
||||
.stat-cards
|
||||
.stat-card.stat-card-half.pull-left
|
||||
%span.stat-card-title RÉPARTITION PAR SEMAINE
|
||||
.chart-container
|
||||
.chart
|
||||
= line_chart @termines_by_week, colors: ["#387EC3", "#AE2C2B", "#FAD859"]
|
4
app/views/statistiques/show.html.haml
Normal file
4
app/views/statistiques/show.html.haml
Normal file
|
@ -0,0 +1,4 @@
|
|||
- title = "Statistiques · #{@procedure.libelle}"
|
||||
- content_for(:title, title)
|
||||
|
||||
= render partial: 'shared/procedures/stats', locals: { title: title }
|
|
@ -33,6 +33,10 @@
|
|||
- horaires = "Horaires : #{formatted_horaires(service.horaires)}"
|
||||
= simple_format(horaires, {}, wrapper_tag: 'span')
|
||||
|
||||
%li
|
||||
Statistiques :
|
||||
= link_to "voir les statistiques de la démarche", statistiques_path(procedure.path)
|
||||
|
||||
|
||||
- politiques = politiques_conservation_de_donnees(procedure)
|
||||
- if politiques.present?
|
||||
|
|
|
@ -248,6 +248,10 @@ Rails.application.routes.draw do
|
|||
#
|
||||
|
||||
scope module: 'users' do
|
||||
namespace :statistiques do
|
||||
get '/:path', action: 'statistiques'
|
||||
end
|
||||
|
||||
namespace :commencer do
|
||||
get '/test/:path/dossier_vide', action: 'dossier_vide_pdf_test', as: :dossier_vide_test
|
||||
get '/test/:path', action: 'commencer_test', as: :test
|
||||
|
|
Loading…
Reference in a new issue