diff --git a/app/controllers/admin/procedures_controller.rb b/app/controllers/admin/procedures_controller.rb
index 6c70a29c2..2a8b8dc6b 100644
--- a/app/controllers/admin/procedures_controller.rb
+++ b/app/controllers/admin/procedures_controller.rb
@@ -44,7 +44,7 @@ class Admin::ProceduresController < AdminController
def edit
@path = @procedure.path || @procedure.default_path
- @availability = @procedure.path_availability(@path)
+ @availability = @procedure.path_availability(current_administrateur, @path)
end
def destroy
@@ -96,7 +96,7 @@ class Admin::ProceduresController < AdminController
flash.now.alert = @procedure.errors.full_messages
@path = procedure_params[:path]
if @path.present?
- @availability = @procedure.path_availability(@path)
+ @availability = @procedure.path_availability(current_administrateur, @path)
end
render 'edit'
elsif @procedure.brouillon?
@@ -121,7 +121,7 @@ class Admin::ProceduresController < AdminController
procedure.path = nil
end
- if procedure.publish_or_reopen!(path)
+ if procedure.publish_or_reopen!(current_administrateur, path)
flash.notice = "Démarche publiée"
redirect_to admin_procedures_path
else
@@ -195,7 +195,7 @@ class Admin::ProceduresController < AdminController
.pluck('procedures.id')
@grouped_procedures = Procedure
- .includes(:administrateur, :service)
+ .includes(:administrateurs, :service)
.where(id: significant_procedure_ids)
.group_by(&:organisation_name)
.sort_by { |_, procedures| procedures.first.created_at }
@@ -217,11 +217,10 @@ class Admin::ProceduresController < AdminController
json_path_list = Procedure
.find_with_path(params[:request])
.order(:id)
- .pluck(:path, :administrateur_id)
- .map do |path, administrateur_id|
+ .map do |procedure|
{
- label: path,
- mine: administrateur_id == current_administrateur.id
+ label: procedure.path,
+ mine: current_administrateur.owns?(procedure)
}
end.to_json
@@ -234,7 +233,7 @@ class Admin::ProceduresController < AdminController
if procedure_id.present?
procedure = current_administrateur.procedures.find(procedure_id)
- @availability = procedure.path_availability(path)
+ @availability = procedure.path_availability(current_administrateur, path)
else
@availability = Procedure.path_availability(current_administrateur, path)
end
@@ -273,7 +272,7 @@ class Admin::ProceduresController < AdminController
if @procedure&.locked?
params.require(:procedure).permit(*editable_params)
else
- params.require(:procedure).permit(*editable_params, :duree_conservation_dossiers_dans_ds, :duree_conservation_dossiers_hors_ds, :for_individual, :individual_with_siret, :ask_birthday, :path).merge(administrateur_id: current_administrateur.id)
+ params.require(:procedure).permit(*editable_params, :duree_conservation_dossiers_dans_ds, :duree_conservation_dossiers_hors_ds, :for_individual, :individual_with_siret, :ask_birthday, :path)
end
end
end
diff --git a/app/controllers/api/v1/dossiers_controller.rb b/app/controllers/api/v1/dossiers_controller.rb
index 68cc51c41..e85f1548e 100644
--- a/app/controllers/api/v1/dossiers_controller.rb
+++ b/app/controllers/api/v1/dossiers_controller.rb
@@ -38,7 +38,7 @@ class API::V1::DossiersController < APIController
def fetch_procedure_and_check_token
@procedure = Procedure.for_api.find(params[:procedure_id])
- if !valid_token_for_administrateur?(@procedure.administrateur)
+ if !valid_token_for_procedure?(@procedure)
render json: {}, status: :unauthorized
end
diff --git a/app/controllers/api/v1/procedures_controller.rb b/app/controllers/api/v1/procedures_controller.rb
index dd929c7b7..4f35da14f 100644
--- a/app/controllers/api/v1/procedures_controller.rb
+++ b/app/controllers/api/v1/procedures_controller.rb
@@ -10,7 +10,7 @@ class API::V1::ProceduresController < APIController
def fetch_procedure_and_check_token
@procedure = Procedure.for_api.find(params[:id])
- if !valid_token_for_administrateur?(@procedure.administrateur)
+ if !valid_token_for_procedure?(@procedure)
render json: {}, status: :unauthorized
end
diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb
index 0259809b3..19ca856de 100644
--- a/app/controllers/api_controller.rb
+++ b/app/controllers/api_controller.rb
@@ -3,8 +3,10 @@ class APIController < ApplicationController
protected
- def valid_token_for_administrateur?(administrateur)
- administrateur.valid_api_token?(token)
+ def valid_token_for_procedure?(procedure)
+ procedure.administrateurs.any? do |administrateur|
+ administrateur.valid_api_token?(token)
+ end
end
private
diff --git a/app/controllers/manager/procedures_controller.rb b/app/controllers/manager/procedures_controller.rb
index 8f64042bf..d5bef5228 100644
--- a/app/controllers/manager/procedures_controller.rb
+++ b/app/controllers/manager/procedures_controller.rb
@@ -24,5 +24,17 @@ module Manager
flash[:notice] = "La démarche a bien été supprimée, en cas d'erreur contactez un développeur."
redirect_to manager_procedures_path
end
+
+ def add_administrateur
+ procedure = Procedure.find(params[:id])
+ administrateur = Administrateur.find_by(email: params[:email])
+ if administrateur
+ procedure.administrateurs << administrateur
+ flash[:notice] = "L'administrateur \"#{params[:email]}\" est ajouté à la démarche."
+ else
+ flash[:alert] = "L'administrateur \"#{params[:email]}\" est introuvable."
+ end
+ redirect_to manager_procedure_path(procedure)
+ end
end
end
diff --git a/app/controllers/new_administrateur/services_controller.rb b/app/controllers/new_administrateur/services_controller.rb
index 66d0c11da..681b07ab4 100644
--- a/app/controllers/new_administrateur/services_controller.rb
+++ b/app/controllers/new_administrateur/services_controller.rb
@@ -81,13 +81,19 @@ module NewAdministrateur
end
def services
- current_administrateur.services
+ service_ids = current_administrateur.service_ids
+ service_ids << maybe_procedure&.service_id
+ Service.where(id: service_ids.compact.uniq)
end
def procedure_params
params.require(:procedure).permit(:id, :service_id)
end
+ def maybe_procedure
+ current_administrateur.procedures.find_by(id: params[:procedure_id])
+ end
+
def procedure
current_administrateur.procedures.find(params[:procedure_id])
end
diff --git a/app/controllers/new_user/dossiers_controller.rb b/app/controllers/new_user/dossiers_controller.rb
index f6871c8f5..6bbd5c412 100644
--- a/app/controllers/new_user/dossiers_controller.rb
+++ b/app/controllers/new_user/dossiers_controller.rb
@@ -186,7 +186,7 @@ module NewUser
end
def ask_deletion
- dossier = current_user.dossiers.includes(:user, procedure: :administrateur).find(params[:id])
+ dossier = current_user.dossiers.includes(:user, procedure: :administrateurs).find(params[:id])
if dossier.can_be_deleted_by_user?
dossier.delete_and_keep_track
diff --git a/app/controllers/stats_controller.rb b/app/controllers/stats_controller.rb
index c8cb4138a..a2c1f0214 100644
--- a/app/controllers/stats_controller.rb
+++ b/app/controllers/stats_controller.rb
@@ -23,8 +23,6 @@ class StatsController < ApplicationController
@dossiers_cumulative = cumulative_hash(dossiers, :en_construction_at)
@dossiers_in_the_last_4_months = last_four_months_hash(dossiers, :en_construction_at)
- @procedures_count_per_administrateur = procedures_count_per_administrateur(procedures)
-
if administration_signed_in?
@dossier_instruction_mean_time = Rails.cache.fetch("dossier_instruction_mean_time", expires_in: 1.day) do
dossier_instruction_mean_time(dossiers)
@@ -234,15 +232,6 @@ class StatsController < ApplicationController
.reduce({}, :merge)
end
- def procedures_count_per_administrateur(procedures)
- count_per_administrateur = procedures.group(:administrateur_id).count.values
- {
- 'Une démarche' => count_per_administrateur.select { |count| count == 1 }.count,
- 'Entre deux et cinq démarches' => count_per_administrateur.select { |count| count.in?(2..5) }.count,
- 'Plus de cinq démarches' => count_per_administrateur.select { |count| count > 5 }.count
- }
- end
-
def mean(collection)
(collection.sum.to_f / collection.size).round(2)
end
diff --git a/app/dashboards/procedure_dashboard.rb b/app/dashboards/procedure_dashboard.rb
index f56e6abed..53291aafb 100644
--- a/app/dashboards/procedure_dashboard.rb
+++ b/app/dashboards/procedure_dashboard.rb
@@ -14,7 +14,7 @@ class ProcedureDashboard < Administrate::BaseDashboard
path: ProcedureLinkField,
dossiers: Field::HasMany,
gestionnaires: Field::HasMany,
- administrateur: Field::BelongsTo,
+ administrateurs: Field::HasMany,
id: Field::Number.with_options(searchable: true),
libelle: Field::String,
description: Field::String,
@@ -58,7 +58,7 @@ class ProcedureDashboard < Administrate::BaseDashboard
SHOW_PAGE_ATTRIBUTES = [
:id,
:path,
- :administrateur,
+ :administrateurs,
:libelle,
:description,
:lien_site_web,
diff --git a/app/models/administrateur.rb b/app/models/administrateur.rb
index b9bd5c5e5..26f998d20 100644
--- a/app/models/administrateur.rb
+++ b/app/models/administrateur.rb
@@ -7,9 +7,8 @@ class Administrateur < ApplicationRecord
:recoverable, :rememberable, :trackable, :validatable
has_and_belongs_to_many :gestionnaires
- has_many :procedures
has_many :administrateurs_procedures
- has_many :admin_procedures, through: :administrateurs_procedures, source: :procedure
+ has_many :procedures, through: :administrateurs_procedures
has_many :services
has_many :dossiers, -> { state_not_brouillon }, through: :procedures
@@ -117,7 +116,7 @@ class Administrateur < ApplicationRecord
end
def owns?(procedure)
- id == procedure.administrateur_id
+ procedure.administrateurs.include?(self)
end
def gestionnaire
diff --git a/app/models/dossier.rb b/app/models/dossier.rb
index 0b39fe4b2..c47c5c935 100644
--- a/app/models/dossier.rb
+++ b/app/models/dossier.rb
@@ -264,7 +264,7 @@ class Dossier < ApplicationRecord
update(hidden_at: deleted_dossier.deleted_at)
if en_construction?
- administration_emails = followers_gestionnaires.present? ? followers_gestionnaires.pluck(:email) : [procedure.administrateur.email]
+ administration_emails = followers_gestionnaires.present? ? followers_gestionnaires.pluck(:email) : procedure.administrateurs.pluck(:email)
administration_emails.each do |email|
DossierMailer.notify_deletion_to_administration(deleted_dossier, email).deliver_later
end
diff --git a/app/models/procedure.rb b/app/models/procedure.rb
index 4c97baefe..e1bb60838 100644
--- a/app/models/procedure.rb
+++ b/app/models/procedure.rb
@@ -1,6 +1,8 @@
require Rails.root.join('lib', 'percentile')
class Procedure < ApplicationRecord
+ self.ignored_columns = [:administrateur_id]
+
MAX_DUREE_CONSERVATION = 36
has_many :types_de_piece_justificative, -> { ordered }, dependent: :destroy
@@ -12,7 +14,6 @@ class Procedure < ApplicationRecord
has_one :module_api_carto, dependent: :destroy
has_one :attestation_template, dependent: :destroy
- belongs_to :administrateur
belongs_to :parent_procedure, class_name: 'Procedure'
belongs_to :service
@@ -48,7 +49,7 @@ class Procedure < ApplicationRecord
scope :for_api, -> {
includes(
- :administrateur,
+ :administrateurs,
:types_de_champ_private,
:types_de_champ,
:types_de_piece_justificative,
@@ -101,12 +102,12 @@ class Procedure < ApplicationRecord
end
end
- def publish_or_reopen!(path)
- if archivee? && may_reopen?(path)
- reopen!(path)
- elsif may_publish?(path)
+ def publish_or_reopen!(administrateur, path)
+ if archivee? && may_reopen?(administrateur, path)
+ reopen!(administrateur, path)
+ elsif may_publish?(administrateur, path)
reset!
- publish!(path)
+ publish!(administrateur, path)
end
end
@@ -220,7 +221,6 @@ class Procedure < ApplicationRecord
procedure.administrateurs = administrateurs
end
- procedure.administrateur = admin
procedure.initiated_mail = initiated_mail&.dup
procedure.received_mail = received_mail&.dup
procedure.closed_mail = closed_mail&.dup
@@ -340,7 +340,7 @@ class Procedure < ApplicationRecord
PATH_NOT_AVAILABLE_BROUILLON = :not_available_brouillon
PATH_CAN_PUBLISH = [PATH_AVAILABLE, PATH_AVAILABLE_PUBLIEE]
- def path_availability(path)
+ def path_availability(administrateur, path)
Procedure.path_availability(administrateur, path, id)
end
@@ -391,7 +391,9 @@ class Procedure < ApplicationRecord
private
def claim_path_ownership!(path)
- procedure = Procedure.where(administrateur: administrateur).find_by(path: path)
+ procedure = Procedure.joins(:administrateurs)
+ .where(administrateurs: { id: administrateur_ids })
+ .find_by(path: path)
if procedure&.publiee? && procedure != self
procedure.archive!
@@ -400,17 +402,21 @@ class Procedure < ApplicationRecord
update!(path: path)
end
- def can_publish?(path)
- path_availability(path).in?(PATH_CAN_PUBLISH)
+ def can_publish?(administrateur, path)
+ path_availability(administrateur, path).in?(PATH_CAN_PUBLISH)
end
- def after_publish(path)
+ def can_reopen?(administrateur, path)
+ path_availability(administrateur, path).in?(PATH_CAN_PUBLISH)
+ end
+
+ def after_publish(administrateur, path)
update!(published_at: Time.zone.now)
claim_path_ownership!(path)
end
- def after_reopen(path)
+ def after_reopen(administrateur, path)
update!(published_at: Time.zone.now, archived_at: nil)
claim_path_ownership!(path)
diff --git a/app/services/administrateur_usage_statistics_service.rb b/app/services/administrateur_usage_statistics_service.rb
index 5196ee227..e599d0d3b 100644
--- a/app/services/administrateur_usage_statistics_service.rb
+++ b/app/services/administrateur_usage_statistics_service.rb
@@ -109,7 +109,7 @@ class AdministrateurUsageStatisticsService
end
def nb_demarches_by_administrateur_id_and_state
- @nb_demarches_by_administrateur_id_and_state ||= with_default(0, Procedure.group(:administrateur_id, :aasm_state).count)
+ @nb_demarches_by_administrateur_id_and_state ||= with_default(0, Procedure.joins(:administrateurs).group('administrateurs.id', :aasm_state).count)
end
def nb_services_by_administrateur_id
@@ -128,9 +128,9 @@ class AdministrateurUsageStatisticsService
result = {}
Dossier
- .joins(:procedure)
+ .joins(procedure: [:administrateurs])
.group(
- :administrateur_id,
+ 'administrateurs.id',
:procedure_id,
<<~EOSQL
CASE
diff --git a/app/views/admin/procedures/new_from_existing.html.haml b/app/views/admin/procedures/new_from_existing.html.haml
index d30add299..a89acf5e6 100644
--- a/app/views/admin/procedures/new_from_existing.html.haml
+++ b/app/views/admin/procedures/new_from_existing.html.haml
@@ -27,4 +27,4 @@
%td
= link_to('Cloner', admin_procedure_clone_path(procedure.id, from_new_from_existing: true), 'data-method' => :put, class: 'btn-sm btn-primary clone-btn')
%td{ style: 'padding-left: 10px;' }
- = link_to('Contacter', "mailto:#{procedure.administrateur.email}")
+ = link_to('Contacter', "mailto:#{procedure.administrateurs.pluck(:email) * ","}")
diff --git a/app/views/administration_mailer/dubious_procedures.html.haml b/app/views/administration_mailer/dubious_procedures.html.haml
index a88ef60e9..8ab2bd288 100644
--- a/app/views/administration_mailer/dubious_procedures.html.haml
+++ b/app/views/administration_mailer/dubious_procedures.html.haml
@@ -13,6 +13,9 @@
Nombre de dossier : #{procedure.dossiers.count}
%br
Admin :
- = link_to "#{procedure.administrateur.email}", "mailto:#{procedure.administrateur.email}"
+ %ul
+ - procedure.administrateurs.each do |administrateur|
+ %li
+ = link_to "#{administrateur.email}", "mailto:#{administrateur.email}"
- else
Il n'y a aucune démarche douteuse aujourd'hui
diff --git a/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml b/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml
index 2ea313693..3fa249331 100644
--- a/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml
+++ b/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml
@@ -21,7 +21,7 @@
.procedure-list-element{ class: ('active' if active == 'Description') }
Description
- %a#onglet-services{ href: current_administrateur.services.present? ? url_for(services_path(procedure_id: @procedure.id)) : url_for(new_service_path(procedure_id: @procedure.id)) }
+ %a#onglet-services{ href: (@procedure.service.present? || current_administrateur.services.present?) ? url_for(services_path(procedure_id: @procedure.id)) : url_for(new_service_path(procedure_id: @procedure.id)) }
.procedure-list-element
Service
- if @procedure.missing_steps.include?(:service)
diff --git a/app/views/manager/procedures/show.html.erb b/app/views/manager/procedures/show.html.erb
index 908b0e2bf..be61830b1 100644
--- a/app/views/manager/procedures/show.html.erb
+++ b/app/views/manager/procedures/show.html.erb
@@ -58,8 +58,15 @@ as well as a link to its edit page.
) %>
-
<%= render_field attribute, page: page %>
+
+ <%= render_field attribute, page: page %>
+ <% if attribute.name == 'administrateurs' %>
+ <%= form_tag(add_administrateur_manager_procedure_path(procedure), style: 'margin-top: 1rem;') do %>
+ <%= email_field_tag(:email, '', placeholder: 'Email', autocapitalize: 'off', autocorrect: 'off', spellcheck: 'false', style: 'margin-bottom: 1rem;width:24rem;') %>
+
+ <% end %>
+ <% end %>
+
<% end %>
diff --git a/app/views/new_administrateur/services/index.html.haml b/app/views/new_administrateur/services/index.html.haml
index 28ab6d9df..486fb7269 100644
--- a/app/views/new_administrateur/services/index.html.haml
+++ b/app/views/new_administrateur/services/index.html.haml
@@ -9,7 +9,7 @@
= form_for @procedure, url: { controller: "new_administrateur/services", action: :add_to_procedure } , html: { class: 'form' } do |f|
= f.label :service_id, "La démarche #{@procedure.libelle} est affectée au service"
= f.select :service_id,
- current_administrateur.services.map { |s| [ s.nom, s.id ] },
+ @services.map { |s| [ s.nom, s.id ] },
{ prompt: 'choisir un service', selected: @procedure.service&.id },
required: true
diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml
index 6fa52eb8f..5469e3a2d 100644
--- a/app/views/root/landing.html.haml
+++ b/app/views/root/landing.html.haml
@@ -43,7 +43,7 @@
%ul.numbers
%li.number
.number-value
- = number_with_delimiter(Procedure.includes(:administrateur).publiees_ou_archivees.map(&:administrateur).uniq.count, :locale => :fr)
+ = number_with_delimiter(Procedure.includes(:administrateurs).publiees_ou_archivees.flat_map(&:administrateurs).uniq.count, :locale => :fr)
.number-label<
administrations
%br<>
diff --git a/app/views/stats/index.html.haml b/app/views/stats/index.html.haml
index fc10a6309..c8e9d21ec 100644
--- a/app/views/stats/index.html.haml
+++ b/app/views/stats/index.html.haml
@@ -84,15 +84,6 @@
.chart.cumulative-dossiers-chart.hidden
= area_chart @dossiers_cumulative
- .stat-card.stat-card-half.pull-left
- %span.stat-card-title
- Nombre d'administrations ayant dématérialisé N démarches
-
- .chart-container
- .chart
- = pie_chart @procedures_count_per_administrateur,
- colors: ["rgba(191, 220, 249, 1)", "rgba(113, 176, 239, 1)", "rgba(61, 149, 236, 1)"]
-
- if administration_signed_in?
.stat-card.stat-card-half.pull-left
%span.stat-card-title Temps de traitement moyen d'un dossier
diff --git a/config/routes.rb b/config/routes.rb
index 7f27cfb24..ddb0e18d5 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -10,6 +10,7 @@ Rails.application.routes.draw do
post 'whitelist', on: :member
post 'draft', on: :member
post 'hide', on: :member
+ post 'add_administrateur', on: :member
end
resources :dossiers, only: [:index, :show] do
diff --git a/lib/tasks/2018_07_31_nutriscore.rake b/lib/tasks/2018_07_31_nutriscore.rake
deleted file mode 100644
index f574175c8..000000000
--- a/lib/tasks/2018_07_31_nutriscore.rake
+++ /dev/null
@@ -1,106 +0,0 @@
-require Rails.root.join("lib", "tasks", "task_helper")
-
-namespace :'2018_07_31_nutriscore' do
- task migrate_dossiers: :environment do
- source_procedure_id = ENV['SOURCE_PROCEDURE_ID'] || 4861
- destination_procedure_id = ENV['DESTINATION_PROCEDURE_ID'] || 7009
-
- source_procedure = Procedure.find(source_procedure_id)
- destination_procedure = Procedure.find(destination_procedure_id)
-
- mapping = Class.new(Tasks::DossierProcedureMigrator::ChampMapping) do
- def setup_mapping
- siret_order_place = 2
- fonction_order_place = 9
- zone_geographique_header_order_place = 18
- pays_commercialisation_order_place = 19
- header_engagement_order_place = 20
-
- champ_opts = { header_engagement_order_place => { source_overrides: { 'libelle' => 'PARTIE 3 : ENGAGEMENT DE L’EXPLOITANT' }, destination_overrides: { 'libelle' => 'PARTIE 4 : ENGAGEMENT DE L’EXPLOITANT' } } }
-
- pays_drop_down_values = "FRANCE\r\nACORES, MADERE\r\nAFGHANISTAN\r\nAFRIQUE DU SUD\r\nALASKA\r\nALBANIE\r\nALGERIE\r\nALLEMAGNE\r\nANDORRE\r\nANGOLA\r\nANGUILLA\r\nANTIGUA-ET-BARBUDA\r\nANTILLES NEERLANDAISES\r\nARABIE SAOUDITE\r\nARGENTINE\r\nARMENIE\r\nARUBA\r\nAUSTRALIE\r\nAUTRICHE\r\nAZERBAIDJAN\r\nBAHAMAS\r\nBAHREIN\r\nBANGLADESH\r\nBARBADE\r\nBELGIQUE\r\nBELIZE\r\nBENIN\r\nBERMUDES\r\nBHOUTAN\r\nBIELORUSSIE\r\nBIRMANIE\r\nBOLIVIE\r\nBONAIRE, SAINT EUSTACHE ET SABA\r\nBOSNIE-HERZEGOVINE\r\nBOTSWANA\r\nBOUVET (ILE)\r\nBRESIL\r\nBRUNEI\r\nBULGARIE\r\nBURKINA\r\nBURUNDI\r\nCAIMANES (ILES)\r\nCAMBODGE\r\nCAMEROUN\r\nCAMEROUN ET TOGO\r\nCANADA\r\nCANARIES (ILES)\r\nCAP-VERT\r\nCENTRAFRICAINE (REPUBLIQUE)\r\nCHILI\r\nCHINE\r\nCHRISTMAS (ILE)\r\nCHYPRE\r\nCLIPPERTON (ILE)\r\nCOCOS ou KEELING (ILES)\r\nCOLOMBIE\r\nCOMORES\r\nCONGO\r\nCONGO (REPUBLIQUE DEMOCRATIQUE)\r\nCOOK (ILES)\r\nCOREE\r\nCOREE (REPUBLIQUE DE)\r\nCOREE (REPUBLIQUE POPULAIRE DEMOCRATIQUE DE)\r\nCOSTA RICA\r\nCOTE D'IVOIRE\r\nCROATIE\r\nCUBA\r\nCURAÇAO\r\nDANEMARK\r\nDJIBOUTI\r\nDOMINICAINE (REPUBLIQUE)\r\nDOMINIQUE\r\nEGYPTE\r\nEL SALVADOR\r\nEMIRATS ARABES UNIS\r\nEQUATEUR\r\nERYTHREE\r\nESPAGNE\r\nESTONIE\r\nETATS MALAIS NON FEDERES\r\nETATS-UNIS\r\nETHIOPIE\r\nFEROE (ILES)\r\nFIDJI\r\nFINLANDE\r\nGABON\r\nGAMBIE\r\nGEORGIE\r\nGEORGIE DU SUD ET LES ILES SANDWICH DU SUD\r\nGHANA\r\nGIBRALTAR\r\nGOA\r\nGRECE\r\nGRENADE\r\nGROENLAND\r\nGUADELOUPE\r\nGUAM\r\nGUATEMALA\r\nGUERNESEY\r\nGUINEE\r\nGUINEE EQUATORIALE\r\nGUINEE-BISSAU\r\nGUYANA\r\nGUYANE\r\nHAITI\r\nHAWAII (ILES)\r\nHEARD ET MACDONALD (ILES)\r\nHONDURAS\r\nHONG-KONG\r\nHONGRIE\r\nILES PORTUGAISES DE L'OCEAN INDIEN\r\nINDE\r\nINDONESIE\r\nIRAN\r\nIRAQ\r\nIRLANDE, ou EIRE\r\nISLANDE\r\nISRAEL\r\nITALIE\r\nJAMAIQUE\r\nJAPON\r\nJERSEY\r\nJORDANIE\r\nKAMTCHATKA\r\nKAZAKHSTAN\r\nKENYA\r\nKIRGHIZISTAN\r\nKIRIBATI\r\nKOSOVO\r\nKOWEIT\r\nLA REUNION\r\nLABRADOR\r\nLAOS\r\nLESOTHO\r\nLETTONIE\r\nLIBAN\r\nLIBERIA\r\nLIBYE\r\nLIECHTENSTEIN\r\nLITUANIE\r\nLUXEMBOURG\r\nMACAO\r\nMACEDOINE DU NORD (REPUBLIQUE DE)\r\nMADAGASCAR\r\nMALAISIE\r\nMALAWI\r\nMALDIVES\r\nMALI\r\nMALOUINES, OU FALKLAND (ILES)\r\nMALTE\r\nMAN (ILE)\r\nMANDCHOURIE\r\nMARIANNES DU NORD (ILES)\r\nMAROC\r\nMARSHALL (ILES)\r\nMARTINIQUE\r\nMAURICE\r\nMAURITANIE\r\nMAYOTTE\r\nMEXIQUE\r\nMICRONESIE (ETATS FEDERES DE)\r\nMOLDAVIE\r\nMONACO\r\nMONGOLIE\r\nMONTENEGRO\r\nMONTSERRAT\r\nMOZAMBIQUE\r\nNAMIBIE\r\nNAURU\r\nNEPAL\r\nNICARAGUA\r\nNIGER\r\nNIGERIA\r\nNIUE\r\nNORFOLK (ILE)\r\nNORVEGE\r\nNOUVELLE-CALEDONIE\r\nNOUVELLE-ZELANDE\r\nOCEAN INDIEN (TERRITOIRE BRITANNIQUE DE L')\r\nOMAN\r\nOUGANDA\r\nOUZBEKISTAN\r\nPAKISTAN\r\nPALAOS (ILES)\r\nPALESTINE (Etat de)\r\nPANAMA\r\nPAPOUASIE-NOUVELLE-GUINEE\r\nPARAGUAY\r\nPAYS-BAS\r\nPEROU\r\nPHILIPPINES\r\nPITCAIRN (ILE)\r\nPOLOGNE\r\nPOLYNESIE FRANCAISE\r\nPORTO RICO\r\nPORTUGAL\r\nPOSSESSIONS BRITANNIQUES AU PROCHE-ORIENT\r\nPRESIDES\r\nPROVINCES ESPAGNOLES D'AFRIQUE\r\nQATAR\r\nREPUBLIQUE DEMOCRATIQUE ALLEMANDE\r\nREPUBLIQUE FEDERALE D'ALLEMAGNE\r\nROUMANIE\r\nROYAUME-UNI\r\nRUSSIE\r\nRWANDA\r\nSAHARA OCCIDENTAL\r\nSAINT-BARTHELEMY\r\nSAINT-CHRISTOPHE-ET-NIEVES\r\nSAINT-MARIN\r\nSAINT-MARTIN\r\nSAINT-MARTIN (PARTIE NEERLANDAISE)\r\nSAINT-PIERRE-ET-MIQUELON\r\nSAINT-VINCENT-ET-LES GRENADINES\r\nSAINTE HELENE, ASCENSION ET TRISTAN DA CUNHA\r\nSAINTE-LUCIE\r\nSALOMON (ILES)\r\nSAMOA AMERICAINES\r\nSAMOA OCCIDENTALES\r\nSAO TOME-ET-PRINCIPE\r\nSENEGAL\r\nSERBIE\r\nSEYCHELLES\r\nSIBERIE\r\nSIERRA LEONE\r\nSINGAPOUR\r\nSLOVAQUIE\r\nSLOVENIE\r\nSOMALIE\r\nSOUDAN\r\nSOUDAN ANGLO-EGYPTIEN, KENYA, OUGANDA\r\nSOUDAN DU SUD\r\nSRI LANKA\r\nSUEDE\r\nSUISSE\r\nSURINAME\r\nSVALBARD et ILE JAN MAYEN\r\nSWAZILAND\r\nSYRIE\r\nTADJIKISTAN\r\nTAIWAN\r\nTANGER\r\nTANZANIE\r\nTCHAD\r\nTCHECOSLOVAQUIE\r\nTCHEQUE (REPUBLIQUE)\r\nTERR. DES ETATS-UNIS D'AMERIQUE EN AMERIQUE\r\nTERR. DES ETATS-UNIS D'AMERIQUE EN OCEANIE\r\nTERR. DU ROYAUME-UNI DANS L'ATLANTIQUE SUD\r\nTERRE-NEUVE\r\nTERRES AUSTRALES FRANCAISES\r\nTERRITOIRES DU ROYAUME-UNI AUX ANTILLES\r\nTHAILANDE\r\nTIMOR ORIENTAL\r\nTOGO\r\nTOKELAU\r\nTONGA\r\nTRINITE-ET-TOBAGO\r\nTUNISIE\r\nTURKESTAN RUSSE\r\nTURKMENISTAN\r\nTURKS ET CAIQUES (ILES)\r\nTURQUIE\r\nTURQUIE D'EUROPE\r\nTUVALU\r\nUKRAINE\r\nURUGUAY\r\nVANUATU\r\nVATICAN, ou SAINT-SIEGE\r\nVENEZUELA\r\nVIERGES BRITANNIQUES (ILES)\r\nVIERGES DES ETATS-UNIS (ILES)\r\nVIET NAM\r\nVIET NAM DU NORD\r\nVIET NAM DU SUD\r\nWALLIS-ET-FUTUNA\r\nYEMEN\r\nYEMEN (REPUBLIQUE ARABE DU)\r\nYEMEN DEMOCRATIQUE\r\nZAMBIE\r\nZANZIBAR\r\nZIMBABWE"
-
- ((0..(zone_geographique_header_order_place - 1)).to_a - [siret_order_place, fonction_order_place]).each do |i|
- map_source_to_destination_champ(i, i, **(champ_opts[i] || {}))
- end
-
- ((pays_commercialisation_order_place + 1)..25).each do |i|
- map_source_to_destination_champ(i - 2, i, **(champ_opts[i] || {}))
- end
-
- discard_source_champ(
- TypeDeChamp.new(
- type_champ: 'text',
- order_place: siret_order_place,
- libelle: 'Numéro SIRET'
- )
- )
-
- discard_source_champ(
- TypeDeChamp.new(
- type_champ: 'text',
- order_place: fonction_order_place,
- libelle: 'Fonction'
- )
- )
-
- compute_destination_champ(
- TypeDeChamp.new(
- type_champ: 'text',
- order_place: fonction_order_place,
- libelle: 'Fonction',
- mandatory: true
- )
- ) do |d, target_tdc|
- c = d.champs.joins(:type_de_champ).find_by(types_de_champ: { order_place: fonction_order_place })
-
- target_tdc.champ.create(
- value: c&.value || 'Non renseigné',
- dossier: d
- )
- end
-
- compute_destination_champ(
- TypeDeChamp.new(
- type_champ: 'siret',
- order_place: siret_order_place,
- libelle: 'Numéro SIRET'
- )
- ) do |d, target_tdc|
- if d.etablissement.present?
- d.etablissement.signature = d.etablissement.sign
- end
- target_tdc.champ.create(
- value: d.etablissement&.siret,
- etablissement: d.etablissement,
- dossier: d
- )
- end
-
- compute_destination_champ(
- TypeDeChamp.new(
- type_champ: 'header_section',
- order_place: 18,
- libelle: 'PARTIE 3 : ZONE GEOGRAPHIQUE'
- )
- ) do |d, target_tdc|
- target_tdc.champ.create(dossier: d)
- end
-
- compute_destination_champ(
- TypeDeChamp.new(
- type_champ: 'multiple_drop_down_list',
- order_place: 19,
- libelle: 'Pays de commercialisation',
- drop_down_list: DropDownList.new(value: pays_drop_down_values)
- )
- ) do |d, target_tdc|
- target_tdc.champ.create(dossier: d, value: JSON.unparse(['FRANCE']))
- end
- end
- end
-
- Tasks::DossierProcedureMigrator.new(source_procedure, destination_procedure, mapping).migrate_procedure
- AutoReceiveDossiersForProcedureJob.set(cron: "* * * * *").perform_later(destination_procedure_id, 'accepte')
- end
-end
diff --git a/lib/tasks/2019_01_16_fix_automatic_dossier_logs.rake b/lib/tasks/2019_01_16_fix_automatic_dossier_logs.rake
deleted file mode 100644
index e4039fa77..000000000
--- a/lib/tasks/2019_01_16_fix_automatic_dossier_logs.rake
+++ /dev/null
@@ -1,61 +0,0 @@
-class FixAutomaticDossierLogs_2019_01_16
- def find_handlers
- # rubocop:disable Security/YAMLLoad
- Delayed::Job.where(queue: 'cron')
- .map { |job| YAML.load(job.handler) }
- .select { |handler| handler.job_data['job_class'] == 'AutoReceiveDossiersForProcedureJob' }
- # rubocop:enable Security/YAMLLoad
- end
-
- def run
- handlers = find_handlers
-
- handlers
- .map { |handler| handler.job_data['arguments'] }
- .each do |(procedure_id, state)|
-
- procedure = Procedure
- .includes(:administrateur, dossiers: [:dossier_operation_logs, :follows])
- .find(procedure_id)
-
- rake_puts "working on procedure #{procedure_id}, #{procedure.libelle} whose admin is #{procedure.administrateur.email}"
-
- case state
- when Dossier.states.fetch(:en_instruction)
- dossiers = procedure.dossiers.state_en_instruction
- operation = 'passer_en_instruction'
- when Dossier.states.fetch(:accepte)
- dossiers = procedure.dossiers.accepte
- operation = 'accepter'
- end
-
- dossier_operation_logs = DossierOperationLog
- .where(dossier: dossiers, operation: operation)
-
- rake_puts "affecting #{dossier_operation_logs.count} dossier_operation_logs"
-
- dossier_operation_logs
- .update_all(gestionnaire_id: nil, automatic_operation: true)
-
- # if the dossier is only followed by the procedure administrateur
- # unfollow
- if state == Dossier.states.fetch(:en_instruction)
- dossier_to_unfollows = dossiers
- .select { |d| d.follows.count == 1 && d.follows.first.gestionnaire.email == procedure.administrateur.email }
-
- rake_puts "affecting #{dossier_to_unfollows.count} dossiers"
-
- dossier_to_unfollows
- .each { |d| d.follows.destroy_all }
- end
-
- rake_puts ""
- end
- end
-end
-
-namespace :'2019_01_16_fix_automatic_dossier_logs' do
- task run: :environment do
- FixAutomaticDossierLogs_2019_01_16.new.run
- end
-end
diff --git a/lib/tasks/deployment/20181219164523_clone_service_for_transferred_procedures.rake b/lib/tasks/deployment/20181219164523_clone_service_for_transferred_procedures.rake
deleted file mode 100644
index 25d40b2c2..000000000
--- a/lib/tasks/deployment/20181219164523_clone_service_for_transferred_procedures.rake
+++ /dev/null
@@ -1,37 +0,0 @@
-require Rails.root.join("lib", "tasks", "task_helper")
-
-namespace :after_party do
- desc 'Deployment task: clone_service_for_transferred_procedures'
- task clone_service_for_transferred_procedures: :environment do
- rake_puts "Running deploy task 'clone_service_for_transferred_procedures'"
-
- procedures = Procedure.includes(:service).where.not(service_id: nil)
- procedures_to_fix_in_array = procedures.select do |p|
- p.administrateur_id != p.service.administrateur_id
- end
- procedures_to_fix = Procedure.where(id: procedures_to_fix_in_array.map(&:id))
-
- service_and_admin_list = procedures_to_fix.group(:service_id, :administrateur_id).count.keys
- progress = ProgressReport.new(service_and_admin_list.count)
-
- service_and_admin_list.each do |service_id, administrateur_id|
- cloned_service = Service.find(service_id).clone_and_assign_to_administrateur(Administrateur.find(administrateur_id))
-
- if cloned_service.save
- rake_puts "Fixing Service #{service_id} for Administrateur #{administrateur_id}"
- procedures_to_fix
- .where(service_id: service_id, administrateur_id: administrateur_id)
- .update_all(service_id: cloned_service.id)
- else
- rake_puts "Cannot fix Service #{service_id} for Administrateur #{administrateur_id}, it should be fixed manually. Errors : #{cloned_service.errors.full_messages}"
- end
- progress.inc
- end
-
- progress.finish
-
- # Update task as completed. If you remove the line below, the task will
- # run with every deploy (or every time you call after_party:run).
- AfterParty::TaskRecord.create version: '20181219164523'
- end # task :clone_service_for_transferred_procedures
-end # namespace :after_party
diff --git a/lib/tasks/dossier_procedure_migrator.rb b/lib/tasks/dossier_procedure_migrator.rb
index 0d5a57073..beb26e049 100644
--- a/lib/tasks/dossier_procedure_migrator.rb
+++ b/lib/tasks/dossier_procedure_migrator.rb
@@ -260,8 +260,8 @@ module Tasks
end
def check_same_administrateur
- if @source_procedure.administrateur != @destination_procedure.administrateur
- raise "Mismatching administrateurs #{@source_procedure.administrateur&.email} → #{@destination_procedure.administrateur&.email}"
+ if @source_procedure.administrateur_ids.sort != @destination_procedure.administrateur_ids.sort
+ raise "Mismatching administrateurs #{@source_procedure.administrateurs.pluck(:email)} → #{@destination_procedure.administrateurs.pluck(:email)}"
end
end
diff --git a/lib/tasks/support.rake b/lib/tasks/support.rake
index fe2996198..9cdb35adb 100644
--- a/lib/tasks/support.rake
+++ b/lib/tasks/support.rake
@@ -1,82 +1,6 @@
require Rails.root.join("lib", "tasks", "task_helper")
namespace :support do
- desc <<~EOD
- Give procedure #PROCEDURE_ID a new owner.
- The new owner can be specified with NEW_OWNER_ID or NEW_OWNER_EMAIL.
- EOD
- task transfer_procedure_ownership: :environment do
- new_owner_id = ENV['NEW_OWNER_ID']
- new_owner_email = ENV['NEW_OWNER_EMAIL']
-
- new_owner = nil
- if new_owner_id.present?
- rake_puts("Looking for new owner by id\n")
- new_owner = Administrateur.find(new_owner_id)
- elsif new_owner_email.present?
- rake_puts("Looking for new owner by email\n")
- new_owner = Administrateur.find_by('LOWER(email) = LOWER(?)', new_owner_email)
- end
-
- if new_owner.blank?
- fail "Must specify a new owner"
- end
-
- procedure_id = ENV['PROCEDURE_ID']
- procedure = Procedure.find(procedure_id)
-
- rake_puts("Changing owner of procedure ##{procedure_id} from ##{procedure.administrateur_id} to ##{new_owner.id}")
- procedure.administrateurs.delete(procedure.administrateur)
- procedure.administrateurs << new_owner
- procedure.update(administrateur: new_owner)
- end
-
- desc <<~EOD
- Give all procedures owned by OLD_OWNER_ID or OLD_OWNER_EMAIL a new owner.
- The new owner can be specified with NEW_OWNER_ID or NEW_OWNER_EMAIL.
- EOD
- task transfer_all_procedures_ownership: :environment do
- old_owner_id = ENV['OLD_OWNER_ID']
- old_owner_email = ENV['OLD_OWNER_EMAIL']
- new_owner_id = ENV['NEW_OWNER_ID']
- new_owner_email = ENV['NEW_OWNER_EMAIL']
-
- old_owner = nil
-
- if old_owner_id.present?
- rake_puts("Looking for old owner by id\n")
- old_owner = Administrateur.find(old_owner_id)
- elsif old_owner_email.present?
- rake_puts("Looking for old owner by email\n")
- old_owner = Administrateur.find_by('LOWER(email) = LOWER(?)', old_owner_email)
- end
-
- if old_owner.blank?
- fail "Must specify an old owner"
- end
-
- procedures = old_owner.procedures
-
- new_owner = nil
- if new_owner_id.present?
- rake_puts("Looking for new owner by id\n")
- new_owner = Administrateur.find(new_owner_id)
- elsif new_owner_email.present?
- rake_puts("Looking for new owner by email\n")
- new_owner = Administrateur.find_by('LOWER(email) = LOWER(?)', new_owner_email)
- end
-
- if new_owner.blank?
- fail "Must specify a new owner"
- end
-
- procedures.each do |procedure|
- procedure.administrateurs.delete(procedure.administrateur)
- procedure.administrateurs << new_owner
- end
- procedures.update_all(administrateur_id: new_owner.id)
- end
-
desc <<~EOD
Delete the user account for a given USER_EMAIL.
Only works if the user has no dossier where the instruction has started.
diff --git a/spec/controllers/admin/mail_templates_controller_spec.rb b/spec/controllers/admin/mail_templates_controller_spec.rb
index 81a24a6da..e9c35576f 100644
--- a/spec/controllers/admin/mail_templates_controller_spec.rb
+++ b/spec/controllers/admin/mail_templates_controller_spec.rb
@@ -5,7 +5,7 @@ describe Admin::MailTemplatesController, type: :controller do
let(:initiated_mail) { Mails::InitiatedMail.default_for_procedure(procedure) }
before do
- sign_in procedure.administrateur
+ sign_in procedure.administrateurs.first
end
describe 'GET index' do
diff --git a/spec/controllers/admin/procedures_controller_spec.rb b/spec/controllers/admin/procedures_controller_spec.rb
index 9bc8a6421..c38ebe6af 100644
--- a/spec/controllers/admin/procedures_controller_spec.rb
+++ b/spec/controllers/admin/procedures_controller_spec.rb
@@ -40,7 +40,8 @@ describe Admin::ProceduresController, type: :controller do
describe 'GET #index with sorting and pagination' do
before do
- admin.procedures << create(:procedure, administrateur: admin)
+ create(:procedure, administrateur: admin)
+ admin.reload
end
subject {
@@ -196,7 +197,6 @@ describe Admin::ProceduresController, type: :controller do
it { expect(subject.description).to eq(description) }
it { expect(subject.organisation).to eq(organisation) }
it { expect(subject.direction).to eq(direction) }
- it { expect(subject.administrateur_id).to eq(admin.id) }
it { expect(subject.administrateurs).to eq([admin]) }
it { expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) }
it { expect(subject.duree_conservation_dossiers_hors_ds).to eq(duree_conservation_dossiers_hors_ds) }
@@ -636,7 +636,7 @@ describe Admin::ProceduresController, type: :controller do
subject
end
- it { expect(Procedure.last.administrateur).to eq new_admin }
+ it { expect(Procedure.last.administrateurs).to eq [new_admin] }
end
end
end
diff --git a/spec/controllers/api_controller_spec.rb b/spec/controllers/api_controller_spec.rb
index 6898fe2cb..c9647022e 100644
--- a/spec/controllers/api_controller_spec.rb
+++ b/spec/controllers/api_controller_spec.rb
@@ -1,10 +1,11 @@
require 'spec_helper'
describe APIController, type: :controller do
- describe 'valid_token_for_administrateur?' do
- let!(:admin) { create(:administrateur) }
+ describe 'valid_token_for_procedure?' do
+ let(:procedure) { create(:procedure) }
+ let(:admin) { procedure.administrateurs.first }
- subject { controller.send(:'valid_token_for_administrateur?', admin) }
+ subject { controller.send(:'valid_token_for_procedure?', procedure) }
context 'when the admin has not any token' do
context 'and the token is not given' do
diff --git a/spec/controllers/new_user/dossiers_controller_spec.rb b/spec/controllers/new_user/dossiers_controller_spec.rb
index 198934abb..a981b85b9 100644
--- a/spec/controllers/new_user/dossiers_controller_spec.rb
+++ b/spec/controllers/new_user/dossiers_controller_spec.rb
@@ -815,7 +815,7 @@ describe NewUser::DossiersController, type: :controller do
let(:dossier) { create(:dossier, :en_construction, user: user, autorisation_donnees: true) }
it "notifies the user and the admin of the deletion" do
- expect(DossierMailer).to receive(:notify_deletion_to_administration).with(kind_of(DeletedDossier), dossier.procedure.administrateur.email).and_return(double(deliver_later: nil))
+ expect(DossierMailer).to receive(:notify_deletion_to_administration).with(kind_of(DeletedDossier), dossier.procedure.administrateurs.first.email).and_return(double(deliver_later: nil))
expect(DossierMailer).to receive(:notify_deletion_to_user).with(kind_of(DeletedDossier), dossier.user.email).and_return(double(deliver_later: nil))
subject
end
diff --git a/spec/controllers/stats_controller_spec.rb b/spec/controllers/stats_controller_spec.rb
index 27d9ceb26..ade3ada20 100644
--- a/spec/controllers/stats_controller_spec.rb
+++ b/spec/controllers/stats_controller_spec.rb
@@ -93,42 +93,6 @@ describe StatsController, type: :controller do
end
end
- describe "#procedures_count_per_administrateur" do
- let!(:administrateur_1) { create(:administrateur) }
- let!(:administrateur_2) { create(:administrateur) }
- let!(:administrateur_3) { create(:administrateur) }
- let!(:administrateur_4) { create(:administrateur) }
- let!(:administrateur_5) { create(:administrateur) }
-
- before do
- 3.times do
- create(:procedure, published_at: Time.zone.now, administrateur: administrateur_1)
- end
-
- 2.times do
- create(:procedure, published_at: Time.zone.now, administrateur: administrateur_2)
- end
-
- 8.times do
- create(:procedure, published_at: Time.zone.now, administrateur: administrateur_3)
- end
-
- create(:procedure, published_at: Time.zone.now, administrateur: administrateur_4)
- end
-
- let(:association) { Procedure.all }
-
- subject { StatsController.new.send(:procedures_count_per_administrateur, association) }
-
- it do
- is_expected.to eq({
- 'Une démarche' => 1,
- 'Entre deux et cinq démarches' => 2,
- 'Plus de cinq démarches' => 1
- })
- end
- end
-
describe "#dossier_instruction_mean_time" do
# Month-2: mean 3 days
# procedure_1: mean 2 days
diff --git a/spec/factories/administrateur.rb b/spec/factories/administrateur.rb
index fc9a93a2f..17722a9f4 100644
--- a/spec/factories/administrateur.rb
+++ b/spec/factories/administrateur.rb
@@ -23,7 +23,8 @@ FactoryBot.define do
trait :with_procedure do
after(:create) do |admin|
- admin.procedures << create(:simple_procedure, administrateur: admin)
+ create(:simple_procedure, administrateur: admin)
+ admin.reload
end
end
end
diff --git a/spec/factories/procedure.rb b/spec/factories/procedure.rb
index e58849594..e45f1c2aa 100644
--- a/spec/factories/procedure.rb
+++ b/spec/factories/procedure.rb
@@ -7,13 +7,20 @@ FactoryBot.define do
direction { "direction DINSIC" }
cadre_juridique { "un cadre juridique important" }
published_at { nil }
- administrateur { create(:administrateur) }
duree_conservation_dossiers_dans_ds { 3 }
duree_conservation_dossiers_hors_ds { 6 }
ask_birthday { false }
- after(:build) do |procedure|
- procedure.administrateurs = [procedure.administrateur]
+ transient do
+ administrateur {}
+ end
+
+ after(:build) do |procedure, evaluator|
+ if evaluator.administrateur
+ procedure.administrateurs = [evaluator.administrateur]
+ elsif procedure.administrateurs.empty?
+ procedure.administrateurs = [create(:administrateur)]
+ end
end
factory :procedure_with_dossiers do
@@ -30,7 +37,7 @@ FactoryBot.define do
after(:build) do |procedure, _evaluator|
procedure.for_individual = true
procedure.types_de_champ << create(:type_de_champ, libelle: 'Texte obligatoire', mandatory: true)
- procedure.publish!(generate(:published_path))
+ procedure.publish!(procedure.administrateurs.first, generate(:published_path))
end
end
@@ -128,13 +135,13 @@ FactoryBot.define do
trait :published do
after(:build) do |procedure, _evaluator|
- procedure.publish!(generate(:published_path))
+ procedure.publish!(procedure.administrateurs.first, generate(:published_path))
end
end
trait :archived do
after(:build) do |procedure, _evaluator|
- procedure.publish!(generate(:published_path))
+ procedure.publish!(procedure.administrateurs.first, generate(:published_path))
procedure.archive!
end
end
@@ -143,14 +150,14 @@ FactoryBot.define do
# For now the behavior is the same than :archived
# (it may be different in the future though)
after(:build) do |procedure, _evaluator|
- procedure.publish!(generate(:published_path))
+ procedure.publish!(procedure.administrateurs.first, generate(:published_path))
procedure.archive!
end
end
trait :hidden do
after(:build) do |procedure, _evaluator|
- procedure.publish!(generate(:published_path))
+ procedure.publish!(procedure.administrateurs.first, generate(:published_path))
procedure.hide!
end
end
diff --git a/spec/features/new_administrateur/types_de_champ_spec.rb b/spec/features/new_administrateur/types_de_champ_spec.rb
index 801f3c070..4fae3e30b 100644
--- a/spec/features/new_administrateur/types_de_champ_spec.rb
+++ b/spec/features/new_administrateur/types_de_champ_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
feature 'As an administrateur I can edit types de champ', js: true do
- let(:administrateur) { procedure.administrateur }
+ let(:administrateur) { procedure.administrateurs.first }
let(:procedure) { create(:procedure) }
before do
diff --git a/spec/lib/tasks/2018_07_31_nutriscore_spec.rb b/spec/lib/tasks/2018_07_31_nutriscore_spec.rb
deleted file mode 100644
index 7ce3ff97b..000000000
--- a/spec/lib/tasks/2018_07_31_nutriscore_spec.rb
+++ /dev/null
@@ -1,126 +0,0 @@
-require 'spec_helper'
-
-describe '2018_07_31_nutriscore' do
- let(:gestionnaire) { create(:gestionnaire) }
- let(:proc_from) do
- proc_from = create(:procedure, :published)
- ((0..23).to_a - [1, 2, 9, 18]).each do |i|
- proc_from.types_de_champ << create(:type_de_champ_text, order_place: i, procedure: proc_from)
- end
- proc_from.types_de_champ << create(:type_de_champ_text, order_place: 9, libelle: 'Fonction', procedure: proc_from)
- proc_from.types_de_champ << create(:type_de_champ_header_section, order_place: 18, libelle: 'PARTIE 3 : ENGAGEMENT DE L’EXPLOITANT', procedure: proc_from)
- proc_from.save
- proc_from
- end
- let!(:type_champ_from) { create(:type_de_champ_textarea, order_place: 1, libelle: 'texte', procedure: proc_from) }
- let!(:type_champ_siret_from) { create(:type_de_champ_text, order_place: 2, libelle: 'Numéro SIRET', procedure: proc_from) }
- let!(:type_champ_fonction_from) {}
-
- let(:etablissement) { create(:etablissement) }
- let!(:dossier) { create(:dossier, procedure: proc_from, etablissement: etablissement) }
-
- let(:proc_to) do
- proc_to = create(:procedure, administrateur: proc_from.administrateur)
- ((0..17).to_a - [1, 2, 9]).each do |i|
- libelle = proc_from.types_de_champ.find_by(order_place: i).libelle
- proc_to.types_de_champ << create(:type_de_champ_text, order_place: i, libelle: libelle, procedure: proc_to)
- end
- proc_to.types_de_champ << create(:type_de_champ_header_section, order_place: 18, libelle: 'PARTIE 3 : ZONE GEOGRAPHIQUE', procedure: proc_to)
- proc_to.types_de_champ << create(
- :type_de_champ_multiple_drop_down_list,
- order_place: 19,
- libelle: 'Pays de commercialisation',
- drop_down_list: create(:drop_down_list, value: (Champs::PaysChamp.pays - ['----']).join("\r\n")),
- procedure: proc_to
- )
- proc_to.types_de_champ << create(:type_de_champ_header_section, order_place: 20, libelle: 'PARTIE 4 : ENGAGEMENT DE L’EXPLOITANT', procedure: proc_to)
- (21..25).each do |i|
- libelle = proc_from.types_de_champ.find_by(order_place: i - 2).libelle
- proc_to.types_de_champ << create(:type_de_champ_text, order_place: i, libelle: libelle, procedure: proc_to)
- end
- proc_to.save
- proc_to
- end
- let!(:type_champ_to) { create(:type_de_champ_textarea, order_place: 1, libelle: 'texte', procedure: proc_to) }
- let!(:type_champ_siret_to) { create(:type_de_champ_siret, order_place: 2, libelle: 'Numéro SIRET', procedure: proc_to) }
- let!(:type_champ_fonction_to) { create(:type_de_champ_text, order_place: 9, libelle: 'Fonction', mandatory: true, procedure: proc_to) }
-
- let(:rake_task) { Rake::Task['2018_07_31_nutriscore:migrate_dossiers'] }
-
- def run_task
- ENV['SOURCE_PROCEDURE_ID'] = proc_from.id.to_s
- ENV['DESTINATION_PROCEDURE_ID'] = proc_to.id.to_s
- rake_task.invoke
- dossier.reload
- proc_from.reload
- proc_to.reload
- end
-
- after { rake_task.reenable }
-
- context 'on happy path' do
- before do
- gestionnaire.assign_to_procedure(proc_from)
- run_task
- end
-
- it { expect(dossier.procedure).to eq(proc_to) }
- it { expect(dossier.champs.pluck(:type_de_champ_id)).to match_array(proc_to.types_de_champ.pluck(:id)) }
- it { expect(dossier.champs.find_by(type_de_champ: type_champ_siret_to).value).to eq(etablissement.siret) }
- it { expect(dossier.champs.find_by(type_de_champ: type_champ_siret_to).etablissement).to eq(etablissement) }
- it { expect(proc_from).to be_archivee }
- it { expect(proc_to).to be_publiee }
- it { expect(proc_to.gestionnaires).to eq([gestionnaire]) }
- end
-
- context 'detecting error conditions' do
- context 'with administrateur mismatch' do
- let(:proc_to) { create(:procedure) }
-
- it { expect { run_task }.to raise_exception(/^Mismatching administrateurs/) }
- end
-
- context 'with champ count mismatch' do
- before { create(:type_de_champ_textarea, order_place: 26, libelle: 'texte', procedure: proc_to) }
-
- it { expect { run_task }.to raise_exception('Incorrect destination size 27 (expected 26)') }
- end
-
- context 'with champ libelle mismatch' do
- let!(:type_champ_to) { create(:type_de_champ_textarea, order_place: 1, libelle: 'autre texte', procedure: proc_to) }
-
- it { expect { run_task }.to raise_exception(/incorrect libelle texte \(expected autre texte\)$/) }
- end
-
- context 'with champ type mismatch' do
- let!(:type_champ_to) { create(:type_de_champ_text, order_place: 1, libelle: 'texte', procedure: proc_to) }
-
- it { expect { run_task }.to raise_exception(/incorrect type champ textarea \(expected text\)$/) }
- end
-
- context 'with champ mandatoriness mismatch' do
- let!(:type_champ_to) { create(:type_de_champ_textarea, order_place: 1, libelle: 'texte', mandatory: true, procedure: proc_to) }
-
- it { expect { run_task }.to raise_exception(/champ should be mandatory$/) }
- end
-
- context 'with dropdown mismatch' do
- let!(:type_champ_from) { create(:type_de_champ_drop_down_list, order_place: 1, libelle: 'dropdown', drop_down_list: create(:drop_down_list, value: 'something'), procedure: proc_from) }
- let!(:type_champ_to) { create(:type_de_champ_drop_down_list, order_place: 1, libelle: 'dropdown', drop_down_list: create(:drop_down_list, value: 'something else'), procedure: proc_to) }
-
- it { expect { run_task }.to raise_exception(/incorrect drop down list \["", "something"\] \(expected \["", "something else"\]\)$/) }
- end
-
- context 'with siret mismatch on source' do
- let!(:type_champ_siret_from) { create(:type_de_champ_textarea, order_place: 2, libelle: 'Numéro SIRET', procedure: proc_from) }
-
- it { expect { run_task }.to raise_exception(/incorrect type champ textarea \(expected text\)$/) }
- end
-
- context 'with siret mismatch on destination' do
- let!(:type_champ_siret_to) { create(:type_de_champ_text, order_place: 2, libelle: 'Numéro SIRET', procedure: proc_to) }
-
- it { expect { run_task }.to raise_exception(/incorrect type champ text \(expected siret\)$/) }
- end
- end
-end
diff --git a/spec/lib/tasks/2019_01_16_fix_automatic_dossier_logs_spec.rb b/spec/lib/tasks/2019_01_16_fix_automatic_dossier_logs_spec.rb
deleted file mode 100644
index b41bafe81..000000000
--- a/spec/lib/tasks/2019_01_16_fix_automatic_dossier_logs_spec.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-require 'spec_helper'
-
-load Rails.root.join('lib', 'tasks', '2019_01_16_fix_automatic_dossier_logs.rake')
-
-describe '2019_01_16_fix_automatic_dossier_logs' do
- let!(:rake_task) { Rake::Task['2019_01_16_fix_automatic_dossier_logs:run'] }
- let!(:administrateur) { create(:administrateur) }
- let!(:another_gestionnaire) { create(:gestionnaire) }
- let!(:procedure) { create(:procedure, administrateur: administrateur) }
- let!(:dossier) { create(:dossier, procedure: procedure) }
- let!(:fix_automatic_dossier_logs) { FixAutomaticDossierLogs_2019_01_16.new }
-
- before do
- allow(fix_automatic_dossier_logs).to receive(:find_handlers)
- .and_return([double(job_data: { 'arguments' => [procedure.id, final_state] })])
- end
-
- subject do
- fix_automatic_dossier_logs.run
- dossier.reload
- end
-
- context 'when the dossiers are automatically moved to en_instruction' do
- let(:final_state) { 'en_instruction' }
-
- context 'and a dossier has been accidentally affected to an administrateur' do
- before do
- dossier.passer_en_instruction!(administrateur.gestionnaire)
-
- control = DossierOperationLog.create(
- gestionnaire: another_gestionnaire,
- operation: 'refuser',
- automatic_operation: false
- )
-
- dossier.dossier_operation_logs << control
- subject
- end
-
- it { expect(dossier.follows.count).to eq(0) }
-
- it do
- expect(dossier_logs).to match_array([
- [nil, 'passer_en_instruction', true],
- [another_gestionnaire.id, "refuser", false]
- ])
- end
- end
-
- context ', followed anyway by another person and accidentally ...' do
- before do
- another_gestionnaire.follow(dossier)
- dossier.passer_en_instruction!(administrateur.gestionnaire)
-
- subject
- end
-
- it { expect(dossier.follows.count).to eq(2) }
- it { expect(dossier_logs).to match([[nil, 'passer_en_instruction', true]]) }
- end
- end
-
- context 'when the dossiers are automatically moved to accepte' do
- let(:final_state) { 'accepte' }
-
- context 'and a dossier has been accidentally affected to an administrateur' do
- before do
- dossier.accepter!(administrateur.gestionnaire, '')
-
- subject
- end
-
- it { expect(dossier_logs).to match([[nil, 'accepter', true]]) }
- end
- end
-
- private
-
- def dossier_logs
- dossier.dossier_operation_logs.pluck(:gestionnaire_id, :operation, :automatic_operation)
- end
-end
diff --git a/spec/lib/tasks/deployment/20181219164523_clone_service_for_transferred_procedures.rake_spec.rb b/spec/lib/tasks/deployment/20181219164523_clone_service_for_transferred_procedures.rake_spec.rb
deleted file mode 100644
index a3995ddc9..000000000
--- a/spec/lib/tasks/deployment/20181219164523_clone_service_for_transferred_procedures.rake_spec.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-describe '20181219164523_clone_service_for_transferred_procedures.rake' do
- let(:rake_task) { Rake::Task['after_party:clone_service_for_transferred_procedures'] }
-
- subject do
- rake_task.invoke
- end
-
- after do
- rake_task.reenable
- end
-
- context 'procedures from different admins share the same service' do
- let(:admin1) { create(:administrateur) }
- let(:admin2) { create(:administrateur) }
- let(:service) { create(:service, administrateur: admin1) }
- let!(:procedure1) { create(:procedure, service: service, administrateur: admin1) }
- let!(:procedure2) { create(:procedure, service: service, administrateur: admin2) }
- let!(:procedure3) { create(:procedure, service: service, administrateur: admin2) }
-
- it 'clones service for procedure2 & procedure3' do
- subject
- expect(procedure1.reload.service).not_to eq(procedure2.reload.service)
- expect(procedure1.reload.service).not_to eq(procedure3.reload.service)
- expect(procedure2.reload.service).to eq(procedure3.reload.service)
- end
-
- it 'does nothing for procedure1' do
- subject
- expect(procedure1.reload.service).to eq(service)
- end
- end
-end
diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb
index 78a39d7e0..dc9382add 100644
--- a/spec/models/dossier_spec.rb
+++ b/spec/models/dossier_spec.rb
@@ -652,7 +652,7 @@ describe Dossier do
let(:dossier) { create(:dossier, :en_construction) }
it 'notifies the procedure administrateur' do
expect(DossierMailer).to have_received(:notify_deletion_to_administration).once
- expect(DossierMailer).to have_received(:notify_deletion_to_administration).with(deleted_dossier, dossier.procedure.administrateur.email)
+ expect(DossierMailer).to have_received(:notify_deletion_to_administration).with(deleted_dossier, dossier.procedure.administrateurs.first.email)
end
end
diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb
index 4092951a1..d6a9df4dc 100644
--- a/spec/models/procedure_spec.rb
+++ b/spec/models/procedure_spec.rb
@@ -344,7 +344,7 @@ describe Procedure do
let!(:piece_justificative_1) { create(:type_de_piece_justificative, procedure: procedure, order_place: 1) }
let(:received_mail) { create(:received_mail) }
let(:from_library) { false }
- let(:administrateur) { procedure.administrateur }
+ let(:administrateur) { procedure.administrateurs.first }
before do
@logo = File.open('spec/fixtures/files/white.png')
@@ -419,7 +419,6 @@ describe Procedure do
end
it 'should have one administrateur' do
- expect(subject.administrateur).to eq(administrateur)
expect(subject.administrateurs).to eq([administrateur])
end
end
@@ -444,7 +443,6 @@ describe Procedure do
end
it 'should have one administrateur' do
- expect(subject.administrateur).to eq(administrateur)
expect(subject.administrateurs).to eq([administrateur])
end
end
@@ -495,14 +493,14 @@ describe Procedure do
before do
Timecop.freeze(now)
- procedure.publish!("example-path")
+ procedure.publish!(procedure.administrateurs.first, "example-path")
end
after { Timecop.return }
it { expect(procedure.archived_at).to eq(nil) }
it { expect(procedure.published_at).to eq(now) }
it { expect(Procedure.find_by(path: "example-path")).to eq(procedure) }
- it { expect(Procedure.find_by(path: "example-path").administrateur).to eq(procedure.administrateur) }
+ it { expect(Procedure.find_by(path: "example-path").administrateurs).to eq(procedure.administrateurs) }
end
describe "#brouillon?" do
diff --git a/spec/serializers/dossier_serializer_spec.rb b/spec/serializers/dossier_serializer_spec.rb
index 681baeab7..86963686c 100644
--- a/spec/serializers/dossier_serializer_spec.rb
+++ b/spec/serializers/dossier_serializer_spec.rb
@@ -59,7 +59,7 @@ describe DossierSerializer do
end
let(:procedure) do
- p = original_procedure.clone(original_procedure.administrateur, false)
+ p = original_procedure.clone(original_procedure.administrateurs.first, false)
p.save
p
end
diff --git a/spec/serializers/procedure_serializer_spec.rb b/spec/serializers/procedure_serializer_spec.rb
index be0d83669..2c908094b 100644
--- a/spec/serializers/procedure_serializer_spec.rb
+++ b/spec/serializers/procedure_serializer_spec.rb
@@ -21,7 +21,7 @@ describe ProcedureSerializer do
p
end
- let(:procedure) { original_procedure.clone(original_procedure.administrateur, false) }
+ let(:procedure) { original_procedure.clone(original_procedure.administrateurs.first, false) }
let(:type_pj) { original_procedure.types_de_piece_justificative.first }
let(:migrated_type_champ) { procedure.types_de_champ.find_by(libelle: type_pj.libelle) }
diff --git a/spec/views/admin/procedures/show.html.haml_spec.rb b/spec/views/admin/procedures/show.html.haml_spec.rb
index da43dba97..57715a9a7 100644
--- a/spec/views/admin/procedures/show.html.haml_spec.rb
+++ b/spec/views/admin/procedures/show.html.haml_spec.rb
@@ -41,7 +41,7 @@ describe 'admin/procedures/show.html.haml', type: :view do
describe 'procedure is published' do
before do
- procedure.publish!('fake_path')
+ procedure.publish!(procedure.administrateurs.first, 'fake_path')
procedure.reload
render
end
@@ -59,7 +59,7 @@ describe 'admin/procedures/show.html.haml', type: :view do
describe 'procedure is archived' do
before do
- procedure.publish!('fake_path')
+ procedure.publish!(procedure.administrateurs.first, 'fake_path')
procedure.archive!
procedure.reload
render