From d1263d7cf5a30b27a7f318618f414b2410371da9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Mon, 24 Jan 2022 17:53:52 +0100
Subject: [PATCH] doc + models + app:fix

---
 app/models/university/person/involvement.rb |  8 ++++
 app/models/university/role.rb               |  8 ++++
 docs/university/role.md                     | 41 +++++++++++++++++++
 lib/tasks/app.rake                          | 44 +++++++++++++++++++++
 4 files changed, 101 insertions(+)

diff --git a/app/models/university/person/involvement.rb b/app/models/university/person/involvement.rb
index ca3eab7e0..83c1b444a 100644
--- a/app/models/university/person/involvement.rb
+++ b/app/models/university/person/involvement.rb
@@ -25,9 +25,17 @@
 #  fk_rails_...  (university_id => universities.id)
 #
 class University::Person::Involvement < ApplicationRecord
+  include WithPosition
+
   belongs_to :university
   belongs_to :person
   belongs_to :target, polymorphic: true
 
   enum kind: { administrator: 10, researcher: 20, teacher: 30 }
+
+  protected
+
+  def last_ordered_element
+    self.class.unscoped.where(university_id: university_id, target: target).ordered.last
+  end
 end
diff --git a/app/models/university/role.rb b/app/models/university/role.rb
index 5c263ac58..d63eb7041 100644
--- a/app/models/university/role.rb
+++ b/app/models/university/role.rb
@@ -21,6 +21,14 @@
 #  fk_rails_...  (university_id => universities.id)
 #
 class University::Role < ApplicationRecord
+  include WithPosition
+
   belongs_to :university
   belongs_to :target, polymorphic: true, optional: true
+
+  protected
+
+  def last_ordered_element
+    self.class.unscoped.where(university_id: university_id, target: target).ordered.last
+  end
 end
diff --git a/docs/university/role.md b/docs/university/role.md
index f58d40d83..4c6d8d6f5 100644
--- a/docs/university/role.md
+++ b/docs/university/role.md
@@ -17,3 +17,44 @@ Ce modèle permet de lier une personne à une cible polymorphique. On définit a
 Ce modèle sert pour les liens non intrinsèques. On crée un rôle au niveau d'une cible polymorphique, description et position, et possiblement un rôle parent pour définir la hiérarchie au sein d'un organigramme.
 
 Ensuite, on connecte une personne à ce rôle en utilisant le modèle Involvement avec pour target, le rôle en question.
+
+### Exemples
+
+Soient :
+- `mmi_program` : l'objet `Education::Program` représentant le BUT MMI
+- `teacher` : l'objet `University::Person` représentant un enseignant
+- `director` : l'objet `University::Person` représentant la cheffe de département
+- `program_manager` : l'objet `University::Person` représentant le directeur des études
+- `secretary` : l'objet `University::Person` représentant le secrétaire
+
+Pour l'enseignant on crée un objet `University::Person::Involvement`:
+- target: `mmi_program`
+- person: `teacher`
+- kind: teacher
+
+Pour la cheffe de département on crée :
+- Un objet `University::Role`, qu'on nomme `director_role`
+  - target: `mmi_program`
+  - description: "Cheffe de département"
+- Un objet `University::Person::Involvement`
+  - target: `director_role`
+  - person: `director`
+  - kind: administrator
+
+Pour le directeur des études on crée :
+- Un objet `University::Role`, qu'on nomme `program_manager_role`
+  - target: `mmi_program`
+  - description: "Directeur des études"
+- Un objet `University::Person::Involvement`
+  - target: `program_manager_role`
+  - person: `program_manager`
+  - kind: administrator
+
+Pour le secrétaire on crée :
+- Un objet `University::Role`, qu'on nomme `secretary_role`
+  - target: `mmi_program`
+  - description: "Secrétaire"
+- Un objet `University::Person::Involvement`
+  - target: `secretary_role`
+  - person: `secretary`
+  - kind: administrator
diff --git a/lib/tasks/app.rake b/lib/tasks/app.rake
index 7882b1afa..0e862f5d6 100644
--- a/lib/tasks/app.rake
+++ b/lib/tasks/app.rake
@@ -40,6 +40,50 @@ namespace :app do
         imported_post.post&.update_column :published_at, imported_post.published_at
       end
     end
+
+    Education::Program::Teacher.find_each { |teacher|
+      involvement = University::Person::Involvement.where(
+        kind: 'teacher',
+        target: teacher.program,
+        person_id: teacher.person_id,
+        university_id: teacher.person.university_id
+      ).first_or_create
+      involvement.update_column(:description, teacher.description)
+    }
+
+    Education::Program::Role.find_each { |program_role|
+      university_role = University::Role.where(
+        description: program_role.description,
+        target: program_role.program,
+        position: program_role.position,
+        university_id: program_role.university_id
+      ).first_or_create
+
+      program_role.people.find_each { |role_person|
+        University::Person::Involvement.where(
+          kind: 'administrator',
+          target: university_role,
+          person_id: role_person.person_id,
+          position: role_person.position,
+          university_id: program_role.university_id
+        ).first_or_create
+      }
+    }
+
+    Education::School::Administrator.find_each { |administrator|
+      university_role = University::Role.where(
+        description: administrator.description,
+        target: administrator.school,
+        university_id: administrator.person.university_id
+      ).first_or_create
+
+      University::Person::Involvement.where(
+        kind: 'administrator',
+        target: university_role,
+        person_id: administrator.person_id,
+        university_id: administrator.person.university_id
+      ).first_or_create
+    }
   end
 
   namespace :db do
-- 
GitLab