diff --git a/README.md b/README.md index 68054055f..77e1fbc6d 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ Dans le fichier `config/intializers/token.rb`, ajouter WeeklyOverviewJob.set(cron: "0 8 * * 0").perform_later AutoReceiveDossiersForProcedureJob.set(cron: "* * * * *").perform_later(procedure_declaratoire_id, 'en_instruction') FindDubiousProceduresJob.set(cron: "0 0 * * *").perform_later + Administrateurs::ActivateBeforeExpirationJob.set(cron: "0 8 * * *").perform_later ## Exécution des tests (RSpec) diff --git a/app/assets/javascripts/old_design/admin.js b/app/assets/javascripts/old_design/admin.js index 5284d467d..0e50d577e 100644 --- a/app/assets/javascripts/old_design/admin.js +++ b/app/assets/javascripts/old_design/admin.js @@ -28,6 +28,8 @@ function on_change_type_de_champ_select (){ parent.removeClass('header-section'); parent.children(".drop-down-list").removeClass('show-inline'); + parent.children(".pj-template").removeClass('show-inline'); + $('.mandatory', parent).show(); switch(this.value){ @@ -38,6 +40,9 @@ function on_change_type_de_champ_select (){ case 'multiple_drop_down_list': parent.children(".drop-down-list").addClass('show-inline'); break; + case 'piece_justificative': + parent.children(".pj-template").addClass('show-inline'); + break; case 'explication': $('.mandatory', parent).hide(); break; diff --git a/app/assets/stylesheets/admin_type_de_champ.scss b/app/assets/stylesheets/admin_type_de_champ.scss index 5fc7aa54b..2d31eb5bd 100644 --- a/app/assets/stylesheets/admin_type_de_champ.scss +++ b/app/assets/stylesheets/admin_type_de_champ.scss @@ -31,7 +31,8 @@ display: inline-block !important; } - .form-group.drop-down-list { + .form-group.drop-down-list, + .form-group.pj-template { display: none; } diff --git a/app/helpers/etablissement_helper.rb b/app/helpers/etablissement_helper.rb new file mode 100644 index 000000000..99bfa433e --- /dev/null +++ b/app/helpers/etablissement_helper.rb @@ -0,0 +1,5 @@ +module EtablissementHelper + def pretty_currency(capital_social) + number_to_currency(capital_social, delimiter: ' ', unit: '€', format: '%n %u') + end +end diff --git a/app/models/etablissement.rb b/app/models/etablissement.rb index 840e1aed5..7ea3a94c9 100644 --- a/app/models/etablissement.rb +++ b/app/models/etablissement.rb @@ -36,6 +36,31 @@ class Etablissement < ApplicationRecord attr_accessor :signature + def entreprise_raison_sociale_or_name + entreprise_raison_sociale.presence || "#{entreprise_nom} #{entreprise_prenom}" + end + + def entreprise_effectif + { + 'NN' => "Unités non employeuses (pas de salarié au cours de l'année de référence et pas d'effectif au 31/12).", + '00' => "0 salarié (n'ayant pas d'effectif au 31/12 mais ayant employé des salariés au cours de l'année de référence)", + '01' => '1 ou 2 salariés', + '02' => '3 à 5 salariés', + '03' => '6 à 9 salariés', + '11' => '10 à 19 salariés', + '12' => '20 à 49 salariés', + '21' => '50 à 99 salariés', + '22' => '100 à 199 salariés', + '31' => '200 à 249 salariés', + '32' => '250 à 499 salariés', + '41' => '500 à 999 salariés', + '42' => '1 000 à 1 999 salariés', + '51' => '2 000 à 4 999 salariés', + '52' => '5 000 à 9 999 salariés', + '53' => '10 000 salariés et plus' + }[entreprise_code_effectif_entreprise] + end + private def validate_signature diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index ca90df71c..9fe76cfe6 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -40,12 +40,15 @@ class TypeDeChamp < ApplicationRecord end has_one :drop_down_list + has_one_attached :piece_justificative_template + accepts_nested_attributes_for :drop_down_list validates :libelle, presence: true, allow_blank: false, allow_nil: false validates :type_champ, presence: true, allow_blank: false, allow_nil: false before_validation :check_mandatory + before_save :remove_piece_justificative_template, if: -> { type_champ_changed? } def params_for_champ { @@ -77,4 +80,12 @@ class TypeDeChamp < ApplicationRecord def self.type_champ_to_class_name(type_champ) "TypesDeChamp::#{type_champ.classify}TypeDeChamp" end + + private + + def remove_piece_justificative_template + if type_champ != 'piece_justificative' && piece_justificative_template.attached? + piece_justificative_template.purge_later + end + end end diff --git a/app/services/types_de_champ_service.rb b/app/services/types_de_champ_service.rb index f4b1796ca..23dee3310 100644 --- a/app/services/types_de_champ_service.rb +++ b/app/services/types_de_champ_service.rb @@ -13,6 +13,7 @@ class TypesDeChampService :type_champ, :id, :mandatory, + :piece_justificative_template, drop_down_list_attributes: [:value, :id] ]) diff --git a/app/views/admin/types_de_champ/_fields.html.haml b/app/views/admin/types_de_champ/_fields.html.haml index 1d03612e4..bf297aef8 100644 --- a/app/views/admin/types_de_champ/_fields.html.haml +++ b/app/views/admin/types_de_champ/_fields.html.haml @@ -21,6 +21,23 @@ ~ fff.text_area :value, class: 'form-control drop_down_list', placeholder: "Ecrire une valeur par ligne et --valeur-- pour un séparateur.", rows: 3, cols: 30 = fff.hidden_field :id + .form-group.pj-template{ class: (type_champ == 'piece_justificative') ? 'show-inline' : nil } + %h4 Modèle + - if type_champ == 'piece_justificative' + - template = ff.object.object.piece_justificative_template + + - if !template.attached? + = ff.file_field :piece_justificative_template, + direct_upload: true + - else + = link_to template.filename.to_s, url_for(template), target: '_blank' + %br + Modifier : + = ff.file_field :piece_justificative_template, + direct_upload: true + - else + = ff.file_field :piece_justificative_template, + direct_upload: true - hide_mandatory = (ff.object.object.private? || type_champ == 'explication') .form-group.mandatory{ style: hide_mandatory ? 'visibility: hidden;' : nil } @@ -46,7 +63,10 @@ .form-group %br   - if ff.object.id.nil? - = f.submit "Ajouter le champ", class: 'btn btn-success', id: @types_de_champ_facade.add_button_id + = f.button 'Ajouter le champ', + id: @types_de_champ_facade.add_button_id, + class: 'btn btn-success', + data: { disable_with: 'Envoi...' } - else = link_to("", @types_de_champ_facade.delete_url(ff), method: :delete, remote: true, id: "delete_type_de_champ_#{ff.object.id}", class: %w(form-control btn btn-danger fa fa-trash-o) ) diff --git a/app/views/admin/types_de_champ/_form.html.haml b/app/views/admin/types_de_champ/_form.html.haml index fad5752ec..a8e1b22c7 100644 --- a/app/views/admin/types_de_champ/_form.html.haml +++ b/app/views/admin/types_de_champ/_form.html.haml @@ -1,6 +1,11 @@ = form_for [:admin, @procedure], url: @types_de_champ_facade.url, remote: true do |f| = render partial: 'admin/types_de_champ/fields', locals: { types_de_champ: @types_de_champ_facade.types_de_champ, f: f } - = f.submit "Enregistrer", class: 'btn btn-success', id: :save + + = f.button 'Enregistrer', + id: :save, + class: 'btn btn-success', + data: { disable_with: 'Envoi...' } + %hr #new_type_de_champ = render partial: 'admin/types_de_champ/fields', locals: { types_de_champ: @types_de_champ_facade.new_type_de_champ, f: f } diff --git a/app/views/new_gestionnaire/dossiers/_champs.html.haml b/app/views/new_gestionnaire/dossiers/_champs.html.haml index 4335f9510..e980c11ec 100644 --- a/app/views/new_gestionnaire/dossiers/_champs.html.haml +++ b/app/views/new_gestionnaire/dossiers/_champs.html.haml @@ -46,6 +46,12 @@ %td.rich-text %span{ class: highlight_if_unseen_class(demande_seen_at, c.updated_at) } = simple_format(c.value) + - when "siret" + %th.libelle + = "#{c.libelle} :" + %td.rich-text + %span{ class: highlight_if_unseen_class(demande_seen_at, c.updated_at) } + = render partial: "new_gestionnaire/dossiers/identite_entreprise", locals: { etablissement: c.etablissement } - else %th.libelle = "#{c.libelle} :" diff --git a/app/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml b/app/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml index ec3c532eb..ff83d56ef 100644 --- a/app/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml +++ b/app/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml @@ -1,70 +1,64 @@ -- entreprise = entreprise.decorate -- etablissement = entreprise.etablissement - %table.table.vertical.dossier-champs %tbody %tr %th.libelle Dénomination : - %td= entreprise.raison_sociale_or_name + %td= etablissement.entreprise_raison_sociale_or_name %tr %th.libelle SIRET : - %td= entreprise.siret_siege_social + %td= etablissement.entreprise_siret_siege_social %tr %th.libelle Forme juridique : - %td= sanitize(entreprise.forme_juridique) - - if etablissement.present? - %tr - %th.libelle Libellé NAF : - %td= etablissement.libelle_naf - %tr - %th.libelle Code NAF : - %td= etablissement.naf + %td= sanitize(etablissement.entreprise_forme_juridique) + %tr + %th.libelle Libellé NAF : + %td= etablissement.libelle_naf + %tr + %th.libelle Code NAF : + %td= etablissement.naf %tr %th.libelle Date de création : - %td= Time.at(entreprise.date_creation).localtime.strftime("%d/%m/%Y") + %td= etablissement.entreprise_date_creation&.strftime("%d/%m/%Y") %tr %th.libelle Effectif de l'organisation : - %td= entreprise.effectif + %td= etablissement.entreprise_effectif %tr %th.libelle Code effectif : - %td= entreprise.code_effectif_entreprise + %td= etablissement.entreprise_code_effectif_entreprise %tr %th.libelle Numéro de TVA intracommunautaire : - %td= entreprise.numero_tva_intracommunautaire - - if etablissement.present? - %tr - %th.libelle Adresse : - %td - - etablissement.adresse.split("\n").each do |line| - = line - %br + %td= etablissement.entreprise_numero_tva_intracommunautaire + %tr + %th.libelle Adresse : + %td + - etablissement.adresse.split("\n").each do |line| + = line + %br %tr %th.libelle Capital social : - %td= entreprise.pretty_capital_social - - if etablissement.present? - %tr - %th.libelle Exercices : - %td - - etablissement.exercices.each_with_index do |exercice, index| - = "#{exercice.date_fin_exercice.year} : " - = number_to_currency(exercice.ca) - %br - - if entreprise.rna_information.present? + %td= pretty_currency(etablissement.entreprise_capital_social) + %tr + %th.libelle Exercices : + %td + - etablissement.exercices.each_with_index do |exercice, index| + = "#{exercice.date_fin_exercice.year} : " + = pretty_currency(exercice.ca) + %br + - if etablissement.association_rna.present? %tr %th.libelle Numéro RNA : - %td= entreprise.rna_information.association_id + %td= etablissement.association_rna %tr %th.libelle Titre : - %td= entreprise.rna_information.titre + %td= etablissement.association_titre %tr %th.libelle Objet : - %td= entreprise.rna_information.objet + %td= etablissement.association_objet %tr %th.libelle Date de création : - %td= entreprise.rna_information.date_creation&.strftime("%d/%m/%Y") + %td= etablissement.association_date_creation&.strftime("%d/%m/%Y") %tr %th.libelle Date de publication : - %td= entreprise.rna_information.date_publication&.strftime("%d/%m/%Y") + %td= etablissement.association_date_publication&.strftime("%d/%m/%Y") %tr %th.libelle Date de déclaration : - %td= entreprise.rna_information.date_declaration&.strftime("%d/%m/%Y") + %td= etablissement.association_date_declaration&.strftime("%d/%m/%Y") diff --git a/app/views/new_gestionnaire/dossiers/print.html.haml b/app/views/new_gestionnaire/dossiers/print.html.haml index 5d9b1b477..0488c29b7 100644 --- a/app/views/new_gestionnaire/dossiers/print.html.haml +++ b/app/views/new_gestionnaire/dossiers/print.html.haml @@ -5,8 +5,8 @@ = render partial: "new_gestionnaire/dossiers/user_infos", locals: { user: @dossier.user } -- if @dossier.entreprise.present? - = render partial: "identite_entreprise", locals: { entreprise: @dossier.entreprise } +- if @dossier.etablissement.present? + = render partial: "identite_entreprise", locals: { etablissement: @dossier.etablissement } - if @dossier.individual.present? = render partial: "identite_individual", locals: { individual: @dossier.individual } diff --git a/app/views/new_gestionnaire/shared/_show.html.haml b/app/views/new_gestionnaire/shared/_show.html.haml index 846dd1796..aee816d8d 100644 --- a/app/views/new_gestionnaire/shared/_show.html.haml +++ b/app/views/new_gestionnaire/shared/_show.html.haml @@ -3,8 +3,8 @@ .card = render partial: "new_gestionnaire/dossiers/user_infos", locals: { user: dossier.user } - - if dossier.entreprise.present? - = render partial: "new_gestionnaire/dossiers/identite_entreprise", locals: { entreprise: dossier.entreprise } + - if dossier.etablissement.present? + = render partial: "new_gestionnaire/dossiers/identite_entreprise", locals: { etablissement: dossier.etablissement } - if dossier.individual.present? = render partial: "new_gestionnaire/dossiers/identite_individual", locals: { individual: dossier.individual } diff --git a/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml b/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml index fe59efd3f..b3855124a 100644 --- a/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml +++ b/app/views/shared/dossiers/editable_champs/_piece_justificative.html.haml @@ -1,5 +1,10 @@ - pj = champ.piece_justificative_file +- if champ.type_de_champ.piece_justificative_template.attached? + %p.edit-pj-template.mb-1 + Veuillez télécharger, remplir et joindre le + = link_to('le modèle suivant', url_for(champ.type_de_champ.piece_justificative_template), target: '_blank') + - if !pj.attached? = form.file_field :piece_justificative_file, id: "champs_#{champ.id}", diff --git a/spec/factories/entreprise.rb b/spec/factories/entreprise.rb index 51752b3b8..9598017da 100644 --- a/spec/factories/entreprise.rb +++ b/spec/factories/entreprise.rb @@ -10,11 +10,5 @@ FactoryBot.define do siret_siege_social '44011762001530' code_effectif_entreprise '51' date_creation Time.at(1453976189).to_datetime - - trait :is_association do - after(:create) do |entreprise, _evaluator| - create(:rna_information, entreprise: entreprise) - end - end end end diff --git a/spec/factories/etablissement.rb b/spec/factories/etablissement.rb index 3c4d43be5..c39f86cf5 100644 --- a/spec/factories/etablissement.rb +++ b/spec/factories/etablissement.rb @@ -12,5 +12,25 @@ FactoryBot.define do code_postal '92270' localite 'BOIS COLOMBES' code_insee_localite '92009' + + entreprise_siren '440117620' + entreprise_capital_social 537_100_000 + entreprise_numero_tva_intracommunautaire 'FR27440117620' + entreprise_forme_juridique 'SA à conseil d\'administration (s.a.i.)' + entreprise_forme_juridique_code '5599' + entreprise_nom_commercial 'GRTGAZ' + entreprise_raison_sociale 'GRTGAZ' + entreprise_siret_siege_social '44011762001530' + entreprise_code_effectif_entreprise '51' + entreprise_date_creation "1990-04-24" + end + + trait :is_association do + association_rna "W072000535" + association_titre "ASSOCIATION POUR LA PROMOTION DE SPECTACLES AU CHATEAU DE ROCHEMAURE" + association_objet "mise en oeuvre et réalisation de spectacles au chateau de rochemaure" + association_date_creation "1990-04-24" + association_date_declaration "2014-11-28" + association_date_publication "1990-05-16" end end diff --git a/spec/models/type_de_champ_shared_example.rb b/spec/models/type_de_champ_shared_example.rb index cebd27f95..ee91ab549 100644 --- a/spec/models/type_de_champ_shared_example.rb +++ b/spec/models/type_de_champ_shared_example.rb @@ -38,5 +38,46 @@ shared_examples 'type_de_champ_spec' do it { is_expected.to allow_value('').for(:description) } it { is_expected.to allow_value('blabla').for(:description) } end + + context 'remove piece_justificative_template' do + context 'when the tdc is piece_justificative' do + let(:template_double) { double('template', attached?: attached, purge_later: true) } + let(:tdc) { create(:type_de_champ_piece_justificative) } + + subject { template_double } + + before do + allow(tdc).to receive(:piece_justificative_template).and_return(template_double) + + tdc.update_attribute('type_champ', target_type_champ) + end + + context 'when the target type_champ is not pj' do + let(:target_type_champ) { 'text' } + + context 'calls template.purge_later when a file is attached' do + let(:attached) { true } + + it { is_expected.to have_received(:purge_later) } + end + + context 'does not call template.purge_later when no file is attached' do + let(:attached) { false } + + it { is_expected.not_to have_received(:purge_later) } + end + end + + context 'when the target type_champ is pj' do + let(:target_type_champ) { 'piece_justificative' } + + context 'does not call template.purge_later when a file is attached' do + let(:attached) { true } + + it { is_expected.not_to have_received(:purge_later) } + end + end + end + end end end diff --git a/spec/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml_spec.rb b/spec/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml_spec.rb index a28649fe1..121e08044 100644 --- a/spec/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml_spec.rb +++ b/spec/views/new_gestionnaire/dossiers/_identite_entreprise.html.haml_spec.rb @@ -1,12 +1,11 @@ describe 'new_gestionnaire/dossiers/identite_entreprise.html.haml', type: :view do - before { render 'new_gestionnaire/dossiers/identite_entreprise.html.haml', entreprise: entreprise } + before { render 'new_gestionnaire/dossiers/identite_entreprise.html.haml', etablissement: etablissement } context "there is an association" do - let(:rna_information) { create(:rna_information) } - let(:entreprise) { rna_information.entreprise } + let(:etablissement) { create(:etablissement, :is_association) } context "date_publication is missing on rna" do - before { rna_information.update(date_publication: nil) } + before { etablissement.update(association_date_publication: nil) } it "can render without error" do expect(rendered).to include("Date de publication :") diff --git a/spec/views/new_gestionnaire/dossiers/show.html.haml_spec.rb b/spec/views/new_gestionnaire/dossiers/show.html.haml_spec.rb index 7ac72030c..4ea0f1caa 100644 --- a/spec/views/new_gestionnaire/dossiers/show.html.haml_spec.rb +++ b/spec/views/new_gestionnaire/dossiers/show.html.haml_spec.rb @@ -3,8 +3,8 @@ describe 'new_gestionnaire/dossiers/show.html.haml', type: :view do let(:current_gestionnaire) { create(:gestionnaire) } let(:individual) { nil } - let(:entreprise) { nil } - let(:dossier) { create(:dossier, :en_construction, entreprise: entreprise, individual: individual) } + let(:etablissement) { nil } + let(:dossier) { create(:dossier, :en_construction, etablissement: etablissement, individual: individual) } before do assign(:dossier, dossier) @@ -12,19 +12,19 @@ describe 'new_gestionnaire/dossiers/show.html.haml', type: :view do render end - context "when dossier was created by an entreprise" do - let(:entreprise) { create(:entreprise) } + context "when dossier was created by an etablissement" do + let(:etablissement) { create(:etablissement) } - it { expect(rendered).to include(entreprise.decorate.raison_sociale_or_name) } - it { expect(rendered).to include(entreprise.decorate.siret_siege_social) } - it { expect(rendered).to include(entreprise.decorate.forme_juridique) } + it { expect(rendered).to include(etablissement.entreprise_raison_sociale_or_name) } + it { expect(rendered).to include(etablissement.entreprise_siret_siege_social) } + it { expect(rendered).to include(etablissement.entreprise_forme_juridique) } context "and entreprise is an association" do - let(:entreprise) { create(:entreprise, :is_association) } + let(:etablissement) { create(:etablissement, :is_association) } - it { expect(rendered).to include(entreprise.rna_information.association_id) } - it { expect(rendered).to include(entreprise.rna_information.titre) } - it { expect(rendered).to include(entreprise.rna_information.objet) } + it { expect(rendered).to include(etablissement.association_rna) } + it { expect(rendered).to include(etablissement.association_titre) } + it { expect(rendered).to include(etablissement.association_objet) } end end