demarches-normaliennes/app/controllers/instructeurs/procedures_controller.rb

367 lines
13 KiB
Ruby
Raw Normal View History

module Instructeurs
class ProceduresController < InstructeurController
before_action :ensure_ownership!, except: [:index]
ITEMS_PER_PAGE = 25
2017-09-27 15:16:07 +02:00
def index
2019-09-16 14:04:18 +02:00
@procedures = current_instructeur
.procedures
.kept
2019-09-17 11:11:08 +02:00
.with_attached_logo
.includes(:defaut_groupe_instructeur)
2019-12-18 13:28:29 +01:00
.order(closed_at: :desc, unpublished_at: :desc, published_at: :desc, created_at: :desc)
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
2021-12-06 14:09:58 +01:00
@dossiers_termines_count_per_procedure = dossiers.termine.not_hidden_by_instructeur.group('groupe_instructeurs.procedure_id').reorder(nil).count
@dossiers_expirant_count_per_procedure = dossiers.termine_or_en_construction_close_to_expiration.group('groupe_instructeurs.procedure_id').count
groupe_ids = current_instructeur.groupe_instructeurs.pluck(:id)
@followed_dossiers_count_per_procedure = current_instructeur
.followed_dossiers
.joins(:groupe_instructeur)
.en_cours
.where(groupe_instructeur_id: groupe_ids)
.group('groupe_instructeurs.procedure_id')
.reorder(nil)
.count
2020-09-10 12:10:38 +02:00
@all_dossiers_counts = {
'à suivre' => @dossiers_a_suivre_count_per_procedure.sum { |_, v| v },
'suivis' => @followed_dossiers_count_per_procedure.sum { |_, v| v },
'traités' => @dossiers_termines_count_per_procedure.sum { |_, v| v },
'dossiers' => @dossiers_count_per_procedure.sum { |_, v| v },
'expirant' => @dossiers_expirant_count_per_procedure.sum { |_, v| v },
'archivés' => @dossiers_archived_count_per_procedure.sum { |_, v| v }
2020-09-10 12:10:38 +02:00
}
@procedure_ids_en_cours_with_notifications = current_instructeur.procedure_ids_with_notifications(:en_cours)
@procedure_ids_termines_with_notifications = current_instructeur.procedure_ids_with_notifications(:termine)
end
2017-07-11 16:09:03 +02:00
def show
@procedure = procedure
# Technically, procedure_presentation already sets the attribute.
# Setting it here to make clear that it is used by the view
@procedure_presentation = procedure_presentation
2020-10-30 11:33:45 +01:00
@current_filters = current_filters
@displayed_fields_options, @displayed_fields_selected = procedure_presentation.displayed_fields_for_select
2020-10-30 11:33:45 +01:00
@a_suivre_count, @suivis_count, @traites_count, @tous_count, @archives_count, @expirant_count = current_instructeur
.dossiers_count_summary(groupe_instructeur_ids)
.fetch_values('a_suivre', 'suivis', 'traites', 'tous', 'archives', 'expirant')
2021-04-09 11:10:37 +02:00
dossiers_visibles = Dossier
2021-04-09 11:01:20 +02:00
.where(groupe_instructeur_id: groupe_instructeur_ids)
2021-04-09 11:10:37 +02:00
@a_suivre_dossiers = dossiers_visibles
2017-07-11 16:09:03 +02:00
.without_followers
.en_cours
@followed_dossiers = current_instructeur
2017-07-11 16:09:03 +02:00
.followed_dossiers
.where(groupe_instructeur_id: groupe_instructeur_ids)
2017-07-11 16:09:03 +02:00
.en_cours
2021-04-09 10:53:59 +02:00
@followed_dossiers_id = @followed_dossiers.pluck(:id)
2021-12-06 14:09:58 +01:00
@termines_dossiers = dossiers_visibles.termine.not_hidden_by_instructeur
2021-04-09 11:10:37 +02:00
@all_state_dossiers = dossiers_visibles.all_state
@archived_dossiers = dossiers_visibles.archived
@expirant_dossiers = dossiers_visibles.termine_or_en_construction_close_to_expiration
2017-09-28 19:07:18 +02:00
@dossiers = case statut
when 'a-suivre'
2021-07-22 18:16:04 +02:00
dossiers_count = @a_suivre_count
@a_suivre_dossiers
when 'suivis'
2021-07-22 18:16:04 +02:00
dossiers_count = @suivis_count
@followed_dossiers
when 'traites'
2021-07-22 18:16:04 +02:00
dossiers_count = @traites_count
@termines_dossiers
when 'tous'
2021-07-22 18:16:04 +02:00
dossiers_count = @tous_count
@all_state_dossiers
when 'archives'
2021-07-22 18:16:04 +02:00
dossiers_count = @archives_count
@archived_dossiers
when 'expirant'
dossiers_count = @expirant_count
@expirant_dossiers
end
2017-09-21 16:47:43 +02:00
2021-04-07 18:03:03 +02:00
notifications = current_instructeur.notifications_for_groupe_instructeurs(groupe_instructeur_ids)
@has_en_cours_notifications = notifications[:en_cours].present?
@has_termine_notifications = notifications[:termines].present?
@not_archived_notifications_dossier_ids = notifications[:en_cours] + notifications[:termines]
2020-09-14 13:52:28 +02:00
2021-07-22 18:16:04 +02:00
sorted_ids = procedure_presentation.sorted_ids(@dossiers, dossiers_count, current_instructeur)
2017-09-27 15:16:07 +02:00
2017-09-28 11:04:18 +02:00
if @current_filters.count > 0
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
2021-04-25 21:29:31 +02:00
@filtered_sorted_paginated_ids = Kaminari
2017-09-28 11:04:18 +02:00
.paginate_array(filtered_sorted_ids)
2017-09-27 15:16:07 +02:00
.page(page)
.per(ITEMS_PER_PAGE)
2021-04-25 21:29:31 +02:00
@projected_dossiers = DossierProjectionService.project(@filtered_sorted_paginated_ids, procedure_presentation.displayed_fields)
2019-12-11 17:42:44 +01:00
assign_exports
2017-07-11 16:09:03 +02:00
end
def deleted_dossiers
@procedure = procedure
2020-03-24 13:53:15 +01:00
@deleted_dossiers = @procedure
2020-03-31 14:33:30 +02:00
.deleted_dossiers
2020-03-24 13:53:15 +01:00
.order(:dossier_id)
.page params[:page]
2021-09-23 15:03:20 +02:00
@a_suivre_count, @suivis_count, @traites_count, @tous_count, @archives_count = current_instructeur
.dossiers_count_summary(groupe_instructeur_ids)
.fetch_values('a_suivre', 'suivis', 'traites', 'tous', 'archives')
notifications = current_instructeur.notifications_for_groupe_instructeurs(groupe_instructeur_ids)
@has_en_cours_notifications = notifications[:en_cours].present?
@has_termine_notifications = notifications[:termines].present?
@statut = 'supprime'
end
def update_displayed_fields
values = params['values'].presence || [].to_json
procedure_presentation.update_displayed_fields(JSON.parse(values))
2017-09-27 15:16:07 +02:00
redirect_back(fallback_location: instructeur_procedure_url(procedure))
2017-09-27 15:16:07 +02:00
end
def update_sort
2020-10-30 14:31:24 +01:00
procedure_presentation.update_sort(params[:table], params[:column])
2017-09-27 15:16:07 +02:00
redirect_back(fallback_location: instructeur_procedure_url(procedure))
end
2017-09-28 11:04:18 +02:00
def add_filter
2020-10-30 14:32:53 +01:00
procedure_presentation.add_filter(statut, params[:field], params[:value])
2017-09-28 11:04:18 +02:00
redirect_back(fallback_location: instructeur_procedure_url(procedure))
2017-09-28 11:04:18 +02:00
end
def remove_filter
2020-10-30 14:34:00 +01:00
procedure_presentation.remove_filter(statut, params[:field], params[:value])
2017-09-28 11:04:18 +02:00
redirect_back(fallback_location: instructeur_procedure_url(procedure))
2017-09-28 11:04:18 +02:00
end
def download_export
2020-01-29 12:16:38 +01:00
export_format = params[:export_format]
2021-06-16 11:46:25 +02:00
time_span_type = params[:time_span_type] || Export.time_span_types.fetch(:everything)
2019-12-11 17:43:24 +01:00
groupe_instructeurs = current_instructeur
.groupe_instructeurs
.where(procedure: procedure)
2019-09-30 11:57:21 +02:00
2021-04-22 08:38:34 +02:00
@dossier_count = current_instructeur
.dossiers_count_summary(groupe_instructeur_ids)
.fetch_values('tous', 'archives')
.sum
2021-06-16 11:46:25 +02:00
export = Export.find_or_create_export(export_format, time_span_type, groupe_instructeurs)
2019-12-11 17:43:24 +01:00
2021-04-08 12:47:29 +02:00
if export.ready? && export.old? && params[:force_export]
export.destroy
2021-06-16 11:46:25 +02:00
export = Export.find_or_create_export(export_format, time_span_type, groupe_instructeurs)
2021-04-08 12:47:29 +02:00
end
2019-12-11 17:43:24 +01:00
if export.ready?
2020-01-29 12:16:38 +01:00
respond_to do |format|
format.js do
@procedure = procedure
assign_exports
flash.notice = "Lexport au format \"#{export_format}\" est prêt. Vous pouvez le <a href=\"#{export.file.service_url}\">télécharger</a>"
2020-01-29 12:16:38 +01:00
end
format.html do
redirect_to export.file.service_url
end
end
2019-12-11 17:43:24 +01:00
else
2019-10-16 11:40:19 +02:00
respond_to do |format|
2019-12-11 17:43:24 +01:00
notice_message = "Nous générons cet export. Veuillez revenir dans quelques minutes pour le télécharger."
2020-01-29 12:16:38 +01:00
2019-10-16 11:40:19 +02:00
format.js do
@procedure = procedure
2019-12-11 17:43:24 +01:00
assign_exports
2020-01-29 12:16:38 +01:00
if !params[:no_progress_notification]
flash.notice = notice_message
end
2019-12-11 17:43:24 +01:00
end
format.html do
redirect_to instructeur_procedure_url(procedure), notice: notice_message
2019-10-16 11:40:19 +02:00
end
end
end
end
2019-03-13 17:37:07 +01:00
def email_notifications
@procedure = procedure
@assign_to = assign_tos.first
2019-03-13 17:37:07 +01:00
end
def update_email_notifications
assign_tos.each do |assign_to|
assign_to.update!(assign_to_params)
end
2019-03-13 17:37:07 +01:00
flash.notice = 'Vos notifications sont enregistrées.'
redirect_to instructeur_procedure_path(procedure)
2019-03-13 17:37:07 +01:00
end
def stats
@procedure = procedure
@usual_traitement_time = @procedure.stats_usual_traitement_time
@dossiers_funnel = @procedure.stats_dossiers_funnel
@termines_states = @procedure.stats_termines_states
2021-06-02 12:45:47 +02:00
@termines_by_week = @procedure.stats_termines_by_week
@usual_traitement_time_by_month = @procedure.stats_usual_traitement_time_by_month_in_days
end
2021-07-19 18:45:49 +02:00
def email_usagers
@procedure = procedure
@commentaire = Commentaire.new
@email_usagers_dossiers = email_usagers_dossiers
@dossiers_count = @email_usagers_dossiers.count
@groupe_instructeurs = email_usagers_groupe_instructeurs_label
@bulk_messages = BulkMessage.includes(:groupe_instructeurs).where(groupe_instructeurs: { id: current_instructeur.groupe_instructeur_ids, procedure: procedure })
2021-07-19 18:45:49 +02:00
end
def create_multiple_commentaire
@procedure = procedure
errors = []
email_usagers_dossiers.each do |dossier|
commentaire = CommentaireService.build(current_instructeur, dossier, commentaire_params)
if commentaire.save
commentaire.dossier.update!(last_commentaire_updated_at: Time.zone.now)
else
errors << dossier.id
end
end
valid_dossiers_count = email_usagers_dossiers.count - errors.count
create_bulk_message_mail(valid_dossiers_count, Dossier.states.fetch(:brouillon))
if errors.empty?
flash[:notice] = "Tous les messages ont été envoyés avec succès"
else
flash[:alert] = "Envoi terminé. Cependant #{errors.count} messages n'ont pas été envoyés"
end
redirect_to instructeur_procedure_path(@procedure)
end
def create_bulk_message_mail(dossier_count, dossier_state)
BulkMessage.create(
dossier_count: dossier_count,
dossier_state: dossier_state,
body: commentaire_params[:body],
sent_at: Time.zone.now,
instructeur_id: current_instructeur.id,
piece_jointe: commentaire_params[:piece_jointe],
groupe_instructeurs: email_usagers_groupe_instructeurs
)
end
private
def assign_to_params
params.require(:assign_to)
.permit(:instant_email_dossier_notifications_enabled, :instant_email_message_notifications_enabled, :daily_email_notifications_enabled, :weekly_email_notifications_enabled)
end
2019-12-11 17:42:44 +01:00
def assign_exports
2021-06-16 11:46:25 +02:00
@exports = Export.find_for_groupe_instructeurs(groupe_instructeur_ids)
2019-12-11 17:42:44 +01:00
end
def assign_tos
@assign_tos ||= current_instructeur
.assign_to
.joins(:groupe_instructeur)
.where(groupe_instructeur: { procedure_id: procedure_id })
end
def groupe_instructeur_ids
@groupe_instructeur_ids ||= assign_tos
.map(&:groupe_instructeur_id)
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
2021-04-08 14:35:43 +02:00
def procedure_id
params[:procedure_id]
end
def procedure
2021-04-21 22:02:40 +02:00
Procedure
.with_attached_logo
.find(procedure_id)
end
def ensure_ownership!
if !current_instructeur.procedures.include?(procedure)
2020-01-29 12:16:38 +01:00
flash[:alert] = "Vous navez pas accès à cette démarche"
redirect_to root_path
end
end
def redirect_to_avis_if_needed
if current_instructeur.procedures.count == 0 && current_instructeur.avis.count > 0
redirect_to instructeur_all_avis_path
end
end
def procedure_presentation
@procedure_presentation ||= get_procedure_presentation
end
def get_procedure_presentation
2021-04-08 14:35:43 +02:00
procedure_presentation, errors = current_instructeur.procedure_presentation_and_errors_for_procedure_id(procedure_id)
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
end
2017-09-28 11:04:18 +02:00
def current_filters
@current_filters ||= procedure_presentation.filters[statut]
end
2021-07-19 18:45:49 +02:00
def email_usagers_dossiers
procedure.dossiers.state_brouillon.where(groupe_instructeur: current_instructeur.groupe_instructeur_ids).includes(:groupe_instructeur)
end
def email_usagers_groupe_instructeurs_label
email_usagers_dossiers.map(&:groupe_instructeur).uniq.map(&:label)
end
def email_usagers_groupe_instructeurs
email_usagers_dossiers.map(&:groupe_instructeur).uniq
end
def commentaire_params
params.require(:commentaire).permit(:body, :piece_jointe)
end
end
end