2019-08-06 11:02:54 +02:00
module Instructeurs
class ProceduresController < InstructeurController
2017-07-03 14:05:55 +02:00
before_action :ensure_ownership! , except : [ :index ]
2017-09-07 16:04:53 +02:00
before_action :redirect_to_avis_if_needed , only : [ :index ]
2017-07-03 14:05:55 +02:00
2017-10-05 13:28:24 +02:00
ITEMS_PER_PAGE = 25
2017-09-27 15:16:07 +02:00
2017-07-03 14:05:55 +02:00
def index
2019-09-16 14:04:18 +02:00
@procedures = current_instructeur
2019-09-17 15:07:58 +02:00
. procedures
2019-09-17 11:11:08 +02:00
. with_attached_logo
. includes ( :defaut_groupe_instructeur )
2019-09-16 14:04:18 +02:00
. order ( archived_at : :desc , published_at : :desc , created_at : :desc )
2017-07-03 14:05:55 +02:00
2019-09-12 17:26:59 +02:00
dossiers = current_instructeur . dossiers . joins ( :groupe_instructeur )
@dossiers_count_per_procedure = dossiers . all_state . group ( 'groupe_instructeurs.procedure_id' ) . reorder ( nil ) . count
@dossiers_a_suivre_count_per_procedure = dossiers . without_followers . en_cours . group ( 'groupe_instructeurs.procedure_id' ) . reorder ( nil ) . count
@dossiers_archived_count_per_procedure = dossiers . archived . group ( 'groupe_instructeurs.procedure_id' ) . count
@dossiers_termines_count_per_procedure = dossiers . termine . group ( 'groupe_instructeurs.procedure_id' ) . reorder ( nil ) . count
2019-08-26 15:35:40 +02:00
2019-09-12 17:26:59 +02:00
groupe_ids = current_instructeur . groupe_instructeurs . pluck ( :id )
2017-07-03 14:05:55 +02:00
2019-09-12 17:26:59 +02:00
@followed_dossiers_count_per_procedure = current_instructeur
2017-07-17 11:22:12 +02:00
. followed_dossiers
2019-09-12 17:26:59 +02:00
. joins ( :groupe_instructeur )
2017-07-17 11:22:12 +02:00
. en_cours
2019-09-12 17:26:59 +02:00
. where ( groupe_instructeur_id : groupe_ids )
. group ( 'groupe_instructeurs.procedure_id' )
2017-07-17 11:22:12 +02:00
. reorder ( nil )
. count
2017-07-03 14:05:55 +02:00
end
2017-06-29 15:30:42 +02:00
2017-07-11 16:09:03 +02:00
def show
@procedure = procedure
2017-09-28 11:04:18 +02:00
@current_filters = current_filters
@available_fields_to_filters = available_fields_to_filters
2018-10-03 14:46:12 +02:00
# Technically, procedure_presentation already sets the attribute.
# Setting it here to make clear that it is used by the view
@procedure_presentation = procedure_presentation
2017-10-02 17:03:38 +02:00
@displayed_fields_values = displayed_fields_values
2019-09-18 13:44:00 +02:00
@a_suivre_dossiers = current_instructeur
2017-07-11 16:09:03 +02:00
. dossiers
2019-09-18 13:44:00 +02:00
. for_procedure ( procedure )
2017-07-11 16:09:03 +02:00
. without_followers
. en_cours
2019-08-06 11:02:54 +02:00
@followed_dossiers = current_instructeur
2017-07-11 16:09:03 +02:00
. followed_dossiers
2019-09-18 13:44:00 +02:00
. where ( groupe_instructeur : current_instructeur . groupe_instructeurs )
. for_procedure ( procedure )
2017-07-11 16:09:03 +02:00
. en_cours
2019-08-06 11:02:54 +02:00
@followed_dossiers_id = current_instructeur
2017-07-31 18:35:34 +02:00
. followed_dossiers
2019-09-18 13:44:00 +02:00
. where ( groupe_instructeur : current_instructeur . groupe_instructeurs )
. for_procedure ( procedure )
2017-07-31 18:35:34 +02:00
. pluck ( :id )
2019-09-18 13:44:00 +02:00
@termines_dossiers = current_instructeur
. dossiers
. for_procedure ( procedure )
. termine
2017-07-11 16:09:03 +02:00
2019-09-18 13:44:00 +02:00
@all_state_dossiers = current_instructeur
. dossiers
. for_procedure ( procedure )
. all_state
2017-07-11 16:09:03 +02:00
2019-09-18 13:44:00 +02:00
@archived_dossiers = current_instructeur
. dossiers
. for_procedure ( procedure )
. archived
2017-07-11 15:40:09 +02:00
2017-09-28 19:07:18 +02:00
@dossiers = case statut
2017-07-11 15:40:09 +02:00
when 'a-suivre'
@a_suivre_dossiers
when 'suivis'
@followed_dossiers
when 'traites'
@termines_dossiers
when 'tous'
@all_state_dossiers
when 'archives'
@archived_dossiers
end
2017-09-21 16:47:43 +02:00
2019-08-06 11:02:54 +02:00
sorted_ids = procedure_presentation . sorted_ids ( @dossiers , current_instructeur )
2017-09-27 15:16:07 +02:00
2017-09-28 11:04:18 +02:00
if @current_filters . count > 0
2018-10-03 19:17:22 +02:00
filtered_ids = procedure_presentation . filtered_ids ( @dossiers , statut )
2019-09-12 11:26:22 +02:00
filtered_sorted_ids = sorted_ids . filter { | id | filtered_ids . include? ( id ) }
2017-09-28 11:04:18 +02:00
else
filtered_sorted_ids = sorted_ids
end
2018-03-06 13:44:29 +01:00
page = params [ :page ] . presence || 1
2017-09-27 15:16:07 +02:00
2017-09-28 11:04:18 +02:00
filtered_sorted_paginated_ids = Kaminari
. paginate_array ( filtered_sorted_ids )
2017-09-27 15:16:07 +02:00
. page ( page )
. per ( ITEMS_PER_PAGE )
2017-09-28 11:04:18 +02:00
@dossiers = @dossiers . where ( id : filtered_sorted_paginated_ids )
2017-09-27 15:16:07 +02:00
2019-02-19 16:57:45 +01:00
@dossiers = procedure_presentation . eager_load_displayed_fields ( @dossiers )
2017-10-02 17:03:38 +02:00
2017-09-28 11:04:18 +02:00
@dossiers = @dossiers . sort_by { | d | filtered_sorted_paginated_ids . index ( d . id ) }
2017-09-27 15:16:07 +02:00
2017-09-28 11:04:18 +02:00
kaminarize ( page , filtered_sorted_ids . count )
2017-07-11 16:09:03 +02:00
end
2017-10-02 17:03:38 +02:00
def update_displayed_fields
values = params [ :values ]
if values . nil?
values = [ ]
end
fields = values . map do | value |
2019-02-13 18:24:41 +01:00
find_field ( * value . split ( '/' ) )
2017-10-02 17:03:38 +02:00
end
2018-03-02 16:27:03 +01:00
procedure_presentation . update ( displayed_fields : fields )
2017-10-02 17:03:38 +02:00
2017-09-27 15:16:07 +02:00
current_sort = procedure_presentation . sort
2019-02-13 17:50:33 +01:00
if ! values . include? ( field_id ( current_sort ) )
2018-03-02 16:27:03 +01:00
procedure_presentation . update ( sort : Procedure . default_sort )
2017-09-27 15:16:07 +02:00
end
2019-08-06 11:02:54 +02:00
redirect_back ( fallback_location : instructeur_procedure_url ( procedure ) )
2017-09-27 15:16:07 +02:00
end
def update_sort
current_sort = procedure_presentation . sort
table = params [ :table ]
column = params [ :column ]
if table == current_sort [ 'table' ] && column == current_sort [ 'column' ]
order = current_sort [ 'order' ] == 'asc' ? 'desc' : 'asc'
else
order = 'asc'
end
sort = {
'table' = > table ,
'column' = > column ,
'order' = > order
2018-09-20 17:02:28 +02:00
}
2017-09-27 15:16:07 +02:00
2018-03-02 16:27:03 +01:00
procedure_presentation . update ( sort : sort )
2017-09-27 15:16:07 +02:00
2019-08-06 11:02:54 +02:00
redirect_back ( fallback_location : instructeur_procedure_url ( procedure ) )
2017-10-02 17:03:38 +02:00
end
2017-09-28 11:04:18 +02:00
def add_filter
2017-12-06 17:26:23 +01:00
if params [ :value ] . present?
filters = procedure_presentation . filters
table , column = params [ :field ] . split ( '/' )
2019-02-13 18:24:41 +01:00
label = find_field ( table , column ) [ 'label' ]
2017-12-06 17:26:23 +01:00
filters [ statut ] << {
'label' = > label ,
'table' = > table ,
'column' = > column ,
'value' = > params [ :value ]
}
2018-09-20 16:18:21 +02:00
procedure_presentation . update ( filters : filters )
2017-12-06 17:26:23 +01:00
end
2017-09-28 11:04:18 +02:00
2019-08-06 11:02:54 +02:00
redirect_back ( fallback_location : instructeur_procedure_url ( procedure ) )
2017-09-28 11:04:18 +02:00
end
def remove_filter
filters = procedure_presentation . filters
2019-02-19 18:20:12 +01:00
to_remove = params . values_at ( :table , :column , :value )
filters [ statut ] . reject! { | filter | filter . values_at ( 'table' , 'column' , 'value' ) == to_remove }
2017-09-28 11:04:18 +02:00
2018-09-20 16:18:21 +02:00
procedure_presentation . update ( filters : filters )
2017-09-28 11:04:18 +02:00
2019-08-06 11:02:54 +02:00
redirect_back ( fallback_location : instructeur_procedure_url ( procedure ) )
2017-09-28 11:04:18 +02:00
end
2017-11-22 17:27:02 +01:00
def download_dossiers
2019-04-03 14:29:30 +02:00
options = params . permit ( :version , :limit , :since , tables : [ ] )
2017-11-22 17:27:02 +01:00
2019-09-18 16:51:45 +02:00
dossiers = current_instructeur . dossiers . for_procedure ( procedure )
2017-11-22 17:27:02 +01:00
respond_to do | format |
2018-11-22 00:14:16 +01:00
format . csv do
2019-09-18 16:51:45 +02:00
send_data ( procedure . to_csv ( dossiers , options ) ,
2018-11-22 00:14:16 +01:00
filename : procedure . export_filename ( :csv ) )
end
format . xlsx do
2019-09-18 16:51:45 +02:00
send_data ( procedure . to_xlsx ( dossiers , options ) ,
2018-11-22 00:14:16 +01:00
filename : procedure . export_filename ( :xlsx ) )
end
format . ods do
2019-09-18 16:51:45 +02:00
send_data ( procedure . to_ods ( dossiers , options ) ,
2018-11-22 00:14:16 +01:00
filename : procedure . export_filename ( :ods ) )
end
2017-11-22 17:27:02 +01:00
end
end
2019-10-03 15:35:31 +02:00
def download_export
export_format = params [ :export_format ]
2019-09-30 11:57:21 +02:00
2019-10-03 15:35:31 +02:00
if procedure . should_generate_export? ( export_format )
procedure . queue_export ( current_instructeur , export_format )
2019-09-30 11:57:21 +02:00
2019-10-16 11:40:19 +02:00
respond_to do | format |
format . js do
flash . notice = " Nous générons cet export. Lorsque celui-ci sera disponible, vous recevrez une notification par email accompagnée d'un lien de téléchargement. "
@procedure = procedure
end
end
2019-10-02 15:51:37 +02:00
else
2019-10-03 15:35:31 +02:00
redirect_to url_for ( procedure . export_file ( export_format ) )
2019-10-02 15:51:37 +02:00
end
end
2019-03-13 17:37:07 +01:00
def email_notifications
@procedure = procedure
@assign_to = assign_to
end
def update_email_notifications
assign_to . update! ( email_notifications_enabled : params [ :assign_to ] [ :email_notifications_enabled ] )
flash . notice = 'Vos notifications sont enregistrées.'
2019-08-06 11:02:54 +02:00
redirect_to instructeur_procedure_path ( procedure )
2019-03-13 17:37:07 +01:00
end
2019-07-30 14:37:00 +02:00
def stats
@procedure = procedure
2019-09-17 15:52:38 +02:00
@usual_traitement_time = @procedure . stats_usual_traitement_time
@dossiers_funnel = @procedure . stats_dossiers_funnel
@termines_states = @procedure . stats_termines_states
2019-07-30 14:37:00 +02:00
end
2017-06-29 15:30:42 +02:00
private
2019-02-13 18:24:41 +01:00
def find_field ( table , column )
procedure_presentation . fields . find { | c | c [ 'table' ] == table && c [ 'column' ] == column }
end
2019-02-13 17:50:33 +01:00
def field_id ( field )
2019-02-13 17:53:41 +01:00
field . values_at ( 'table' , 'column' ) . join ( '/' )
2019-02-13 17:50:33 +01:00
end
2019-03-13 17:37:07 +01:00
def assign_to
2019-08-26 16:17:25 +02:00
current_instructeur . assign_to . joins ( :groupe_instructeur ) . find_by ( groupe_instructeurs : { procedure : procedure } )
2019-03-13 17:37:07 +01:00
end
2017-09-28 19:07:18 +02:00
def statut
2018-03-06 13:44:29 +01:00
@statut || = ( params [ :statut ] . presence || 'a-suivre' )
2017-09-28 19:07:18 +02:00
end
2017-06-29 15:30:42 +02:00
def procedure
Procedure . find ( params [ :procedure_id ] )
end
def ensure_ownership!
2019-08-21 14:09:56 +02:00
if ! procedure . defaut_groupe_instructeur . instructeurs . include? ( current_instructeur )
2018-09-05 14:48:42 +02:00
flash [ :alert ] = " Vous n'avez pas accès à cette démarche "
2017-06-29 15:30:42 +02:00
redirect_to root_path
end
end
2017-09-07 16:04:53 +02:00
def redirect_to_avis_if_needed
2019-09-17 15:07:58 +02:00
if current_instructeur . procedures . count == 0 && current_instructeur . avis . count > 0
2019-08-06 11:02:54 +02:00
redirect_to instructeur_avis_index_path
2017-09-07 16:04:53 +02:00
end
end
2017-10-02 17:03:38 +02:00
def procedure_presentation
2018-10-23 10:55:59 +02:00
@procedure_presentation || = get_procedure_presentation
end
def get_procedure_presentation
2019-08-06 11:02:54 +02:00
procedure_presentation , errors = current_instructeur . procedure_presentation_and_errors_for_procedure_id ( params [ :procedure_id ] )
2018-10-23 11:39:54 +02:00
if errors . present?
flash [ :alert ] = " Votre affichage a dû être réinitialisé en raison du problème suivant : " + errors . full_messages . join ( ', ' )
end
procedure_presentation
2017-10-02 17:03:38 +02:00
end
def displayed_fields_values
2019-02-13 17:50:33 +01:00
procedure_presentation . displayed_fields . map { | field | field_id ( field ) }
2017-10-02 17:03:38 +02:00
end
2017-09-28 11:04:18 +02:00
def current_filters
@current_filters || = procedure_presentation . filters [ statut ]
end
def available_fields_to_filters
2019-02-13 14:41:31 +01:00
procedure_presentation . fields_for_select
2017-09-28 11:04:18 +02:00
end
2017-09-27 15:16:07 +02:00
def kaminarize ( current_page , total )
@dossiers . instance_eval <<-EVAL
def current_page
#{current_page}
2017-10-02 17:03:38 +02:00
end
2017-09-27 15:16:07 +02:00
def total_pages
( #{total} / #{ITEMS_PER_PAGE}.to_f).ceil
end
2017-10-05 13:28:24 +02:00
def limit_value
2017-09-27 15:16:07 +02:00
#{ITEMS_PER_PAGE}
end
def first_page?
current_page == 1
end
def last_page?
current_page == total_pages
end
2018-07-17 17:25:09 +02:00
EVAL
2017-10-02 17:03:38 +02:00
end
2017-06-29 15:30:42 +02:00
end
end