Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion site/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ organizer qui se termine par l'interactor `Admin::TrackActivity`.
## Local Login (dev only)
Bypass ProConnect via: `/compte/dev-login?email=user@yopmail.com`

Available test emails: `user@yopmail.com`, `contact_technique@yopmail.com`, `editeur@yopmail.com`, `user10@yopmail.com`
Available test emails: `user@yopmail.com`, `contact_technique@yopmail.com`, `contact_metier@yopmail.com`, `editeur@yopmail.com`, `user10@yopmail.com`

## Sentry / Production Errors

Expand Down
15 changes: 15 additions & 0 deletions site/app/assets/stylesheets/dsfr-extensions.scss
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,21 @@
}
}

.fr-table--stretch {
.fr-table__content {
overflow-x: auto;
}

table {
display: table;
width: 100%;
}

td, th {
overflow: visible;
}
}

.fr-table--large {
width: 1200px !important;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ module AuthorizationRequestsManagement

def show
@authorization_request = extract_authorization_request
@main_token = @authorization_request.token.decorate
@other_tokens = @authorization_request.tokens.where.not(id: @main_token.id).decorate
@tokens = @authorization_request.tokens.order(created_at: :desc).decorate
load_delegations_data

render 'shared/authorization_requests/show'
Expand All @@ -22,7 +21,7 @@ def index
.viewable_by_users
.order(
first_submitted_at: :desc
).includes(:active_token)
).includes(:user_authorization_request_roles)

render 'shared/authorization_requests/index'
end
Expand Down
33 changes: 33 additions & 0 deletions site/app/lib/seeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ class Seeds
def perform
@user = create_main_user
@contact = create_contact
@contact_metier = create_contact_metier

create_editor
create_provider_user
Expand Down Expand Up @@ -52,6 +53,7 @@ def create_data_for_api_entreprise
create_api_entreprise_token_blacklisted
create_api_entreprise_token_expired
create_api_entreprise_authorization_refused
create_api_entreprise_contact_technique_only
end

def create_data_for_api_particulier
Expand Down Expand Up @@ -80,6 +82,14 @@ def create_contact
)
end

def create_contact_metier
create_user(
email: 'contact_metier@yopmail.com',
first_name: 'Camille',
last_name: 'Bernard'
)
end

def create_editor
@editor = Editor.create!(
name: 'MGDIS',
Expand Down Expand Up @@ -184,8 +194,10 @@ def create_api_entreprise_token_valid
token_params: { id: '00000000-0000-0000-0000-000000000000' },
demandeur: @user,
contact_technique: @contact,
contact_metier: @contact_metier,
authorization_request_params: {
intitule: 'Mairie de Lyon 2',
description: 'Récupération automatique des informations légales et financières des entreprises pour l\'instruction des demandes de subventions par les agents habilités.',
external_id: 102,
status: :validated,
validated_at: 2.weeks.ago,
Expand Down Expand Up @@ -222,6 +234,7 @@ def create_api_entreprise_token_blacklisted
demandeur: @user,
authorization_request_params: {
intitule: 'Mairie de Paris',
description: 'Récupération automatique des pièces justificatives des entreprises candidates dans le cadre de la passation des marchés publics.',
external_id: 104,
status: :validated,
validated_at: 1.week.ago,
Expand All @@ -239,6 +252,7 @@ def create_api_entreprise_token_expired
demandeur: @user,
authorization_request_params: {
intitule: 'Mairie de Montpellier',
description: 'Préremplissage des informations des entreprises et associations pour les démarches en ligne des usagers de la collectivité.',
external_id: 105,
status: :validated,
api: 'entreprise',
Expand All @@ -255,6 +269,7 @@ def create_api_entreprise_authorization_refused
authorization_request: create_authorization_request(
api: 'entreprise',
intitule: 'Mairie de Bruges',
description: 'Accès aux données ouvertes permettant aux usagers de pré-remplir les informations liées à leur entreprise.',
status: :refused,
external_id: 106,
first_submitted_at: 2.years.ago,
Expand All @@ -265,6 +280,23 @@ def create_api_entreprise_authorization_refused
)
end

def create_api_entreprise_contact_technique_only
create_token(
@scopes_entreprise.sample(3),
'entreprise',
demandeur: @contact,
contact_technique: @user,
authorization_request_params: {
intitule: 'Mairie de Nantes',
description: 'Contrôle de la validité du SIRET et récupération des informations des entreprises candidates aux marchés publics.',
external_id: 107,
status: :validated,
validated_at: 1.month.ago,
first_submitted_at: 1.month.ago
}
)
end

def create_api_particulier_token_valid
create_token(
@scopes_particulier,
Expand All @@ -274,6 +306,7 @@ def create_api_particulier_token_valid
contact_technique: @contact,
authorization_request_params: {
intitule: 'Mairie de Bordeaux',
description: 'Gestion de la tarification des services périscolaires et de restauration scolaire sur la base du quotient familial par des agents habilités.',
external_id: 201,
status: :validated,
validated_at: 2.weeks.ago,
Expand Down
2 changes: 1 addition & 1 deletion site/app/models/authorization_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def self.ransackable_associations(_)
scope :archived, -> { where(status: 'archived') }
scope :eligible_for_token_creation, -> { where.not(validated_at: nil).where.not(status: %w[archived revoked]) }
scope :for_api, ->(api) { where(api:) }
scope :viewable_by_users, -> { where('status in (?) or validated_at is not null', %w[archived revoked validated]) }
scope :viewable_by_users, -> { where('(status in (?) or validated_at is not null) and status != ?', %w[archived revoked validated], 'refused') }

def token
active_token || most_recent_token
Expand Down
41 changes: 14 additions & 27 deletions site/app/views/shared/authorization_requests/_header.html.erb
Original file line number Diff line number Diff line change
@@ -1,27 +1,14 @@
<div>
<%= authorization_request_status_badge(authorization_request) %>
<% if authorization_request.demarche.present? %>
<span class="fr-badge fr-text--xs">
<i class="fr-icon-attachment-line fr-icon--sm fr-pr-1v" aria-hidden="true"></i>
<%= authorization_request.demarche %>
</span>
<% end %>
<h1 class="fr-h2 fr-mb-n0-5v"><%= authorization_request.intitule %></h1>
</div>
<div>
<span class="fr-text--xs">
<b><%= t('.delivered_at', humanized_date: friendly_format_from_timestamp(authorization_request.created_at)) %></b>
-
<% if to_datapass %>
<%= link_to safe_join([t('shared.links.to_datapass_html', external_id: authorization_request.external_id), content_tag(:span, '(nouvelle fenêtre)', class: 'fr-sr-only')]),
datapass_authorization_request_url(authorization_request),
id: :authorization_request_link,
class: %w(fr-link fr-text--xs),
target: '_blank',
rel: 'noopener noreferrer'
%>
<% else %>
<span> <%= t('shared.links.to_datapass_html', external_id: authorization_request.external_id) %></span>
<% end %>
</span>
</div>
<%= authorization_request_status_badge(authorization_request) %>
<h1 class="fr-h2 fr-mb-1v"><%= authorization_request.intitule %></h1>

<% if authorization_request.description.present? %>
<p class="fr-text--lead fr-mb-2w"><%= authorization_request.description %></p>
<% end %>

<p class="fr-text--sm fr-mb-1v"><%= t('.request_number_html', external_id: authorization_request.external_id) %></p>

<% if authorization_request.demarche.present? %>
<p class="fr-text--sm fr-mb-1v"><%= t('.form_used_html', name: authorization_request.demarche) %></p>
<% end %>

<p class="fr-text--sm fr-mb-0"><%= t('.delivered_at_html', humanized_date: friendly_format_from_timestamp(authorization_request.created_at)) %></p>
88 changes: 30 additions & 58 deletions site/app/views/shared/authorization_requests/index.html.erb
Original file line number Diff line number Diff line change
@@ -1,76 +1,48 @@
<div class="fr-container">
<div class="fr-grid-row">
<div class="fr-col-12">
<%= link_to t('.links.profile'), user_profile_path, class: %w(fr-link fr-icon-account-fill fr-link--icon-left fr-text--lg pull-right fr-mb-2w ) %>
<%= link_to t('.links.profile'), user_profile_path, class: %w(fr-link fr-icon-account-fill fr-link--icon-left fr-text--lg pull-right fr-mb-2w) %>
</div>
<div class="fr-col-12">
<h1 class="fr-h1 fr-mb-4w">
<% if @authorization_requests.empty? %>
<%= t('.no_authorization_requests') %>
<% else %>
<%= t('.title', api_label: t(".#{@authorization_requests.first.api}"), count: @authorization_requests.count).html_safe %>
<%= t('.title', api_label: t(".#{@authorization_requests.first.api}")).html_safe %>
<% end %>
</h1>
</div>
</div>
<div class="fr-row">
<div class="fr-col-12">
<div class="fr-container fr-container--bordered fr-p-0">
<div class="fr-grid-row fr-p-4v fr-grid-row--middle fr-grid-row--gutters">
<div class="fr-col-12 fr-col-sm-3">
<strong><%= t('.table.head.authorization_request') %></strong>
</div>
<div class="fr-col-12 fr-col-sm-4">
<strong><%= t('.table.head.token') %></strong>
</div>
<div class="fr-col-12 fr-col-sm">
<strong><%= t('.table.head.actions') %></strong>
</div>
<div class="fr-col-12 fr-col-sm">
<strong><%= t('.table.head.detail') %></strong>
</div>
</div>
<% @authorization_requests.each do |authorization_request| %>
<div id="<%= dom_id(authorization_request) %>" class="fr-grid-row fr-grid-row--gutters fr-grid-row--middle fr-p-4v">
<div class="fr-col-12 fr-col-sm-3">
<h2 class="fr-h6 fr-mb-0"><%= authorization_request.intitule %></h2>
<%= authorization_request_status_badge(authorization_request) %>
<span class="fr-hint-text">
<%= link_to t('.links.to_datapass_html', external_id: authorization_request.external_id),
datapass_authorization_request_url(authorization_request),
id: dom_id(authorization_request, :authorization_request_link),
class: %w(fr-link fr-text--sm fr-mt-2v),
target: '_blank',
rel: 'noopener noreferrer'
%>
</span>
<span class="fr-text--xs"><span class="fr-icon-user-fill fr-icon--xs fr-pr-1v" aria-hidden="true"></span>Vous êtes
<%= authorization_request.user_authorization_request_roles.for_user(@current_user).map { |uarr|
I18n.t("user_authorization_request_roles.role.#{uarr.role}")
}.join(', ')
%>
</span>
</div>
<div class="fr-col-12 fr-col-sm-4">
<% displayed_tokens = authorization_request.tokens.active.to_a %>
<% displayed_tokens = [authorization_request.token].compact if displayed_tokens.empty? %>
<% displayed_tokens.each_with_index do |token, index| %>
<div id="<%= dom_id(token) %>" class="<%= 'fr-pt-6v' if index.positive? %>">
<%= render partial: 'shared/tokens/detail_short', locals: { token: token.decorate } %>
</div>
<% end %>
</div>
<div class="fr-col-12 fr-col-sm">
<% authorization_request_expected_actions(authorization_request, current_user).each do |action| %>
<%= render partial: "shared/authorization_requests/actions/#{action[:action]}", locals: { label: action[:label], authorization_request:, to_datapass_reopen: action[:to_datapass_reopen] } %>
<% end %>
</div>
<div class="fr-col-12 fr-col-sm">
<%= link_to "Plus d'informations", authorization_request_path(authorization_request), class: %w[fr-btn fr-btn--tertiary center] %>
<div class="fr-grid-row fr-grid-row--gutters">
<% @authorization_requests.each do |authorization_request| %>
<div class="fr-col-12 fr-col-md-6 fr-col-lg-4">
<div id="<%= dom_id(authorization_request) %>" class="fr-card fr-enlarge-link">
<div class="fr-card__body">
<div class="fr-card__content">
<h2 class="fr-card__title">
<%= link_to authorization_request.intitule, authorization_request_path(authorization_request) %>
</h2>
<p class="fr-card__desc">
<%= t('.links.to_datapass', external_id: authorization_request.external_id).html_safe %>
</p>
<div class="fr-card__start">
<ul class="fr-badges-group">
<li>
<%= authorization_request_status_badge(authorization_request) %>
</li>
</ul>
</div>
<div class="fr-card__end">
<p class="fr-card__detail fr-icon-user-line">
<%= authorization_request.user_authorization_request_roles.select { |uarr| uarr.user_id == current_user.id }.map { |uarr|
I18n.t("user_authorization_request_roles.role.#{uarr.role}")
}.join(', ').capitalize %>
</p>
</div>
</div>
</div>
<% end %>
</div>
</div>
</div>
<% end %>
</div>
</div>
Loading
Loading