diff --git a/app/controllers/administrateurs/procedures_controller.rb b/app/controllers/administrateurs/procedures_controller.rb index 08f39c5ec..f40976d1d 100644 --- a/app/controllers/administrateurs/procedures_controller.rb +++ b/app/controllers/administrateurs/procedures_controller.rb @@ -1,7 +1,7 @@ module Administrateurs class ProceduresController < AdministrateurController - before_action :retrieve_procedure, only: [:champs, :annotations, :edit, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :allow_expert_review, :experts_require_administrateur_invitation] - before_action :procedure_revisable?, only: [:champs, :annotations] + before_action :retrieve_procedure, only: [:champs, :annotations, :modifications, :edit, :monavis, :update_monavis, :jeton, :update_jeton, :publication, :publish, :transfert, :allow_expert_review, :experts_require_administrateur_invitation] + before_action :procedure_revisable?, only: [:champs, :annotations, :modifications] ITEMS_PER_PAGE = 25 @@ -172,6 +172,9 @@ module Administrateurs def jeton end + def modifications + end + def update_jeton token = params[:procedure][:api_entreprise_token] @procedure.api_entreprise_token = token diff --git a/app/javascript/components/shared/maplibre/MapLibre.tsx b/app/javascript/components/shared/maplibre/MapLibre.tsx index 1c29341c3..a7ddf4191 100644 --- a/app/javascript/components/shared/maplibre/MapLibre.tsx +++ b/app/javascript/components/shared/maplibre/MapLibre.tsx @@ -8,7 +8,8 @@ import React, { createContext, useCallback } from 'react'; -import maplibre, { Map, Style, NavigationControl } from 'maplibre-gl'; +import maplibre, { Map, NavigationControl } from 'maplibre-gl'; +import type { Style } from 'maplibre-gl'; import invariant from 'tiny-invariant'; diff --git a/app/javascript/components/shared/maplibre/styles/base.ts b/app/javascript/components/shared/maplibre/styles/base.ts index cc7c880ee..0a577d4c3 100644 --- a/app/javascript/components/shared/maplibre/styles/base.ts +++ b/app/javascript/components/shared/maplibre/styles/base.ts @@ -3,10 +3,12 @@ import invariant from 'tiny-invariant'; import cadastreLayers from './layers/cadastre'; -const IGN_TOKEN = 'rc1egnbeoss72hxvd143tbyk'; // ggignore - -function ignServiceURL(layer: string, format = 'image/png') { - const url = `https://wxs.ign.fr/${IGN_TOKEN}/geoportail/wmts`; +function ignServiceURL( + layer: string, + env = 'decouverte', + format = 'image/png' +) { + const url = `https://wxs.ign.fr/${env}/geoportail/wmts`; const query = 'service=WMTS&request=GetTile&version=1.0.0&tilematrixset=PM&tilematrix={z}&tilecol={x}&tilerow={y}&style=normal'; @@ -125,7 +127,10 @@ function buildSources() { .flatMap(({ layers }) => layers.map(([, code]) => code)) .map((code) => [ getLayerCode(code), - rasterSource([ignServiceURL(code)], 'IGN-F/Géoportail/MNHN') + rasterSource( + [ignServiceURL(code, 'environnement')], + 'IGN-F/Géoportail/MNHN' + ) ]) ); } @@ -210,7 +215,7 @@ export default { url: 'https://openmaptiles.geo.data.gouv.fr/data/france-vector.json' }, 'photographies-aeriennes': rasterSource( - [ignServiceURL('ORTHOIMAGERY.ORTHOPHOTOS', 'image/jpeg')], + [ignServiceURL('ORTHOIMAGERY.ORTHOPHOTOS', 'decouverte', 'image/jpeg')], 'IGN-F/Géoportail' ), cadastre: { @@ -218,7 +223,7 @@ export default { url: 'https://openmaptiles.geo.data.gouv.fr/data/cadastre.json' }, 'plan-ign': rasterSource( - [ignServiceURL('GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2')], + [ignServiceURL('GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2', 'decouverte')], 'IGN-F/Géoportail' ), ...buildSources() diff --git a/app/javascript/components/shared/maplibre/styles/layers/cadastre.ts b/app/javascript/components/shared/maplibre/styles/layers/cadastre.ts index 759504f97..4ef68ed6b 100644 --- a/app/javascript/components/shared/maplibre/styles/layers/cadastre.ts +++ b/app/javascript/components/shared/maplibre/styles/layers/cadastre.ts @@ -1,4 +1,4 @@ -import { AnyLayer } from 'maplibre-gl'; +import type { AnyLayer } from 'maplibre-gl'; const layers: AnyLayer[] = [ { diff --git a/app/javascript/components/shared/maplibre/utils.ts b/app/javascript/components/shared/maplibre/utils.ts index 8ab08c181..f3974b463 100644 --- a/app/javascript/components/shared/maplibre/utils.ts +++ b/app/javascript/components/shared/maplibre/utils.ts @@ -1,10 +1,6 @@ -import { - LngLatBounds, - LngLat, - LngLatLike, - LngLatBoundsLike -} from 'maplibre-gl'; +import type { LngLat, LngLatLike, LngLatBoundsLike } from 'maplibre-gl'; import type { Geometry, FeatureCollection, Feature } from 'geojson'; +import { LngLatBounds } from 'maplibre-gl'; import invariant from 'tiny-invariant'; export function getBounds(geometry: Geometry): LngLatBoundsLike { diff --git a/app/models/procedure.rb b/app/models/procedure.rb index dcc5bf8f9..f1df0ab39 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -653,6 +653,10 @@ class Procedure < ApplicationRecord !AssignTo.exists?(groupe_instructeur: groupe_instructeurs) end + def revised? + feature_enabled?(:procedure_revisions) && revisions.size > 2 + end + def routee? routing_enabled? || groupe_instructeurs.size > 1 end diff --git a/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml b/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml index d2e13821f..dd043c6f7 100644 --- a/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml +++ b/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml @@ -36,9 +36,9 @@ = t("update_drop_down_options#{postfix}", scope: [:administrateurs, :revision_changes], label: change[:label]) %ul - if added.present? - %li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{term.strip} »" }.join(", ")) + %li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{term.strip} »" }.join(", ")) - if removed.present? - %li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{term.strip} »" }.join(", ")) + %li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{term.strip} »" }.join(", ")) - when :drop_down_other - if change[:from] == false %li.mb-1= t("administrateurs.revision_changes.update_drop_down_other#{postfix}.enabled", label: change[:label]) @@ -51,6 +51,6 @@ = t("update_carte_layers#{postfix}", scope: [:administrateurs, :revision_changes], label: change[:label]) %ul - if added.present? - %li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", ")) + %li= t(:add_option, scope: [:administrateurs, :revision_changes], items: added.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", ")) - if removed.present? - %li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", ")) + %li= t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", ")) diff --git a/app/views/administrateurs/procedures/modifications.html.haml b/app/views/administrateurs/procedures/modifications.html.haml new file mode 100644 index 000000000..1e7ca13c0 --- /dev/null +++ b/app/views/administrateurs/procedures/modifications.html.haml @@ -0,0 +1,18 @@ += render partial: 'administrateurs/breadcrumbs', + locals: { steps: [link_to('Démarches', admin_procedures_path), + link_to(@procedure.libelle, admin_procedure_path(@procedure)), + 'Modifications'] } +.container + %h1.page-title + Historique des modifications du formulaire + +.container + - previous_revision = nil + - @procedure.revisions.each do |revision| + - if previous_revision.present? && !revision.draft? + - changes = previous_revision.compare(revision) + - if changes.present? + .card.mb-4 + %h2.card-title= "Modifications publiées le #{l(revision.published_at, format: '%d %B %Y à %R')}" + = render partial: 'revision_changes', locals: { changes: changes } + - previous_revision = revision diff --git a/app/views/administrateurs/procedures/show.html.haml b/app/views/administrateurs/procedures/show.html.haml index 6dd302899..aac9ca636 100644 --- a/app/views/administrateurs/procedures/show.html.haml +++ b/app/views/administrateurs/procedures/show.html.haml @@ -56,7 +56,7 @@ - error_messages = @procedure.errors.messages_for(:draft_types_de_champ).to_sentence = link_to champs_admin_procedure_path(@procedure), class: 'card-admin', title: error_messages do - - if @procedure.draft_types_de_champ.count == 0 + - if @procedure.draft_types_de_champ.empty? %div %span.icon.clock %p.card-admin-status-todo À faire @@ -70,7 +70,7 @@ %p.card-admin-status-accept Validé %div %p.card-admin-title - %span.badge.baseline= @procedure.draft_types_de_champ.count + %span.badge.baseline= @procedure.draft_types_de_champ.size Champs du formulaire %p.card-admin-subtitle À remplir par les usagers %p.button Modifier @@ -109,13 +109,13 @@ %p.card-admin-status-accept Validé %div %p.card-admin-title - %span.badge.baseline= @procedure.administrateurs.count - #{"Administrateur".pluralize(@procedure.administrateurs.count)} + %span.badge.baseline= @procedure.administrateurs.size + #{"Administrateur".pluralize(@procedure.administrateurs.size)} %p.card-admin-subtitle Gestion de la démarche %p.button Modifier = link_to admin_procedure_groupe_instructeurs_path(@procedure), id: 'groupe-instructeurs', class: 'card-admin' do - - if @procedure.routee? || @procedure.instructeurs.count > 1 + - if @procedure.routee? || @procedure.instructeurs.size > 1 %div %span.icon.accept %p.card-admin-status-accept Validé @@ -126,14 +126,27 @@ %div %p.card-admin-title - if @procedure.routee? - %span.badge.baseline= @procedure.groupe_instructeurs.count + %span.badge.baseline= @procedure.groupe_instructeurs.size - else - %span.badge.baseline= @procedure.instructeurs.count + %span.badge.baseline= @procedure.instructeurs.size - = @procedure.routee? ? "Groupe Instructeurs" : "#{"Instructeur".pluralize(@procedure.instructeurs.count)}" + = @procedure.routee? ? "Groupe Instructeurs" : "#{"Instructeur".pluralize(@procedure.instructeurs.size)}" %p.card-admin-subtitle Suivi des dossiers %p.button Modifier + - if @procedure.revised? + = link_to modifications_admin_procedure_path(@procedure), id: 'modifications', class: 'card-admin' do + %div + %span.icon.accept + %p.card-admin-status-accept Activée + %div + %p.card-admin-title + %span.badge.baseline= @procedure.revisions.size - 1 + Modifications + + %p.card-admin-subtitle Historique des modifications du formulaire + %p.button Voir + %h2.procedure-admin-explanation Pour aller plus loin .procedure-grid diff --git a/config/environments/development.rb b/config/environments/development.rb index ba0946324..5dece6879 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -105,9 +105,5 @@ Rails.application.configure do # Uncomment if you wish to allow Action Cable access from any origin. # config.action_cable.disable_request_forgery_protection = true - if ENV['IGN_CARTE_REFERER'] - config.hosts << ENV['IGN_CARTE_REFERER'] - end - config.hosts << ENV.fetch("APP_HOST") end diff --git a/config/locales/links.en.yml b/config/locales/links.en.yml index aa4eb0b86..474d7b672 100644 --- a/config/locales/links.en.yml +++ b/config/locales/links.en.yml @@ -56,7 +56,7 @@ en: mentions_legales: label: "Legal notices" title: "Legal notices" - url: "https//doc.demarches-simplifiees.fr/mentions-legales" + url: "https://doc.demarches-simplifiees.fr/mentions-legales" newsletter: label: "Newsletter" title: "Notre newsletter" diff --git a/config/locales/links.fr.yml b/config/locales/links.fr.yml index aeb962996..f55690670 100644 --- a/config/locales/links.fr.yml +++ b/config/locales/links.fr.yml @@ -56,7 +56,7 @@ fr: mentions_legales: label: "Mentions légales" title: "Mentions légales" - url: "https//doc.demarches-simplifiees.fr/mentions-legales" + url: "https://doc.demarches-simplifiees.fr/mentions-legales" newsletter: label: "Newsletter" title: "Notre newsletter" diff --git a/config/locales/views/administrateurs/revision_changes/fr.yml b/config/locales/views/administrateurs/revision_changes/fr.yml index 4f1be5a0b..9c9e8b9e6 100644 --- a/config/locales/views/administrateurs/revision_changes/fr.yml +++ b/config/locales/views/administrateurs/revision_changes/fr.yml @@ -3,47 +3,47 @@ fr: revision_changes: attestation_template: add: Un model d’attestation à été ajouté - update_title: Le titre de l’attestation à été modifié. Le nouveau titre est « %{to} » + update_title: Le titre de l’attestation à été modifié. Le nouveau titre est « %{to} » update_body: Le corps du document de l’attestation à été modifié update_footer: Le pied de page de l’attestation à été modifié - update_logo: Le logo de l’attestation à été modifié. Le nouveau logo est « %{to} » - update_signature: La signature de l’attestation à été modifié. La nouvelle signature est « %{to} » + update_logo: Le logo de l’attestation à été modifié. Le nouveau logo est « %{to} » + update_signature: La signature de l’attestation à été modifié. La nouvelle signature est « %{to} » has_changes: Modifications en cours (appliqué à la prochaine publication) - add: Le champ « %{label} » a été ajouté - remove: Le champ « %{label} » a été supprimé + add: Le champ « %{label} » a été ajouté + remove: Le champ « %{label} » a été supprimé move: one: La position d’un champ a été modifiée other: Les positions de %{count} champs ont été modifiées - update_libelle: Le libellé du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} » - update_description: La description du champ « %{label} » a été modifiée. La nouvelle description est « %{to} » - update_drop_down_secondary_libelle: Le libellé secondaire du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} » - update_drop_down_secondary_description: La description secondaire du champ « %{label} » a été modifiée. La nouvelle description est « %{to} » - update_type_champ: Le type du champ « %{label} » a été modifié. Il est maintenant de type « %{to} » + update_libelle: Le libellé du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} » + update_description: La description du champ « %{label} » a été modifiée. La nouvelle description est « %{to} » + update_drop_down_secondary_libelle: Le libellé secondaire du champ « %{label} » a été modifié. Le nouveau libellé est « %{to} » + update_drop_down_secondary_description: La description secondaire du champ « %{label} » a été modifiée. La nouvelle description est « %{to} » + update_type_champ: Le type du champ « %{label} » a été modifié. Il est maintenant de type « %{to} » update_mandatory: - enabled: Le champ « %{label} » est maintenant obligatoire - disabled: Le champ « %{label} » n’est plus obligatoire - update_piece_justificative_template: Le modèle de pièce justificative du champ « %{label} » a été modifié - update_drop_down_options: Les options de sélection du champ « %{label} » ont été modifiées + enabled: Le champ « %{label} » est maintenant obligatoire + disabled: Le champ « %{label} » n’est plus obligatoire + update_piece_justificative_template: Le modèle de pièce justificative du champ « %{label} » a été modifié + update_drop_down_options: Les options de sélection du champ « %{label} » ont été modifiées update_drop_down_other: - enabled: Le champ « %{label} » comporte maintenant un choix « Autre » - disabled: Le champ « %{label} » ne comporte plus de choix « Autre » - update_carte_layers: Les référentiels cartographiques du champ « %{label} » ont été modifiés - add_private: L’annotation privée « %{label} » a été ajoutée - remove_private: L’annotation privée « %{label} » a été supprimée + enabled: Le champ « %{label} » comporte maintenant un choix « Autre » + disabled: Le champ « %{label} » ne comporte plus de choix « Autre » + update_carte_layers: Les référentiels cartographiques du champ « %{label} » ont été modifiés + add_private: L’annotation privée « %{label} » a été ajoutée + remove_private: L’annotation privée « %{label} » a été supprimée move_private: one: La position d’une annotation privée a été modifiée other: Les positions de %{count} annotations privées ont été modifiées - update_libelle_private: Le libellé de l’annotation privée « %{label} » a été modifié. Le nouveau libellé est « %{to} » - update_description_private: La description de l’annotation privée « %{label} » a été modifiée. La nouvelle description est « %{to} » - update_drop_down_secondary_libelle_private: Le libellé secondaire de l’annotation « %{label} » a été modifié. Le nouveau libellé est « %{to} » - update_drop_down_secondary_description_private: La description secondaire de l’annotation « %{label} » a été modifiée. La nouvelle description est « %{to} » - update_type_champ_private: Le type de l’annotation privée « %{label} » a été modifié. Elle est maintenant de type « %{to} » + update_libelle_private: Le libellé de l’annotation privée « %{label} » a été modifié. Le nouveau libellé est « %{to} » + update_description_private: La description de l’annotation privée « %{label} » a été modifiée. La nouvelle description est « %{to} » + update_drop_down_secondary_libelle_private: Le libellé secondaire de l’annotation « %{label} » a été modifié. Le nouveau libellé est « %{to} » + update_drop_down_secondary_description_private: La description secondaire de l’annotation « %{label} » a été modifiée. La nouvelle description est « %{to} » + update_type_champ_private: Le type de l’annotation privée « %{label} » a été modifié. Elle est maintenant de type « %{to} » update_mandatory_private: - enabled: L’annotation privée « %{label} » est maintenant obligatoire - disabled: L’annotation privée « %{label} » n’est plus obligatoire - update_piece_justificative_template_private: Le modèle de pièce justificative de l’annotation privée « %{label} » a été modifié - update_drop_down_options_private: Les options de sélection de l’annotation privée « %{label} » ont été modifiées - update_carte_layers_private: Les référentiels cartographiques de l’annotation privée « %{label} » ont été modifiés + enabled: L’annotation privée « %{label} » est maintenant obligatoire + disabled: L’annotation privée « %{label} » n’est plus obligatoire + update_piece_justificative_template_private: Le modèle de pièce justificative de l’annotation privée « %{label} » a été modifié + update_drop_down_options_private: Les options de sélection de l’annotation privée « %{label} » ont été modifiées + update_carte_layers_private: Les référentiels cartographiques de l’annotation privée « %{label} » ont été modifiés add_option: "ajoutés : %{items}" remove_option: "supprimés : %{items}" carte_layers: diff --git a/config/routes.rb b/config/routes.rb index b99c8a88f..92b142ca6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -408,6 +408,7 @@ Rails.application.routes.draw do get 'apercu' get 'champs' get 'annotations' + get 'modifications' get 'monavis' patch 'update_monavis' get 'jeton' diff --git a/lib/tasks/deployment/20200401123317_process_expired_dossiers_en_construction.rake b/lib/tasks/deployment/20200401123317_process_expired_dossiers_en_construction.rake index cf7113c98..23c0692b9 100644 --- a/lib/tasks/deployment/20200401123317_process_expired_dossiers_en_construction.rake +++ b/lib/tasks/deployment/20200401123317_process_expired_dossiers_en_construction.rake @@ -3,21 +3,19 @@ namespace :after_party do task process_expired_dossiers_en_construction: :environment do puts "Running deploy task 'process_expired_dossiers_en_construction'" - if ENV['APP_NAME'] == 'tps' - dossiers_close_to_expiration = Dossier - .en_construction_close_to_expiration - .without_en_construction_expiration_notice_sent + dossiers_close_to_expiration = Dossier + .en_construction_close_to_expiration + .without_en_construction_expiration_notice_sent - ExpiredDossiersDeletionService.send_expiration_notices(dossiers_close_to_expiration) + ExpiredDossiersDeletionService.send_expiration_notices(dossiers_close_to_expiration, :en_construction_close_to_expiration_notice_sent_at) - BATCH_SIZE = 1000 + BATCH_SIZE = 1000 - ((dossiers_close_to_expiration.count / BATCH_SIZE).ceil + 1).times do |n| - dossiers_close_to_expiration - .offset(n * BATCH_SIZE) - .limit(BATCH_SIZE) - .update_all(en_construction_close_to_expiration_notice_sent_at: Time.zone.now + n.days) - end + ((dossiers_close_to_expiration.count / BATCH_SIZE).ceil + 1).times do |n| + dossiers_close_to_expiration + .offset(n * BATCH_SIZE) + .limit(BATCH_SIZE) + .update_all(en_construction_close_to_expiration_notice_sent_at: Time.zone.now + n.days) end # Update task as completed. If you remove the line below, the task will diff --git a/lib/tasks/deployment/20200630154829_add_traitements_from_dossiers.rake b/lib/tasks/deployment/20200630154829_add_traitements_from_dossiers.rake index 9940c9843..37f8da244 100644 --- a/lib/tasks/deployment/20200630154829_add_traitements_from_dossiers.rake +++ b/lib/tasks/deployment/20200630154829_add_traitements_from_dossiers.rake @@ -6,7 +6,7 @@ namespace :after_party do dossiers_termines = Dossier.state_termine progress = ProgressReport.new(dossiers_termines.count) dossiers_termines.find_each do |dossier| - dossier.traitements.create!(state: dossier.state, motivation: dossier.motivation, processed_at: dossier.processed_at) + dossier.traitements.find_or_create_by!(state: dossier.state, motivation: dossier.motivation, processed_at: dossier.processed_at) progress.inc end progress.finish diff --git a/lib/tasks/deployment/20200813111957_fix_geo_areas_geometry.rake b/lib/tasks/deployment/20200813111957_fix_geo_areas_geometry.rake index 3969494b9..53a4c718b 100644 --- a/lib/tasks/deployment/20200813111957_fix_geo_areas_geometry.rake +++ b/lib/tasks/deployment/20200813111957_fix_geo_areas_geometry.rake @@ -18,7 +18,7 @@ namespace :after_party do geometry_collections.find_each do |geometry_collection| geometry_collection.geometry['geometries'].each do |geometry| if valid_geometry?(geometry) - geometry_collection.champ.geo_areas.create!(geometry: geometry, source: 'selection_utilisateur') + geometry_collection.champ.geo_areas.find_or_create_by!(geometry: geometry, source: 'selection_utilisateur') end end @@ -36,7 +36,7 @@ namespace :after_party do } if valid_geometry?(geometry) - multi_line_string.champ.geo_areas.create!(geometry: geometry, source: 'selection_utilisateur') + multi_line_string.champ.geo_areas.find_or_create_by!(geometry: geometry, source: 'selection_utilisateur') end end @@ -54,7 +54,7 @@ namespace :after_party do } if valid_geometry?(geometry) - multi_polygon.champ.geo_areas.create!(geometry: geometry, source: 'selection_utilisateur') + multi_polygon.champ.geo_areas.find_or_create_by!(geometry: geometry, source: 'selection_utilisateur') end end