Merge pull request #3510 from tchak/multi-admin-bis

Une démarche peut appartenir à plusieurs administrateurs
This commit is contained in:
Paul Chavard 2019-03-12 12:14:10 +01:00 committed by GitHub
commit 68c097a64e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
42 changed files with 118 additions and 652 deletions

View file

@ -44,7 +44,7 @@ class Admin::ProceduresController < AdminController
def edit def edit
@path = @procedure.path || @procedure.default_path @path = @procedure.path || @procedure.default_path
@availability = @procedure.path_availability(@path) @availability = @procedure.path_availability(current_administrateur, @path)
end end
def destroy def destroy
@ -96,7 +96,7 @@ class Admin::ProceduresController < AdminController
flash.now.alert = @procedure.errors.full_messages flash.now.alert = @procedure.errors.full_messages
@path = procedure_params[:path] @path = procedure_params[:path]
if @path.present? if @path.present?
@availability = @procedure.path_availability(@path) @availability = @procedure.path_availability(current_administrateur, @path)
end end
render 'edit' render 'edit'
elsif @procedure.brouillon? elsif @procedure.brouillon?
@ -121,7 +121,7 @@ class Admin::ProceduresController < AdminController
procedure.path = nil procedure.path = nil
end end
if procedure.publish_or_reopen!(path) if procedure.publish_or_reopen!(current_administrateur, path)
flash.notice = "Démarche publiée" flash.notice = "Démarche publiée"
redirect_to admin_procedures_path redirect_to admin_procedures_path
else else
@ -195,7 +195,7 @@ class Admin::ProceduresController < AdminController
.pluck('procedures.id') .pluck('procedures.id')
@grouped_procedures = Procedure @grouped_procedures = Procedure
.includes(:administrateur, :service) .includes(:administrateurs, :service)
.where(id: significant_procedure_ids) .where(id: significant_procedure_ids)
.group_by(&:organisation_name) .group_by(&:organisation_name)
.sort_by { |_, procedures| procedures.first.created_at } .sort_by { |_, procedures| procedures.first.created_at }
@ -217,11 +217,10 @@ class Admin::ProceduresController < AdminController
json_path_list = Procedure json_path_list = Procedure
.find_with_path(params[:request]) .find_with_path(params[:request])
.order(:id) .order(:id)
.pluck(:path, :administrateur_id) .map do |procedure|
.map do |path, administrateur_id|
{ {
label: path, label: procedure.path,
mine: administrateur_id == current_administrateur.id mine: current_administrateur.owns?(procedure)
} }
end.to_json end.to_json
@ -234,7 +233,7 @@ class Admin::ProceduresController < AdminController
if procedure_id.present? if procedure_id.present?
procedure = current_administrateur.procedures.find(procedure_id) procedure = current_administrateur.procedures.find(procedure_id)
@availability = procedure.path_availability(path) @availability = procedure.path_availability(current_administrateur, path)
else else
@availability = Procedure.path_availability(current_administrateur, path) @availability = Procedure.path_availability(current_administrateur, path)
end end
@ -273,7 +272,7 @@ class Admin::ProceduresController < AdminController
if @procedure&.locked? if @procedure&.locked?
params.require(:procedure).permit(*editable_params) params.require(:procedure).permit(*editable_params)
else 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 end
end end

View file

@ -38,7 +38,7 @@ class API::V1::DossiersController < APIController
def fetch_procedure_and_check_token def fetch_procedure_and_check_token
@procedure = Procedure.for_api.find(params[:procedure_id]) @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 render json: {}, status: :unauthorized
end end

View file

@ -10,7 +10,7 @@ class API::V1::ProceduresController < APIController
def fetch_procedure_and_check_token def fetch_procedure_and_check_token
@procedure = Procedure.for_api.find(params[:id]) @procedure = Procedure.for_api.find(params[:id])
if !valid_token_for_administrateur?(@procedure.administrateur) if !valid_token_for_procedure?(@procedure)
render json: {}, status: :unauthorized render json: {}, status: :unauthorized
end end

View file

@ -3,9 +3,11 @@ class APIController < ApplicationController
protected protected
def valid_token_for_administrateur?(administrateur) def valid_token_for_procedure?(procedure)
procedure.administrateurs.any? do |administrateur|
administrateur.valid_api_token?(token) administrateur.valid_api_token?(token)
end end
end
private private

View file

@ -24,5 +24,17 @@ module Manager
flash[:notice] = "La démarche a bien été supprimée, en cas d'erreur contactez un développeur." flash[:notice] = "La démarche a bien été supprimée, en cas d'erreur contactez un développeur."
redirect_to manager_procedures_path redirect_to manager_procedures_path
end 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
end end

View file

@ -81,13 +81,19 @@ module NewAdministrateur
end end
def services 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 end
def procedure_params def procedure_params
params.require(:procedure).permit(:id, :service_id) params.require(:procedure).permit(:id, :service_id)
end end
def maybe_procedure
current_administrateur.procedures.find_by(id: params[:procedure_id])
end
def procedure def procedure
current_administrateur.procedures.find(params[:procedure_id]) current_administrateur.procedures.find(params[:procedure_id])
end end

View file

@ -186,7 +186,7 @@ module NewUser
end end
def ask_deletion 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? if dossier.can_be_deleted_by_user?
dossier.delete_and_keep_track dossier.delete_and_keep_track

View file

@ -23,8 +23,6 @@ class StatsController < ApplicationController
@dossiers_cumulative = cumulative_hash(dossiers, :en_construction_at) @dossiers_cumulative = cumulative_hash(dossiers, :en_construction_at)
@dossiers_in_the_last_4_months = last_four_months_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? if administration_signed_in?
@dossier_instruction_mean_time = Rails.cache.fetch("dossier_instruction_mean_time", expires_in: 1.day) do @dossier_instruction_mean_time = Rails.cache.fetch("dossier_instruction_mean_time", expires_in: 1.day) do
dossier_instruction_mean_time(dossiers) dossier_instruction_mean_time(dossiers)
@ -234,15 +232,6 @@ class StatsController < ApplicationController
.reduce({}, :merge) .reduce({}, :merge)
end 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) def mean(collection)
(collection.sum.to_f / collection.size).round(2) (collection.sum.to_f / collection.size).round(2)
end end

View file

@ -14,7 +14,7 @@ class ProcedureDashboard < Administrate::BaseDashboard
path: ProcedureLinkField, path: ProcedureLinkField,
dossiers: Field::HasMany, dossiers: Field::HasMany,
gestionnaires: Field::HasMany, gestionnaires: Field::HasMany,
administrateur: Field::BelongsTo, administrateurs: Field::HasMany,
id: Field::Number.with_options(searchable: true), id: Field::Number.with_options(searchable: true),
libelle: Field::String, libelle: Field::String,
description: Field::String, description: Field::String,
@ -58,7 +58,7 @@ class ProcedureDashboard < Administrate::BaseDashboard
SHOW_PAGE_ATTRIBUTES = [ SHOW_PAGE_ATTRIBUTES = [
:id, :id,
:path, :path,
:administrateur, :administrateurs,
:libelle, :libelle,
:description, :description,
:lien_site_web, :lien_site_web,

View file

@ -7,9 +7,8 @@ class Administrateur < ApplicationRecord
:recoverable, :rememberable, :trackable, :validatable :recoverable, :rememberable, :trackable, :validatable
has_and_belongs_to_many :gestionnaires has_and_belongs_to_many :gestionnaires
has_many :procedures
has_many :administrateurs_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 :services
has_many :dossiers, -> { state_not_brouillon }, through: :procedures has_many :dossiers, -> { state_not_brouillon }, through: :procedures
@ -117,7 +116,7 @@ class Administrateur < ApplicationRecord
end end
def owns?(procedure) def owns?(procedure)
id == procedure.administrateur_id procedure.administrateurs.include?(self)
end end
def gestionnaire def gestionnaire

View file

@ -264,7 +264,7 @@ class Dossier < ApplicationRecord
update(hidden_at: deleted_dossier.deleted_at) update(hidden_at: deleted_dossier.deleted_at)
if en_construction? 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| administration_emails.each do |email|
DossierMailer.notify_deletion_to_administration(deleted_dossier, email).deliver_later DossierMailer.notify_deletion_to_administration(deleted_dossier, email).deliver_later
end end

View file

@ -1,6 +1,8 @@
require Rails.root.join('lib', 'percentile') require Rails.root.join('lib', 'percentile')
class Procedure < ApplicationRecord class Procedure < ApplicationRecord
self.ignored_columns = [:administrateur_id]
MAX_DUREE_CONSERVATION = 36 MAX_DUREE_CONSERVATION = 36
has_many :types_de_piece_justificative, -> { ordered }, dependent: :destroy 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 :module_api_carto, dependent: :destroy
has_one :attestation_template, dependent: :destroy has_one :attestation_template, dependent: :destroy
belongs_to :administrateur
belongs_to :parent_procedure, class_name: 'Procedure' belongs_to :parent_procedure, class_name: 'Procedure'
belongs_to :service belongs_to :service
@ -48,7 +49,7 @@ class Procedure < ApplicationRecord
scope :for_api, -> { scope :for_api, -> {
includes( includes(
:administrateur, :administrateurs,
:types_de_champ_private, :types_de_champ_private,
:types_de_champ, :types_de_champ,
:types_de_piece_justificative, :types_de_piece_justificative,
@ -101,12 +102,12 @@ class Procedure < ApplicationRecord
end end
end end
def publish_or_reopen!(path) def publish_or_reopen!(administrateur, path)
if archivee? && may_reopen?(path) if archivee? && may_reopen?(administrateur, path)
reopen!(path) reopen!(administrateur, path)
elsif may_publish?(path) elsif may_publish?(administrateur, path)
reset! reset!
publish!(path) publish!(administrateur, path)
end end
end end
@ -220,7 +221,6 @@ class Procedure < ApplicationRecord
procedure.administrateurs = administrateurs procedure.administrateurs = administrateurs
end end
procedure.administrateur = admin
procedure.initiated_mail = initiated_mail&.dup procedure.initiated_mail = initiated_mail&.dup
procedure.received_mail = received_mail&.dup procedure.received_mail = received_mail&.dup
procedure.closed_mail = closed_mail&.dup procedure.closed_mail = closed_mail&.dup
@ -340,7 +340,7 @@ class Procedure < ApplicationRecord
PATH_NOT_AVAILABLE_BROUILLON = :not_available_brouillon PATH_NOT_AVAILABLE_BROUILLON = :not_available_brouillon
PATH_CAN_PUBLISH = [PATH_AVAILABLE, PATH_AVAILABLE_PUBLIEE] PATH_CAN_PUBLISH = [PATH_AVAILABLE, PATH_AVAILABLE_PUBLIEE]
def path_availability(path) def path_availability(administrateur, path)
Procedure.path_availability(administrateur, path, id) Procedure.path_availability(administrateur, path, id)
end end
@ -391,7 +391,9 @@ class Procedure < ApplicationRecord
private private
def claim_path_ownership!(path) 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 if procedure&.publiee? && procedure != self
procedure.archive! procedure.archive!
@ -400,17 +402,21 @@ class Procedure < ApplicationRecord
update!(path: path) update!(path: path)
end end
def can_publish?(path) def can_publish?(administrateur, path)
path_availability(path).in?(PATH_CAN_PUBLISH) path_availability(administrateur, path).in?(PATH_CAN_PUBLISH)
end 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) update!(published_at: Time.zone.now)
claim_path_ownership!(path) claim_path_ownership!(path)
end end
def after_reopen(path) def after_reopen(administrateur, path)
update!(published_at: Time.zone.now, archived_at: nil) update!(published_at: Time.zone.now, archived_at: nil)
claim_path_ownership!(path) claim_path_ownership!(path)

View file

@ -109,7 +109,7 @@ class AdministrateurUsageStatisticsService
end end
def nb_demarches_by_administrateur_id_and_state 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 end
def nb_services_by_administrateur_id def nb_services_by_administrateur_id
@ -128,9 +128,9 @@ class AdministrateurUsageStatisticsService
result = {} result = {}
Dossier Dossier
.joins(:procedure) .joins(procedure: [:administrateurs])
.group( .group(
:administrateur_id, 'administrateurs.id',
:procedure_id, :procedure_id,
<<~EOSQL <<~EOSQL
CASE CASE

View file

@ -27,4 +27,4 @@
%td %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') = 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;' } %td{ style: 'padding-left: 10px;' }
= link_to('Contacter', "mailto:#{procedure.administrateur.email}") = link_to('Contacter', "mailto:#{procedure.administrateurs.pluck(:email) * ","}")

View file

@ -13,6 +13,9 @@
Nombre de dossier : #{procedure.dossiers.count} Nombre de dossier : #{procedure.dossiers.count}
%br %br
Admin : 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 - else
Il n'y a aucune démarche douteuse aujourd'hui Il n'y a aucune démarche douteuse aujourd'hui

View file

@ -21,7 +21,7 @@
.procedure-list-element{ class: ('active' if active == 'Description') } .procedure-list-element{ class: ('active' if active == 'Description') }
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 .procedure-list-element
Service Service
- if @procedure.missing_steps.include?(:service) - if @procedure.missing_steps.include?(:service)

View file

@ -58,8 +58,15 @@ as well as a link to its edit page.
) %> ) %>
</dt> </dt>
<dd class="attribute-data attribute-data--<%=attribute.html_class%>" <dd class="attribute-data attribute-data--<%=attribute.html_class%>">
><%= render_field attribute, page: page %></dd> <%= 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;') %>
<button>Ajouter un administrateur</button>
<% end %>
<% end %>
</dd>
<% end %> <% end %>
</dl> </dl>
</section> </section>

View file

@ -9,7 +9,7 @@
= form_for @procedure, url: { controller: "new_administrateur/services", action: :add_to_procedure } , html: { class: 'form' } do |f| = 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.label :service_id, "La démarche #{@procedure.libelle} est affectée au service"
= f.select :service_id, = 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 }, { prompt: 'choisir un service', selected: @procedure.service&.id },
required: true required: true

View file

@ -43,7 +43,7 @@
%ul.numbers %ul.numbers
%li.number %li.number
.number-value .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< .number-label<
administrations administrations
%br<> %br<>

View file

@ -84,15 +84,6 @@
.chart.cumulative-dossiers-chart.hidden .chart.cumulative-dossiers-chart.hidden
= area_chart @dossiers_cumulative = 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? - if administration_signed_in?
.stat-card.stat-card-half.pull-left .stat-card.stat-card-half.pull-left
%span.stat-card-title Temps de traitement moyen d'un dossier %span.stat-card-title Temps de traitement moyen d'un dossier

View file

@ -10,6 +10,7 @@ Rails.application.routes.draw do
post 'whitelist', on: :member post 'whitelist', on: :member
post 'draft', on: :member post 'draft', on: :member
post 'hide', on: :member post 'hide', on: :member
post 'add_administrateur', on: :member
end end
resources :dossiers, only: [:index, :show] do resources :dossiers, only: [:index, :show] do

View file

@ -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 LEXPLOITANT' }, destination_overrides: { 'libelle' => 'PARTIE 4 : ENGAGEMENT DE LEXPLOITANT' } } }
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

View file

@ -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

View file

@ -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

View file

@ -260,8 +260,8 @@ module Tasks
end end
def check_same_administrateur def check_same_administrateur
if @source_procedure.administrateur != @destination_procedure.administrateur if @source_procedure.administrateur_ids.sort != @destination_procedure.administrateur_ids.sort
raise "Mismatching administrateurs #{@source_procedure.administrateur&.email}#{@destination_procedure.administrateur&.email}" raise "Mismatching administrateurs #{@source_procedure.administrateurs.pluck(:email)}#{@destination_procedure.administrateurs.pluck(:email)}"
end end
end end

View file

@ -1,82 +1,6 @@
require Rails.root.join("lib", "tasks", "task_helper") require Rails.root.join("lib", "tasks", "task_helper")
namespace :support do 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 desc <<~EOD
Delete the user account for a given USER_EMAIL. Delete the user account for a given USER_EMAIL.
Only works if the user has no dossier where the instruction has started. Only works if the user has no dossier where the instruction has started.

View file

@ -5,7 +5,7 @@ describe Admin::MailTemplatesController, type: :controller do
let(:initiated_mail) { Mails::InitiatedMail.default_for_procedure(procedure) } let(:initiated_mail) { Mails::InitiatedMail.default_for_procedure(procedure) }
before do before do
sign_in procedure.administrateur sign_in procedure.administrateurs.first
end end
describe 'GET index' do describe 'GET index' do

View file

@ -40,7 +40,8 @@ describe Admin::ProceduresController, type: :controller do
describe 'GET #index with sorting and pagination' do describe 'GET #index with sorting and pagination' do
before do before do
admin.procedures << create(:procedure, administrateur: admin) create(:procedure, administrateur: admin)
admin.reload
end end
subject { subject {
@ -196,7 +197,6 @@ describe Admin::ProceduresController, type: :controller do
it { expect(subject.description).to eq(description) } it { expect(subject.description).to eq(description) }
it { expect(subject.organisation).to eq(organisation) } it { expect(subject.organisation).to eq(organisation) }
it { expect(subject.direction).to eq(direction) } 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.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_dans_ds).to eq(duree_conservation_dossiers_dans_ds) }
it { expect(subject.duree_conservation_dossiers_hors_ds).to eq(duree_conservation_dossiers_hors_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 subject
end end
it { expect(Procedure.last.administrateur).to eq new_admin } it { expect(Procedure.last.administrateurs).to eq [new_admin] }
end end
end end
end end

View file

@ -1,10 +1,11 @@
require 'spec_helper' require 'spec_helper'
describe APIController, type: :controller do describe APIController, type: :controller do
describe 'valid_token_for_administrateur?' do describe 'valid_token_for_procedure?' do
let!(:admin) { create(:administrateur) } 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 'when the admin has not any token' do
context 'and the token is not given' do context 'and the token is not given' do

View file

@ -815,7 +815,7 @@ describe NewUser::DossiersController, type: :controller do
let(:dossier) { create(:dossier, :en_construction, user: user, autorisation_donnees: true) } let(:dossier) { create(:dossier, :en_construction, user: user, autorisation_donnees: true) }
it "notifies the user and the admin of the deletion" do 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)) expect(DossierMailer).to receive(:notify_deletion_to_user).with(kind_of(DeletedDossier), dossier.user.email).and_return(double(deliver_later: nil))
subject subject
end end

View file

@ -93,42 +93,6 @@ describe StatsController, type: :controller do
end end
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 describe "#dossier_instruction_mean_time" do
# Month-2: mean 3 days # Month-2: mean 3 days
# procedure_1: mean 2 days # procedure_1: mean 2 days

View file

@ -23,7 +23,8 @@ FactoryBot.define do
trait :with_procedure do trait :with_procedure do
after(:create) do |admin| after(:create) do |admin|
admin.procedures << create(:simple_procedure, administrateur: admin) create(:simple_procedure, administrateur: admin)
admin.reload
end end
end end
end end

View file

@ -7,13 +7,20 @@ FactoryBot.define do
direction { "direction DINSIC" } direction { "direction DINSIC" }
cadre_juridique { "un cadre juridique important" } cadre_juridique { "un cadre juridique important" }
published_at { nil } published_at { nil }
administrateur { create(:administrateur) }
duree_conservation_dossiers_dans_ds { 3 } duree_conservation_dossiers_dans_ds { 3 }
duree_conservation_dossiers_hors_ds { 6 } duree_conservation_dossiers_hors_ds { 6 }
ask_birthday { false } ask_birthday { false }
after(:build) do |procedure| transient do
procedure.administrateurs = [procedure.administrateur] administrateur {}
end
after(:build) do |procedure, evaluator|
if evaluator.administrateur
procedure.administrateurs = [evaluator.administrateur]
elsif procedure.administrateurs.empty?
procedure.administrateurs = [create(:administrateur)]
end
end end
factory :procedure_with_dossiers do factory :procedure_with_dossiers do
@ -30,7 +37,7 @@ FactoryBot.define do
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
procedure.for_individual = true procedure.for_individual = true
procedure.types_de_champ << create(:type_de_champ, libelle: 'Texte obligatoire', mandatory: 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
end end
@ -128,13 +135,13 @@ FactoryBot.define do
trait :published do trait :published do
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
procedure.publish!(generate(:published_path)) procedure.publish!(procedure.administrateurs.first, generate(:published_path))
end end
end end
trait :archived do trait :archived do
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
procedure.publish!(generate(:published_path)) procedure.publish!(procedure.administrateurs.first, generate(:published_path))
procedure.archive! procedure.archive!
end end
end end
@ -143,14 +150,14 @@ FactoryBot.define do
# For now the behavior is the same than :archived # For now the behavior is the same than :archived
# (it may be different in the future though) # (it may be different in the future though)
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
procedure.publish!(generate(:published_path)) procedure.publish!(procedure.administrateurs.first, generate(:published_path))
procedure.archive! procedure.archive!
end end
end end
trait :hidden do trait :hidden do
after(:build) do |procedure, _evaluator| after(:build) do |procedure, _evaluator|
procedure.publish!(generate(:published_path)) procedure.publish!(procedure.administrateurs.first, generate(:published_path))
procedure.hide! procedure.hide!
end end
end end

View file

@ -1,7 +1,7 @@
require 'spec_helper' require 'spec_helper'
feature 'As an administrateur I can edit types de champ', js: true do 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) } let(:procedure) { create(:procedure) }
before do before do

View file

@ -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 LEXPLOITANT', 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 LEXPLOITANT', 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

View file

@ -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

View file

@ -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

View file

@ -652,7 +652,7 @@ describe Dossier do
let(:dossier) { create(:dossier, :en_construction) } let(:dossier) { create(:dossier, :en_construction) }
it 'notifies the procedure administrateur' do 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).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
end end

View file

@ -344,7 +344,7 @@ describe Procedure do
let!(:piece_justificative_1) { create(:type_de_piece_justificative, procedure: procedure, order_place: 1) } let!(:piece_justificative_1) { create(:type_de_piece_justificative, procedure: procedure, order_place: 1) }
let(:received_mail) { create(:received_mail) } let(:received_mail) { create(:received_mail) }
let(:from_library) { false } let(:from_library) { false }
let(:administrateur) { procedure.administrateur } let(:administrateur) { procedure.administrateurs.first }
before do before do
@logo = File.open('spec/fixtures/files/white.png') @logo = File.open('spec/fixtures/files/white.png')
@ -419,7 +419,6 @@ describe Procedure do
end end
it 'should have one administrateur' do it 'should have one administrateur' do
expect(subject.administrateur).to eq(administrateur)
expect(subject.administrateurs).to eq([administrateur]) expect(subject.administrateurs).to eq([administrateur])
end end
end end
@ -444,7 +443,6 @@ describe Procedure do
end end
it 'should have one administrateur' do it 'should have one administrateur' do
expect(subject.administrateur).to eq(administrateur)
expect(subject.administrateurs).to eq([administrateur]) expect(subject.administrateurs).to eq([administrateur])
end end
end end
@ -495,14 +493,14 @@ describe Procedure do
before do before do
Timecop.freeze(now) Timecop.freeze(now)
procedure.publish!("example-path") procedure.publish!(procedure.administrateurs.first, "example-path")
end end
after { Timecop.return } after { Timecop.return }
it { expect(procedure.archived_at).to eq(nil) } it { expect(procedure.archived_at).to eq(nil) }
it { expect(procedure.published_at).to eq(now) } 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")).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 end
describe "#brouillon?" do describe "#brouillon?" do

View file

@ -59,7 +59,7 @@ describe DossierSerializer do
end end
let(:procedure) do let(:procedure) do
p = original_procedure.clone(original_procedure.administrateur, false) p = original_procedure.clone(original_procedure.administrateurs.first, false)
p.save p.save
p p
end end

View file

@ -21,7 +21,7 @@ describe ProcedureSerializer do
p p
end 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(:type_pj) { original_procedure.types_de_piece_justificative.first }
let(:migrated_type_champ) { procedure.types_de_champ.find_by(libelle: type_pj.libelle) } let(:migrated_type_champ) { procedure.types_de_champ.find_by(libelle: type_pj.libelle) }

View file

@ -41,7 +41,7 @@ describe 'admin/procedures/show.html.haml', type: :view do
describe 'procedure is published' do describe 'procedure is published' do
before do before do
procedure.publish!('fake_path') procedure.publish!(procedure.administrateurs.first, 'fake_path')
procedure.reload procedure.reload
render render
end end
@ -59,7 +59,7 @@ describe 'admin/procedures/show.html.haml', type: :view do
describe 'procedure is archived' do describe 'procedure is archived' do
before do before do
procedure.publish!('fake_path') procedure.publish!(procedure.administrateurs.first, 'fake_path')
procedure.archive! procedure.archive!
procedure.reload procedure.reload
render render