From 3e8db0e43ee059fad50f91919da1982fb8f5486f Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Wed, 11 Aug 2021 19:22:08 +0200
Subject: [PATCH] qualiopi wip

---
 .../features/education/programs_controller.rb |  36 +--
 .../qualiopi/criterions_controller.rb         |  47 +--
 .../qualiopi/indicators_controller.rb         |  60 +---
 .../features/websites/sites_controller.rb     |  40 +--
 .../features/education/qualiopi/criterion.rb  |   4 +-
 .../features/education/qualiopi/indicator.rb  |   3 +
 .../qualiopi/criterions/_form.html.erb        |  13 -
 .../_qualiopi_criterion.json.jbuilder         |   2 -
 .../qualiopi/criterions/edit.html.erb         |   3 -
 .../qualiopi/criterions/index.html.erb        |  17 +-
 .../qualiopi/criterions/index.json.jbuilder   |   1 -
 .../qualiopi/criterions/new.html.erb          |   3 -
 .../qualiopi/criterions/show.json.jbuilder    |   1 -
 .../evaluations/_criterion_1.html.erb         |  40 +++
 .../qualiopi/indicators/_form.html.erb        |  20 --
 .../_qualiopi_indicator.json.jbuilder         |   2 -
 .../qualiopi/indicators/edit.html.erb         |   3 -
 .../qualiopi/indicators/index.json.jbuilder   |   1 -
 .../qualiopi/indicators/new.html.erb          |   3 -
 .../qualiopi/indicators/show.html.erb         |  44 +--
 .../qualiopi/indicators/show.json.jbuilder    |   1 -
 config/locales/features/education/fr.yml      |   1 +
 config/routes/admin/features/education.rb     |   4 +-
 ...o_features_education_qualiopi_indicator.rb |   5 +
 db/schema.rb                                  |   3 +-
 db/seeds.rb                                   | 279 ++++++++++++++++++
 26 files changed, 385 insertions(+), 251 deletions(-)
 delete mode 100644 app/views/admin/features/education/qualiopi/criterions/_form.html.erb
 delete mode 100644 app/views/admin/features/education/qualiopi/criterions/_qualiopi_criterion.json.jbuilder
 delete mode 100644 app/views/admin/features/education/qualiopi/criterions/edit.html.erb
 delete mode 100644 app/views/admin/features/education/qualiopi/criterions/index.json.jbuilder
 delete mode 100644 app/views/admin/features/education/qualiopi/criterions/new.html.erb
 delete mode 100644 app/views/admin/features/education/qualiopi/criterions/show.json.jbuilder
 create mode 100644 app/views/admin/features/education/qualiopi/evaluations/_criterion_1.html.erb
 delete mode 100644 app/views/admin/features/education/qualiopi/indicators/_form.html.erb
 delete mode 100644 app/views/admin/features/education/qualiopi/indicators/_qualiopi_indicator.json.jbuilder
 delete mode 100644 app/views/admin/features/education/qualiopi/indicators/edit.html.erb
 delete mode 100644 app/views/admin/features/education/qualiopi/indicators/index.json.jbuilder
 delete mode 100644 app/views/admin/features/education/qualiopi/indicators/new.html.erb
 delete mode 100644 app/views/admin/features/education/qualiopi/indicators/show.json.jbuilder
 create mode 100644 db/migrate/20210811171021_add_glossary_to_features_education_qualiopi_indicator.rb

diff --git a/app/controllers/admin/features/education/programs_controller.rb b/app/controllers/admin/features/education/programs_controller.rb
index 116738332..e2a30b7ba 100644
--- a/app/controllers/admin/features/education/programs_controller.rb
+++ b/app/controllers/admin/features/education/programs_controller.rb
@@ -21,35 +21,24 @@ class Admin::Features::Education::ProgramsController < Admin::Features::Educatio
 
   def create
     @program.university = current_university
-    respond_to do |format|
-      if @program.save
-        format.html { redirect_to [:admin, @program], notice: "Program was successfully created." }
-        format.json { render :show, status: :created, location: @program }
-      else
-        format.html { render :new, status: :unprocessable_entity }
-        format.json { render json: @program.errors, status: :unprocessable_entity }
-      end
+    if @program.save
+      redirect_to [:admin, @program], notice: "Program was successfully created."
+    else
+      render :new, status: :unprocessable_entity
     end
   end
 
   def update
-    respond_to do |format|
-      if @program.update(program_params)
-        format.html { redirect_to [:admin, @program], notice: "Program was successfully updated." }
-        format.json { render :show, status: :ok, location: @program }
-      else
-        format.html { render :edit, status: :unprocessable_entity }
-        format.json { render json: @program.errors, status: :unprocessable_entity }
-      end
+    if @program.update(program_params)
+      redirect_to [:admin, @program], notice: "Program was successfully updated."
+    else
+      render :edit, status: :unprocessable_entity
     end
   end
 
   def destroy
     @program.destroy
-    respond_to do |format|
-      format.html { redirect_to admin_features_education_programs_url, notice: "Program was successfully destroyed." }
-      format.json { head :no_content }
-    end
+    redirect_to admin_features_education_programs_url, notice: "Program was successfully destroyed."
   end
 
   protected
@@ -58,11 +47,8 @@ class Admin::Features::Education::ProgramsController < Admin::Features::Educatio
     super
     add_breadcrumb Features::Education::Program.model_name.human(count: 2), admin_features_education_programs_path
     if @program
-      if @program.persisted?
-        add_breadcrumb @program, [:admin, @program]
-      else
-        add_breadcrumb 'Créer'
-      end
+      @program.persisted? ? add_breadcrumb(@program, [:admin, @program])
+                          : add_breadcrumb('Créer')
     end
   end
 
diff --git a/app/controllers/admin/features/education/qualiopi/criterions_controller.rb b/app/controllers/admin/features/education/qualiopi/criterions_controller.rb
index 5cbf7e19a..36d3ce93d 100644
--- a/app/controllers/admin/features/education/qualiopi/criterions_controller.rb
+++ b/app/controllers/admin/features/education/qualiopi/criterions_controller.rb
@@ -9,58 +9,13 @@ class Admin::Features::Education::Qualiopi::CriterionsController < Admin::Featur
     breadcrumb
   end
 
-  def new
-    breadcrumb
-  end
-
-  def edit
-    breadcrumb
-    add_breadcrumb 'Modifier'
-  end
-
-  def create
-    respond_to do |format|
-      if @criterion.save
-        format.html { redirect_to [:admin, @criterion], notice: "Criterion was successfully created." }
-        format.json { render :show, status: :created, location: [:admin, @criterion] }
-      else
-        format.html { render :new, status: :unprocessable_entity }
-        format.json { render json: @criterion.errors, status: :unprocessable_entity }
-      end
-    end
-  end
-
-  def update
-    respond_to do |format|
-      if @criterion.update(criterion_params)
-        format.html { redirect_to [:admin, @criterion], notice: "Criterion was successfully updated." }
-        format.json { render :show, status: :ok, location: [:admin, @criterion] }
-      else
-        format.html { render :edit, status: :unprocessable_entity }
-        format.json { render json: @criterion.errors, status: :unprocessable_entity }
-      end
-    end
-  end
-
-  def destroy
-    @criterion.destroy
-    respond_to do |format|
-      format.html { redirect_to admin_qualiopi_criterions_url, notice: "Criterion was successfully destroyed." }
-      format.json { head :no_content }
-    end
-  end
-
   protected
 
   def breadcrumb
     super
     add_breadcrumb Features::Education::Qualiopi.model_name.human, admin_features_education_qualiopi_criterions_path
     if @criterion
-      if @criterion.persisted?
-        add_breadcrumb @criterion, [:admin, @criterion]
-      else
-        add_breadcrumb 'Créer'
-      end
+      add_breadcrumb @criterion, [:admin, @criterion]
     end
   end
 
diff --git a/app/controllers/admin/features/education/qualiopi/indicators_controller.rb b/app/controllers/admin/features/education/qualiopi/indicators_controller.rb
index d21e60aac..3a023d562 100644
--- a/app/controllers/admin/features/education/qualiopi/indicators_controller.rb
+++ b/app/controllers/admin/features/education/qualiopi/indicators_controller.rb
@@ -6,73 +6,17 @@ class Admin::Features::Education::Qualiopi::IndicatorsController < Admin::Featur
   end
 
   def show
-    @programs = current_university.features_education_programs
-    @checks = [
-      :prerequisites,
-      :objectives,
-      :duration,
-      :pricing,
-      :registration,
-      :pedagogy,
-      :evaluation,
-      :accessibility
-    ]
     breadcrumb
   end
 
-  def new
-    breadcrumb
-  end
-
-  def edit
-    breadcrumb
-    add_breadcrumb 'Modifier'
-  end
-
-  def create
-    respond_to do |format|
-      if @indicator.save
-        format.html { redirect_to [:admin, @indicator], notice: "Indicator was successfully created." }
-        format.json { render :show, status: :created, location: [:admin, @indicator] }
-      else
-        format.html { render :new, status: :unprocessable_entity }
-        format.json { render json: @indicator.errors, status: :unprocessable_entity }
-      end
-    end
-  end
-
-  def update
-    respond_to do |format|
-      if @indicator.update(indicator_params)
-        format.html { redirect_to [:admin, @indicator], notice: "Indicator was successfully updated." }
-        format.json { render :show, status: :ok, location: [:admin, @indicator] }
-      else
-        format.html { render :edit, status: :unprocessable_entity }
-        format.json { render json: [:admin, @indicator].errors, status: :unprocessable_entity }
-      end
-    end
-  end
-
-  def destroy
-    @indicator.destroy
-    respond_to do |format|
-      format.html { redirect_to admin_qualiopi_indicators_url, notice: "Indicator was successfully destroyed." }
-      format.json { head :no_content }
-    end
-  end
-
   protected
 
   def breadcrumb
     super
     add_breadcrumb Features::Education::Qualiopi.model_name.human(count: 2), admin_features_education_qualiopi_criterions_path
     if @indicator
-      if @indicator.persisted?
-        add_breadcrumb @indicator.criterion, [:admin, @indicator.criterion]
-        add_breadcrumb @indicator, [:admin, @indicator]
-      else
-        add_breadcrumb 'Créer'
-      end
+      add_breadcrumb @indicator.criterion, [:admin, @indicator.criterion]
+      add_breadcrumb @indicator, [:admin, @indicator]
     end
   end
 
diff --git a/app/controllers/admin/features/websites/sites_controller.rb b/app/controllers/admin/features/websites/sites_controller.rb
index d1d25e62b..8f7b03572 100644
--- a/app/controllers/admin/features/websites/sites_controller.rb
+++ b/app/controllers/admin/features/websites/sites_controller.rb
@@ -20,37 +20,26 @@ class Admin::Features::Websites::SitesController < Admin::Features::Websites::Ap
 
   def create
     @site.university = current_university
-    respond_to do |format|
-      if @site.save
-        format.html { redirect_to [:admin, @site], notice: "Site was successfully created." }
-        format.json { render :show, status: :created, location: [:admin, @site] }
-      else
-        breadcrumb
-        format.html { render :new, status: :unprocessable_entity }
-        format.json { render json: @site.errors, status: :unprocessable_entity }
-      end
+    if @site.save
+      redirect_to [:admin, @site], notice: "Site was successfully created."
+    else
+      breadcrumb
+      render :new, status: :unprocessable_entity
     end
   end
 
   def update
-    respond_to do |format|
-      if @site.update(site_params)
-        format.html { redirect_to [:admin, @site], notice: "Site was successfully updated." }
-        format.json { render :show, status: :ok, location: [:admin, @site] }
-      else
-        breadcrumb
-        format.html { render :edit, status: :unprocessable_entity }
-        format.json { render json: @site.errors, status: :unprocessable_entity }
-      end
+    if @site.update(site_params)
+      redirect_to [:admin, @site], notice: "Site was successfully updated."
+    else
+      breadcrumb
+      render :edit, status: :unprocessable_entity
     end
   end
 
   def destroy
     @site.destroy
-    respond_to do |format|
-      format.html { redirect_to admin_features_websites_sites_url, notice: "Site was successfully destroyed." }
-      format.json { head :no_content }
-    end
+    redirect_to admin_features_websites_sites_url, notice: "Site was successfully destroyed."
   end
 
   protected
@@ -59,11 +48,8 @@ class Admin::Features::Websites::SitesController < Admin::Features::Websites::Ap
     super
     add_breadcrumb Features::Websites::Site.model_name.human(count: 2), admin_features_websites_sites_path
     if @site
-      if @site.persisted?
-        add_breadcrumb @site, [:admin, @site]
-      else
-        add_breadcrumb 'Créer'
-      end
+      @site.persisted?  ? add_breadcrumb(@site, [:admin, @site])
+                        : add_breadcrumb('Créer')
     end
   end
 
diff --git a/app/models/features/education/qualiopi/criterion.rb b/app/models/features/education/qualiopi/criterion.rb
index 165c44210..d4d2c8307 100644
--- a/app/models/features/education/qualiopi/criterion.rb
+++ b/app/models/features/education/qualiopi/criterion.rb
@@ -10,7 +10,9 @@
 #  updated_at  :datetime         not null
 #
 class Features::Education::Qualiopi::Criterion < ApplicationRecord
-  has_many :indicators
+  has_many :indicators, dependent: :destroy
+
+  validates :number, uniqueness: true
 
   def to_s
     "Critère #{number}"
diff --git a/app/models/features/education/qualiopi/indicator.rb b/app/models/features/education/qualiopi/indicator.rb
index fdd33a22e..ec78f46ed 100644
--- a/app/models/features/education/qualiopi/indicator.rb
+++ b/app/models/features/education/qualiopi/indicator.rb
@@ -3,6 +3,7 @@
 # Table name: features_education_qualiopi_indicators
 #
 #  id             :uuid             not null, primary key
+#  glossary       :text
 #  level_expected :text
 #  name           :text
 #  non_conformity :text
@@ -24,6 +25,8 @@
 class Features::Education::Qualiopi::Indicator < ApplicationRecord
   belongs_to :criterion
 
+  validates :number, uniqueness: true
+
   def to_s
     "Indicateur #{number}"
   end
diff --git a/app/views/admin/features/education/qualiopi/criterions/_form.html.erb b/app/views/admin/features/education/qualiopi/criterions/_form.html.erb
deleted file mode 100644
index fcfea3933..000000000
--- a/app/views/admin/features/education/qualiopi/criterions/_form.html.erb
+++ /dev/null
@@ -1,13 +0,0 @@
-<%= simple_form_for [:admin, criterion] do |f| %>
-  <div class="row">
-    <div class="col-md-2">
-      <%= f.input :number %>
-    </div>
-    <div class="col-md-10">
-      <%= f.input :name %>
-    </div>
-  </div>
-  <% content_for :buttons do %>
-    <%= submit f %>
-  <% end %>
-<% end %>
diff --git a/app/views/admin/features/education/qualiopi/criterions/_qualiopi_criterion.json.jbuilder b/app/views/admin/features/education/qualiopi/criterions/_qualiopi_criterion.json.jbuilder
deleted file mode 100644
index 03a3305de..000000000
--- a/app/views/admin/features/education/qualiopi/criterions/_qualiopi_criterion.json.jbuilder
+++ /dev/null
@@ -1,2 +0,0 @@
-json.extract! qualiopi_criterion, :id, :number, :name, :description, :created_at, :updated_at
-json.url qualiopi_criterion_url(qualiopi_criterion, format: :json)
diff --git a/app/views/admin/features/education/qualiopi/criterions/edit.html.erb b/app/views/admin/features/education/qualiopi/criterions/edit.html.erb
deleted file mode 100644
index 861cd981f..000000000
--- a/app/views/admin/features/education/qualiopi/criterions/edit.html.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-<% content_for :title, @criterion %>
-
-<%= render 'form', criterion: @criterion %>
diff --git a/app/views/admin/features/education/qualiopi/criterions/index.html.erb b/app/views/admin/features/education/qualiopi/criterions/index.html.erb
index f8c3744a6..fba3e6449 100644
--- a/app/views/admin/features/education/qualiopi/criterions/index.html.erb
+++ b/app/views/admin/features/education/qualiopi/criterions/index.html.erb
@@ -1,14 +1,17 @@
 <% content_for :title, Features::Education::Qualiopi.model_name.human %>
 
-<div class="row">
-  <% @criterions.each do |criterion| %>
-    <div class="col-md-6">
-      <h2 class="mt-5"><%= link_to criterion, [:admin, criterion] %></h2>
-      <p><%= criterion.name %></p>
+<% @criterions.each do |criterion| %>
+  <div class="row">
+    <div class="col-md-5">
+      <h2><%= link_to criterion, [:admin, criterion] %></h2>
+      <p class="lead"><%= criterion.name %></p>
+    </div>
+    <div class="offset-md-1 col-md-6">
       <% criterion.indicators.each do |indicator| %>
         <h3 class="h4"><%= link_to indicator, [:admin, indicator] %></h3>
         <p><%= indicator.name %></p>
       <% end %>
     </div>
-  <% end %>
-</div>
+  </div>
+  <hr class="my-5">
+<% end %>
diff --git a/app/views/admin/features/education/qualiopi/criterions/index.json.jbuilder b/app/views/admin/features/education/qualiopi/criterions/index.json.jbuilder
deleted file mode 100644
index 77519e0c3..000000000
--- a/app/views/admin/features/education/qualiopi/criterions/index.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.array! @qualiopi_criterions, partial: "qualiopi_criterions/qualiopi_criterion", as: :qualiopi_criterion
diff --git a/app/views/admin/features/education/qualiopi/criterions/new.html.erb b/app/views/admin/features/education/qualiopi/criterions/new.html.erb
deleted file mode 100644
index d268b8618..000000000
--- a/app/views/admin/features/education/qualiopi/criterions/new.html.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-<% content_for :title, Features::Education::Qualiopi::Criterion.model_name.human %>
-
-<%= render 'form', criterion: @criterion %>
diff --git a/app/views/admin/features/education/qualiopi/criterions/show.json.jbuilder b/app/views/admin/features/education/qualiopi/criterions/show.json.jbuilder
deleted file mode 100644
index 7cccf9ad5..000000000
--- a/app/views/admin/features/education/qualiopi/criterions/show.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.partial! "qualiopi_criterions/qualiopi_criterion", qualiopi_criterion: @qualiopi_criterion
diff --git a/app/views/admin/features/education/qualiopi/evaluations/_criterion_1.html.erb b/app/views/admin/features/education/qualiopi/evaluations/_criterion_1.html.erb
new file mode 100644
index 000000000..f211ae47a
--- /dev/null
+++ b/app/views/admin/features/education/qualiopi/evaluations/_criterion_1.html.erb
@@ -0,0 +1,40 @@
+<%
+@programs = current_university.features_education_programs
+@checks = [
+  :prerequisites,
+  :objectives,
+  :duration,
+  :pricing,
+  :registration,
+  :pedagogy,
+  :evaluation,
+  :accessibility
+]
+%>
+<table class="table mt-5">
+  <thead>
+    <tr>
+      <th><%= Features::Education::Program.model_name.human %></th>
+      <% @checks.each do |check| %>
+        <th><%= Features::Education::Program.human_attribute_name(check) %></th>
+      <% end %>
+    </tr>
+  </thead>
+  <tbody>
+    <% @programs.each do |program| %>
+      <tr>
+        <td><%= link_to program, [:admin, program] %></td>
+        <% @checks.each do |check| %>
+          <% valid = !program.send(check).blank? %>
+          <th>
+            <% if valid %>
+              <span class="fas fa-check text-success"></span>
+            <% else %>
+              <span class="fas fa-times text-danger"></span>
+            <% end %>
+          </th>
+        <% end %>
+      </tr>
+    <% end %>
+  </tbody>
+</table>
diff --git a/app/views/admin/features/education/qualiopi/indicators/_form.html.erb b/app/views/admin/features/education/qualiopi/indicators/_form.html.erb
deleted file mode 100644
index 03b4ca9fb..000000000
--- a/app/views/admin/features/education/qualiopi/indicators/_form.html.erb
+++ /dev/null
@@ -1,20 +0,0 @@
-<%= simple_form_for [:admin, indicator] do |f| %>
-  <%= f.association :criterion, include_blank: false %>
-  <div class="row">
-    <div class="col-md-2">
-      <%= f.input :number %>
-    </div>
-    <div class="col-md-5">
-      <%= f.input :name, input_html: { rows: 5 } %>
-      <%= f.input :level_expected, input_html: { rows: 5 } %>
-    </div>
-    <div class="col-md-5">
-      <%= f.input :proof, input_html: { rows: 5 } %>
-      <%= f.input :requirement, input_html: { rows: 5 } %>
-      <%= f.input :non_conformity, input_html: { rows: 5 } %>
-    </div>
-  </div>
-  <% content_for :buttons do %>
-    <%= submit f %>
-  <% end %>
-<% end %>
diff --git a/app/views/admin/features/education/qualiopi/indicators/_qualiopi_indicator.json.jbuilder b/app/views/admin/features/education/qualiopi/indicators/_qualiopi_indicator.json.jbuilder
deleted file mode 100644
index e9a595ae6..000000000
--- a/app/views/admin/features/education/qualiopi/indicators/_qualiopi_indicator.json.jbuilder
+++ /dev/null
@@ -1,2 +0,0 @@
-json.extract! qualiopi_indicator, :id, :criterion_id, :number, :name, :level_expected, :proof, :requirement, :non_conformity, :created_at, :updated_at
-json.url qualiopi_indicator_url(qualiopi_indicator, format: :json)
diff --git a/app/views/admin/features/education/qualiopi/indicators/edit.html.erb b/app/views/admin/features/education/qualiopi/indicators/edit.html.erb
deleted file mode 100644
index 11bc32d70..000000000
--- a/app/views/admin/features/education/qualiopi/indicators/edit.html.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-<% content_for :title, @indicator %>
-
-<%= render 'form', indicator: @indicator %>
diff --git a/app/views/admin/features/education/qualiopi/indicators/index.json.jbuilder b/app/views/admin/features/education/qualiopi/indicators/index.json.jbuilder
deleted file mode 100644
index e44b0de71..000000000
--- a/app/views/admin/features/education/qualiopi/indicators/index.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.array! @qualiopi_indicators, partial: "qualiopi_indicators/qualiopi_indicator", as: :qualiopi_indicator
diff --git a/app/views/admin/features/education/qualiopi/indicators/new.html.erb b/app/views/admin/features/education/qualiopi/indicators/new.html.erb
deleted file mode 100644
index 73009c588..000000000
--- a/app/views/admin/features/education/qualiopi/indicators/new.html.erb
+++ /dev/null
@@ -1,3 +0,0 @@
-<% content_for :title, Features::Education::Qualiopi::Indicator.model_name.human %>
-
-<%= render 'form', indicator: @indicator %>
diff --git a/app/views/admin/features/education/qualiopi/indicators/show.html.erb b/app/views/admin/features/education/qualiopi/indicators/show.html.erb
index a935cc4ba..e6bd0979f 100644
--- a/app/views/admin/features/education/qualiopi/indicators/show.html.erb
+++ b/app/views/admin/features/education/qualiopi/indicators/show.html.erb
@@ -3,38 +3,20 @@
 <p class="lead"><%= @indicator.name %></p>
 
 <div class="row">
-  <% [:level_expected, :proof, :requirement, :non_conformity].each do |attribute| %>
-    <div class="col-md-3">
-      <h2 class="h4 mt-4"><%= Features::Education::Qualiopi::Indicator.human_attribute_name(attribute) %></h2>
-      <p><%= @indicator.send attribute %></p>
+  <% [:level_expected, :proof, :requirement, :non_conformity, :glossary].each do |attribute| %>
+    <%
+    name = Features::Education::Qualiopi::Indicator.human_attribute_name(attribute)
+    value = @indicator.send attribute
+    next if value.blank?
+    %>
+    <div class="col-md-4">
+      <h2 class="h4 mt-4"><%= name %></h2>
+      <%= simple_format value %>
     </div>
   <% end %>
 </div>
 
-<table class="table mt-5">
-  <thead>
-    <tr>
-      <th><%= Features::Education::Program.model_name.human %></th>
-      <% @checks.each do |check| %>
-        <th><%= Features::Education::Program.human_attribute_name(check) %></th>
-      <% end %>
-    </tr>
-  </thead>
-  <tbody>
-    <% @programs.each do |program| %>
-      <tr>
-        <td><%= link_to program, [:admin, program] %></td>
-        <% @checks.each do |check| %>
-          <% valid = !program.send(check).blank? %>
-          <th>
-            <% if valid %>
-              <span class="fas fa-check text-success"></span>
-            <% else %>
-              <span class="fas fa-times text-danger"></span>
-            <% end %>
-          </th>
-        <% end %>
-      </tr>
-    <% end %>
-  </tbody>
-</table>
+<% begin %>
+<%= render "admin/features/education/qualiopi/evaluations/criterion_#{@indicator.number}" %>
+<% rescue %>
+<% end %>
diff --git a/app/views/admin/features/education/qualiopi/indicators/show.json.jbuilder b/app/views/admin/features/education/qualiopi/indicators/show.json.jbuilder
deleted file mode 100644
index 4f4121ace..000000000
--- a/app/views/admin/features/education/qualiopi/indicators/show.json.jbuilder
+++ /dev/null
@@ -1 +0,0 @@
-json.partial! "qualiopi_indicators/qualiopi_indicator", qualiopi_indicator: @qualiopi_indicator
diff --git a/config/locales/features/education/fr.yml b/config/locales/features/education/fr.yml
index b04bf2def..cbdd57736 100644
--- a/config/locales/features/education/fr.yml
+++ b/config/locales/features/education/fr.yml
@@ -43,6 +43,7 @@ fr:
         proof: Éléments de preuve
         requirement: Obligations spécifiques
         non_conformity: Non-conformité
+        glossary: Glossaire
   enums:
     features/education/program:
       level:
diff --git a/config/routes/admin/features/education.rb b/config/routes/admin/features/education.rb
index eac3359ce..5d3c859b4 100644
--- a/config/routes/admin/features/education.rb
+++ b/config/routes/admin/features/education.rb
@@ -1,8 +1,8 @@
 namespace :education do
   resources :programs
   namespace :qualiopi do
-    resources :criterions
-    resources :indicators
+    resources :criterions, only: [:index, :show]
+    resources :indicators, only: [:index, :show]
   end
   get 'dashboard' => 'dashboard#index', as: :dashboard
 end
diff --git a/db/migrate/20210811171021_add_glossary_to_features_education_qualiopi_indicator.rb b/db/migrate/20210811171021_add_glossary_to_features_education_qualiopi_indicator.rb
new file mode 100644
index 000000000..e5c3e2c24
--- /dev/null
+++ b/db/migrate/20210811171021_add_glossary_to_features_education_qualiopi_indicator.rb
@@ -0,0 +1,5 @@
+class AddGlossaryToFeaturesEducationQualiopiIndicator < ActiveRecord::Migration[6.1]
+  def change
+    add_column :features_education_qualiopi_indicators, :glossary, :text
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 99bb8102e..153042639 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2021_08_11_102819) do
+ActiveRecord::Schema.define(version: 2021_08_11_171021) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "pgcrypto"
@@ -55,6 +55,7 @@ ActiveRecord::Schema.define(version: 2021_08_11_102819) do
     t.text "non_conformity"
     t.datetime "created_at", precision: 6, null: false
     t.datetime "updated_at", precision: 6, null: false
+    t.text "glossary"
     t.index ["criterion_id"], name: "index_features_education_qualiopi_indicators_on_criterion_id"
   end
 
diff --git a/db/seeds.rb b/db/seeds.rb
index 2c7336dfa..a5b468c51 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -1 +1,280 @@
 University.create name: 'Osuny', identifier: 'osuny'
+
+Features::Education::Qualiopi::Criterion.destroy_all
+Features::Education::Qualiopi::Criterion.create [
+  {
+    id: '0285619c-cfc8-4858-bef6-74adc0aac055',
+    number: 1,
+    name: 'Les conditions d’information du public sur les prestations proposées, les délais pour y accéder et les résultats obtenus'
+  },
+  {
+    id: 'd0127e8f-d121-4a02-a280-275e1e060573',
+    number: 2,
+    name: 'L’identification précise des objectifs des prestations proposées et l’adaptation de ces prestations aux publics bénéficiaires lors de la conception des prestations'
+  },
+  {
+    id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 3,
+    name: 'L’adaptation aux publics bénéficiaires des prestations et des modalités d’accueil, d’accompagnement, de suivi et d’évaluation mises en œuvre'
+  },
+  {
+    id: '4207cf14-b32f-4ee3-a0e9-5a472801e4d3',
+    number: 4,
+    name: 'L’adéquation des moyens pédagogiques, techniques et d’encadrement aux prestations mises en œuvre'
+  },
+  {
+    id: '79185ec5-4249-48ce-994f-6ca3750139e6',
+    number: 5,
+    name: 'La qualification et le développement des connaissances et compétences des personnels chargés de mettre en œuvre les prestations'
+  },
+  {
+    id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 6,
+    name: 'L’inscription et l’investissement du prestataire dans son environnement professionnel'
+  },
+  {
+    id: 'fcd31ee6-a512-4e1a-9ff2-6f67b5c3d61d',
+    number: 7,
+    name: 'Le recueil et la prise en compte des appréciations et des réclamations formulées par les parties prenantes aux prestations délivrées'
+  }
+]
+
+Features::Education::Qualiopi::Indicator.destroy_all
+Features::Education::Qualiopi::Indicator.create [
+  {
+    id: 'f5632d1a-09f1-4cd1-98d1-c6de4b7728d6',
+    criterion_id: '0285619c-cfc8-4858-bef6-74adc0aac055',
+    number: 1,
+    name: 'Le prestataire diffuse une information accessible au public, détaillée et vérifiable sur les prestations proposées : prérequis, objectifs, durée, modalités et délais d’accès, tarifs, contacts, méthodes mobilisées et modalités d’évaluation, accessibilité aux personnes handicapées.'
+  },
+  {
+    id: '239a7a91-f7ae-4e6c-a5c5-d0895ec2d7f6',
+    criterion_id: '0285619c-cfc8-4858-bef6-74adc0aac055',
+    number: 2,
+    name: 'Le prestataire diffuse des indicateurs de résultats adaptés à la nature des prestations mises en œuvre et des publics accueillis.'
+  },
+  {
+    id: '65781e6b-275b-4720-a2a8-cf8088067b7b',
+    criterion_id: '0285619c-cfc8-4858-bef6-74adc0aac055',
+    number: 3,
+    name: 'Lorsque le prestataire met en œuvre des prestations conduisant à une certification professionnelle, il informe sur les taux d’obtention des certifications préparées, les possibilités de valider un/ou des blocs de compétences, ainsi que sur les équivalences, passerelles, suites de parcours et les débouchés.'
+  },
+  {
+    id: 'aa49d079-5997-4da1-8f09-830d1d7f79ab',
+    criterion_id: 'd0127e8f-d121-4a02-a280-275e1e060573',
+    number: 4,
+    name: 'Le prestataire analyse le besoin du bénéficiaire en lien avec l’entreprise et/ou le financeur concerné(s).'
+  },
+  {
+    id: '2bcf2adc-deb9-412f-9c10-0a11592ca643',
+    criterion_id: 'd0127e8f-d121-4a02-a280-275e1e060573',
+    number: 5,
+    name: 'Le prestataire définit les objectifs opérationnels et évaluables de la prestation.'
+  },
+  {
+    id: 'fb752ef0-36d3-487d-865f-3633f5378a66',
+    criterion_id: 'd0127e8f-d121-4a02-a280-275e1e060573',
+    number: 6,
+    name: 'Le prestataire établit les contenus et les modalités de mise en œuvre de la prestation, adaptés aux objectifs définis et aux publics bénéficiaires.'
+  },
+  {
+    id: '56370de4-fd54-407a-a3c5-a7fce07a0463',
+    criterion_id: 'd0127e8f-d121-4a02-a280-275e1e060573',
+    number: 7,
+    name: 'Lorsque le prestataire met en œuvre des prestations conduisant à une certification professionnelle, il s’assure de l’adéquation du ou des contenus de la prestation aux exigences de la certification visée.'
+  },
+  {
+    id: '11d73ed4-ecf1-403b-9ea2-b8145cbf941a',
+    criterion_id: 'd0127e8f-d121-4a02-a280-275e1e060573',
+    number: 8,
+    name: 'Le prestataire détermine les procédures de positionnement et d’évaluation des acquis à l’entrée de la prestation.'
+  },
+  {
+    id: 'c0616f05-3dda-4a47-b0db-d716c9b19105',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 9,
+    name: 'Le prestataire informe les publics bénéficiaires des conditions de déroulement de la prestation.'
+  },
+  {
+    id: 'c728314d-2426-4d69-b4d6-dad1c2a3a47f',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 10,
+    name: 'Le prestataire met en œuvre et adapte la prestation, l’accompagnement et le suivi aux publics bénéficiaires.'
+  },
+  {
+    id: '67f2a17b-51ad-4fd0-b157-29f16badf6f1',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 11,
+    name: 'Le prestataire évalue l’atteinte par les publics bénéficiaires des objectifs de la prestation.'
+  },
+  {
+    id: '60ff9d8e-8b26-4ad2-82d6-1428f07e2312',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 12,
+    name: 'Le prestataire décrit et met en œuvre les mesures pour favoriser l’engagement des bénéficiaires et prévenir les ruptures de parcours.'
+  },
+  {
+    id: '3034fdc7-cc65-422c-bb64-5f881390f49e',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 13,
+    name: 'Pour les formations en alternance, le prestataire, en lien avec l’entreprise, anticipe avec l’apprenant les missions confiées, à court, moyen et long terme, et assure la coordination et la progressivité des apprentissages réalisés en centre de formation et en entreprise.'
+  },
+  {
+    id: '472e0c7c-55e0-49af-a6ae-bdb606640042',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 14,
+    name: 'Le prestataire met en œuvre un accompagnement socio-professionnel, éducatif et relatif à l’exercice de la citoyenneté.'
+  },
+  {
+    id: '5d7954b8-79f7-4ff0-a2bc-efe10dba729b',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 15,
+    name: 'Le prestataire informe les apprentis de leurs droits et devoirs en tant qu’apprentis et salariés ainsi que des règles applicables en matière de santé et de sécurité en milieu professionnel.'
+  },
+  {
+    id: '6a0eb50b-725d-44c7-8e05-57eb8cf2c8aa',
+    criterion_id: '50168ad5-ef10-43cd-a76e-050278e99705',
+    number: 16,
+    name: 'Lorsque le prestataire met en œuvre des formations conduisant à une certification professionnelle, il s’assure que les conditions de présentation des bénéficiaires à la certification respectent les exigences formelles de l’autorité de certification.'
+  },
+  {
+    id: 'ad070df9-fb5e-48c7-85a6-f17a7d357e25',
+    criterion_id: '4207cf14-b32f-4ee3-a0e9-5a472801e4d3',
+    number: 17,
+    name: 'Le prestataire met à disposition ou s’assure de la mise à disposition des moyens humains et techniques adaptés et d’un environnement approprié (conditions, locaux, équipements, plateaux techniques...).'
+  },
+  {
+    id: '4599987c-d653-44ad-8de9-636b72b6440c',
+    criterion_id: '4207cf14-b32f-4ee3-a0e9-5a472801e4d3',
+    number: 18,
+    name: 'Le prestataire mobilise et coordonne les différents intervenants internes et/ou externes (pédagogiques, administratifs, logistiques, commerciaux...).'
+  },
+  {
+    id: 'd69cef52-4e75-409c-8d8b-7766ac90321c',
+    criterion_id: '4207cf14-b32f-4ee3-a0e9-5a472801e4d3',
+    number: 19,
+    name: 'Le prestataire met à disposition du bénéficiaire des ressources pédagogiques et permet à celui-ci de se les approprier.'
+  },
+  {
+    id: '961639a6-4049-45ad-b1e0-f51017926458',
+    criterion_id: '4207cf14-b32f-4ee3-a0e9-5a472801e4d3',
+    number: 20,
+    name: 'Le prestataire dispose d’un personnel dédié à l’appui à la mobilité nationale et internationale, d’un référent handicap et d’un conseil de perfectionnement.'
+  },
+  {
+    id: '5f4cbf53-d044-4783-a7a7-ccaadb6cadb1',
+    criterion_id: '79185ec5-4249-48ce-994f-6ca3750139e6',
+    number: 21,
+    name: 'Le prestataire détermine, mobilise et évalue les compétences des différents intervenants internes et/ou externes, adaptées aux prestations.'
+  },
+  {
+    id: 'd4844442-7492-4417-b172-ea661e069dfc',
+    criterion_id: '79185ec5-4249-48ce-994f-6ca3750139e6',
+    number: 22,
+    name: 'Le prestataire entretient et développe les compétences de ses salariés, adaptées aux prestations qu’il délivre.'
+  },
+  {
+    id: 'cf646004-4064-4907-8859-daf73c9196bf',
+    criterion_id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 23,
+    name: 'Le prestataire réalise une veille légale et réglementaire sur le champ de la formation professionnelle et en exploite les enseignements.',
+    level_expected: 'Démontrer la mise en place d’une veille légale et réglementaire et son exploitation.',
+    proof: 'Abonnements, adhésions, participation aux salons professionnels, conférences, groupes normatifs, actualisation des supports d’information (publicité) ou de contractualisation, des dispositifs mobilisés (règles CPF) en fonction des évolutions juridiques, veille réglementaire en matière de handicap.
+
+    Pour la VAE : documentation à jour sur le cadre légal du droit individuel à la VAE et de ses modalités de financement.',
+    non_conformity: 'Dans l’échantillon audité, une non-conformité mineure est caractérisée par une exploitation partielle de la veille mise en place.'
+  },
+  {
+    id: '94c4bf4c-ca0a-4676-a9bf-22a4f743a4d7',
+    criterion_id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 24,
+    name: 'Le prestataire réalise une veille sur les évolutions des compétences, des métiers et des emplois dans ses secteurs d’intervention et en exploite les enseignements.',
+    level_expected: 'Démontrer la mise en place d’une veille sur les thèmes de l’indicateur et son impact éventuel sur les prestations.',
+    proof: 'Veille économique et documents y afférents, participations à des conférences, colloques, salon, adhésion à un réseau professionnel (syndicat, fédération, forums), abonnements à des revues professionnelles. Diffusion des éléments issus de la veille au personnel du prestataire, évolutions apportées au contenu des prestations proposées.',
+    requirement: 'Nouveaux entrants : Démontrer la mise en place d’une veille économique. L’impact éventuel sera audité lors de l’audit de surveillance.',
+    non_conformity: 'Dans l’échantillon audité, une non-conformité mineure est caractérisée par une exploitation partielle de la veille mise en place.'
+  },
+  {
+    id: '05413135-8136-47a5-88f9-16f13167ff2d',
+    criterion_id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 25,
+    name: 'Le prestataire réalise une veille sur les innovations pédagogiques et technologiques permettant une évolution de ses prestations et en exploite les enseignements.',
+    level_expected: 'Démontrer la mise en place d’une veille sur les thèmes de l’indicateur et son impact éventuel sur les prestations.',
+    proof: 'Veille économique et documents y afférents, participations à des conférences, colloques, salons, groupes de réflexions et d’analyse de pratiques, adhésion à un réseau professionnel (syndicat, fédération, forums), abonnements à des revues professionnelles. Diffusion des éléments issus de la veille au personnel du prestataire, évolutions apportées au contenu des prestations proposées. Pour les organismes qui accueillent des personnes en situation de handicap, participation à des conférences thématiques, colloques, salons, groupes de réflexions et d’analyse de pratiques en matière d’innovations pédagogiques et technologiques pour le public visé.',
+    requirement: 'Nouveaux entrants : démontrer la mise en place d’une veille pédagogique et technologique. L’indicateur sera audité lors de l’audit de surveillance.',
+    non_conformity: 'Dans l’échantillon audité, une non-conformité mineure est caractérisée par une exploitation partielle de la veille mise en place.'
+  },
+  {
+    id: '3a5e11e4-d82d-4331-aa51-7666d80604df',
+    criterion_id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 26,
+    name: 'Le prestataire mobilise les expertises, outils et réseaux nécessaires pour accueillir, accompagner/former ou orienter les publics en situation de handicap.',
+    level_expected: 'Démontrer la mise en place d’un réseau de partenaires/experts/acteurs du champ du handicap, mobilisable par les personnels et dans le cas d’accueil de personnes en situation de handicap, préciser les mesures spécifiques mises en œuvre.',
+    proof: 'Liste des partenaires du territoire susceptibles d’aider le prestataire dans la prise en compte des PSH, dont les partenaires spécialisés intervenants pour le compte de l’Agefiph et du Fiphfp.
+
+    Participation aux instances et manifestation des partenaires, compte-rendu de rencontres. Compétences et connaissances du référent handicap.',
+    non_conformity: 'Dans l’échantillon audité, le non-respect (même partiel) de cet indicateur entraîne une non-conformité majeure.',
+    requirement: 'Nouveaux entrants : démontrer la mise en place d’un réseau de partenaires/experts/acteurs du champ du handicap.',
+    glossary: 'Agefiph : Association de gestion du fonds pour l’insertion des personnes handicapées (www.agefiph.fr).
+
+    Fiphfp : Fonds pour l’insertion des PSH dans la fonction publique.'
+  },
+  {
+    id: '5cbf65ab-1ad0-44c2-bf6f-e3098d734b77',
+    criterion_id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 27,
+    name: 'Lorsque le prestataire fait appel à la sous-traitance ou au portage salarial, il s’assure du respect de la conformité au présent référentiel.',
+    level_expected: 'Démontrer les dispositions mises en place pour vérifier le respect de la conformité au présent référentiel par le sous-traitant ou le salarié porté.',
+    proof: 'Contrats de prestations de service, tous les éléments qui permettent de démontrer les modalités de sélection et de pilotage des sous-traitants (process de sélection, justificatifs présentés par les sous-traitants et les salariés portés, animation qualité dédiée, charte). NB : Cela ne signifie pas une obligation de certification des sous-traitants : la responsabilité de la qualité appartient au donneur d’ordre, charge à ce dernier de mettre en place les modalités qui assurent la chaîne de la qualité y compris avec les sous-traitants.',
+    non_conformity: 'Dans l’échantillon audité, le non-respect (même partiel) de cet indicateur entraîne une non-conformité majeure.'
+  },
+  {
+    id: '2fa64872-89d3-47c9-841c-630fc10f2d77',
+    criterion_id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 28,
+    name: 'Lorsque les prestations dispensées au bénéficiaire comprennent des périodes de formation en situation de travail, le prestataire mobilise son réseau de partenaires socio-économiques pour coconstruire l’ingénierie de formation et favoriser l’accueil en entreprise.',
+    level_expected: 'Démontrer l’existence d’un réseau de partenaires socio-économiques mobilisé tout au long de la prestation.',
+    proof: 'Comités de pilotage, comptes rendus de réunions, liste des entreprises partenaires, conventions de partenariats, contacts réseau SPE, livret alternance, informations sur les partenariats. NB : Cet indicateur vise tous les prestataires de formation, y compris les CFA, dans leur capacité à mobiliser un réseau de partenaires lors des périodes de formation en situation de travail. Pour les apprentis, ces périodes correspondent par définition à la formation pratique en entreprise ; pour les salariés en contrat de professionnalisation, il peut s’agir des périodes d’acquisition d’un savoir-faire en entreprise',
+    non_conformity: 'Dans l’échantillon audité, une non-conformité mineure est caractérisée par un défaut ponctuel et non répétitif dans la mobilisation des partenaires.',
+    glossary: 'Partenaires socio-économiques : entreprises (tous statuts) ; chambres consulaires : CCI, agriculture et CMA ; établissement public de coopération intercommunale (EPCI), communautés d’agglomération, communautés de communes ; structures de l’insertion par l’activité économique : ateliers et chantiers d’insertion (ACI), association intermédiaire (AI), entreprise d’insertion (EI) et entreprise de travail temporaire d’insertion (ETTI) ; service public de l’emploi, service public de l’orientation ; branches professionnelles ; centres sociaux ; organismes paritaires, association Transition Pro (CPIR), opérateurs CEP ; services de l’État, etc.'
+  },
+  {
+    id: '3c2e2f5d-bd5c-4730-bfb3-8e9ccc93e687',
+    criterion_id: 'b87aa3c2-37d6-4576-ae2c-e5ea2a74e7e4',
+    number: 29,
+    name: 'Le prestataire développe des actions qui concourent à l’insertion professionnelle ou la poursuite d’étude par la voie de l’apprentissage ou par toute autre voie permettant de développer leurs connaissances et leurs compétences.',
+    level_expected: 'Démontrer l’existence d’actions qui concourent à l’insertion professionnelle ou la poursuite d’études.',
+    proof: 'Actions visant à favoriser l’insertion professionnelle des apprenants (salon d’orientation, visite d’entreprise, atelier CV/lettre de motivation, aide à la recherche d’emploi, réseau d’anciens élèves), actions de promotion de la poursuite d’étude, partenariats avec des acteurs de l’insertion et de l’emploi et avec le monde professionnel.',
+    non_conformity: 'Dans l’échantillon audité, le non-respect (même partiel) de cet indicateur entraîne une non-conformité majeure.'
+  },
+  {
+    id: 'c0d8a5ed-584d-4e78-8b1e-88d0efcb26a5',
+    criterion_id: 'fcd31ee6-a512-4e1a-9ff2-6f67b5c3d61d',
+    number: 30,
+    name: 'Le prestataire recueille les appréciations des parties prenantes : bénéficiaires, financeurs, équipes pédagogiques et entreprises concernées.',
+    level_expected: 'Démontrer la mise en place d’un système de collecte des appréciations à une fréquence pertinente, incluant des dispositifs de relance et permettant une libre expression.',
+    proof: 'Enquête de satisfaction, questionnaire, compte-rendu d’entretiens, évaluation à chaud et/ou à froid, analyse et traitement des appréciations formulées par les parties prenantes. Pour les CBC : questionnaire d’évaluation à l’issue du bilan et à 6 mois. NB : Les modalités de recueil selon la partie prenante peuvent être différentes. Les évaluations des acquis ne sont pas un élément de preuve probant pour cet indicateur.',
+    non_conformity: 'Dans l’échantillon audité, une non-conformité mineure est caractérisée par une mise en œuvre partielle des mesures définies.'
+  },
+  {
+    id: '87ef7ca5-fcd8-40d8-bc96-7ecbed4bb3c9',
+    criterion_id: 'fcd31ee6-a512-4e1a-9ff2-6f67b5c3d61d',
+    number: 31,
+    name: 'Le prestataire met en œuvre des modalités de traitement des difficultés rencontrées par les parties prenantes, des réclamations exprimées par ces dernières, des aléas survenus en cours de prestation.',
+    level_expected: 'Démontrer la mise en place de modalités de traitement des aléas, difficultés et réclamations.',
+    proof: 'Description et mise en œuvre de ces modalités (accusé de réception des réclamations et réponses apportées aux réclamants), enquêtes de satisfaction, analyse et traitement des réclamations formulées par les stagiaires, système de médiation.',
+    requirement: '',
+    non_conformity: 'Dans l’échantillon audité, le non-respect (même partiel) de cet indicateur entraîne une non-conformité majeure.',
+    glossary: 'Réclamation : action visant à faire respecter un droit, ou à demander une chose due, recueillie par écrit.'
+  },
+  {
+    id: 'e664cea6-7dbb-4b0f-9407-ecd870cee7ac',
+    criterion_id: 'fcd31ee6-a512-4e1a-9ff2-6f67b5c3d61d',
+    number: 32,
+    name: 'Le prestataire met en œuvre des mesures d’amélioration à partir de l’analyse des appréciations et des réclamations.',
+    level_expected: 'Démontrer la mise en place d’une démarche d’amélioration continue.',
+    proof: 'Identification et réflexion sur les causes d’abandon ou les motifs d’insatisfaction, plans d’actions d’amélioration, mise en œuvre d’actions spécifiques. Pour la VAE : partage des résultats de l’accompagnement (nombre de candidats en début et fin d’accompagnement, taux et causes d’abandon, taux de réussite à la VAE).',
+    requirement: 'Nouveaux entrants : l’indicateur sera audité à l’audit de surveillance.',
+    non_conformity: 'Dans l’échantillon audité, le non-respect (même partiel) de cet indicateur entraîne une non-conformité majeure.'
+  }
+]
-- 
GitLab