diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5190a9458c1f4a4b7bb1b6dcbf09d1664193c22b..9b86552055f2f2ea7e922c7a9ede88f4397a0506 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,14 +21,21 @@ Objectif : Connecteur Export OSE => Logiciel RH
 ## Corrections de bugs
 
 * Au niveau du connecteur Actul+, les formations fermées étaient ignorées, elles sont également synchronisées
+* La suppression d'un statut intervenant n'était plus possible (#39548)
+* Il était impossible de modifier les règles de validation des services via le formulaire de l'administration (#39194)
 
 ## Nouveautés
 
+* Module export intervenant de OSE vers SIHAM
 * Nouvelle vue V_IMPORT_DEPUIS_DOSSIERS pouvant servir pour peupler les données des intervenants à partir des données personnelles
 * Possibilité pour un gestionnire de saisir des heures d'enseignement ou de référentiel qui n'auront pas besoin d'être validées par la suite (nouveau privilège d'autovalidation associé)
 * Ajout d'une colonne dans l'export CSV des charges précisant si un élément est mutualisé ou non
 * Ajout de la composante hiérarchique de l'intervenant dans l'export csv des agréments (#40053)
 * Ajout de la structure d'affectation d'un intervenant vacataire dans l'extraction de mise en paiement (#40180)
+* Ajout d'un nouveau paramètre pour pouvoir spécifier un email expéditeur générique dans le cadre d'envoi d'email via les indicateurs (#40106)
+* Affichage de l'horodatage du dossier de l'intervenant dans les données personnelles (#39014)
+* Affichage du grade et de la discipline au niveau de la fiche intervenant (#39603)
+* Synchronisation de l'email pro de la fiche intervenant avec le dossier de l'intervenant en cas de mise à jour (#39346)
 
 # OSE 16 (14/09/2021)
 Objectif : Connecteur import Actul+ & système différentiel pour comparer des charges d'enseignement
diff --git a/data/ddl/package/FORMULE_REUNION/body.sql b/data/ddl/package/FORMULE_REUNION/body.sql
index ccf43ebe92378c8be2e7b4200bb0301359450183..84d67a8c0242533d8a73be8920b3f6f83401eccc 100644
--- a/data/ddl/package/FORMULE_REUNION/body.sql
+++ b/data/ddl/package/FORMULE_REUNION/body.sql
@@ -294,7 +294,7 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_REUNION AS
 
     -- AM=SI(ET($D20="Oui";$H20<>"TP");$M20*$AD20*$K20;0)
     WHEN c = 'AM' AND v >= 1 THEN
-      IF vh.service_statutaire AND vh.type_intervention_code <> 'TP' THEN
+      IF vh.service_statutaire AND COALESCE(vh.type_intervention_code,' ') <> 'TP' THEN
         RETURN vh.heures * cell('AD',l) * vh.ponderation_service_du;
       ELSE
         RETURN 0;
@@ -418,4 +418,4 @@ CREATE OR REPLACE PACKAGE BODY FORMULE_REUNION AS
       ordre';
   END;
 
-END FORMULE_REUNION;
\ No newline at end of file
+END FORMULE_REUNION;
diff --git a/data/ddl/trigger/INTERVENANT_EMAIL.sql b/data/ddl/trigger/INTERVENANT_EMAIL.sql
new file mode 100644
index 0000000000000000000000000000000000000000..2c35123dc5cdceef3db033998e61e472b048090a
--- /dev/null
+++ b/data/ddl/trigger/INTERVENANT_EMAIL.sql
@@ -0,0 +1,7 @@
+CREATE OR REPLACE TRIGGER INTERVENANT_EMAIL
+  AFTER UPDATE OF EMAIL_PRO
+  ON INTERVENANT
+  REFERENCING FOR EACH ROW
+BEGIN
+	UPDATE intervenant_dossier SET email_pro = :NEW.email_pro WHERE intervenant_id = :NEW.id;
+END;
\ No newline at end of file
diff --git a/data/parametres.php b/data/parametres.php
index 018a3c98687c7bdd2be3f9dec76e1aafb1ec652c..e73fefdc053a49deb50c722d42d9aa98e15f139a 100644
--- a/data/parametres.php
+++ b/data/parametres.php
@@ -203,4 +203,10 @@ Cordialement,
         "VALEUR"      => "Vous n'êtes pas autorisé(e) à vous connecter à OSE avec ce compte. Nous vous prions de vous rapprocher de votre composante pour en obtenir un valide.",
         "DESCRIPTION" => "Message informatif si l'utilisateur n'est pas intervenant et n'a aucune affectation",
     ],
+
+    /* Indicateur */
+    "indicateur_email_expediteur"   => [
+        "DESCRIPTION" => "Adresse email d'expéditeur des mails via les indicateur, si vide alors l'email de l'utilisateur sera utilisé",
+    ],
+  
 ];
\ No newline at end of file
diff --git a/doc/Connecteurs-Import/Octopus/MV_INTERVENANT.sql b/doc/Connecteurs-Import/Octopus/MV_INTERVENANT.sql
index 867c04bc09b6957b98f8fcad8476bd271dc871af..46d9d9dd32577872e52d05988eaf03963be65cd7 100644
--- a/doc/Connecteurs-Import/Octopus/MV_INTERVENANT.sql
+++ b/doc/Connecteurs-Import/Octopus/MV_INTERVENANT.sql
@@ -1,8 +1,9 @@
 CREATE
 MATERIALIZED VIEW MV_INTERVENANT AS
- WITH i AS (
 
-    SELECT DISTINCT code,
+WITH i AS (
+
+     SELECT DISTINCT code,
                     MAX(z_statut_id) OVER (partition by code, z_statut_id)               z_statut_id,
 				    MAX(z_type) OVER (partition by code, z_statut_id)                    z_type,
                     MIN(source_code)    OVER (partition by code, z_statut_id)            source_code,
@@ -18,7 +19,7 @@ MATERIALIZED VIEW MV_INTERVENANT AS
                         WHEN icto.code_ose IS NOT NULL THEN icto.code_ose
                         ELSE 'AUTRES' END                                       z_statut_id,
                     CASE
-                    	WHEN icto.code_ose IS NOT NULL AND icto.code_ose NOT IN ('BIATSS','NON_AUTORISE') THEN 'permanent'
+                    	WHEN icto.code_ose IS NOT NULL AND icto.code_ose NOT IN ('NON_AUTORISE') THEN 'permanent'
                     	ELSE 'vacataire' END                                        z_type,
                     icto.id_orig                                                source_code,
                     COALESCE(icto.d_debut, to_date('01/01/1900', 'dd/mm/YYYY')) validite_debut,
@@ -30,7 +31,7 @@ MATERIALIZED VIEW MV_INTERVENANT AS
                       JOIN octo.individu_unique@octoprod uni ON icto.individu_id = uni.c_individu_chaine
                       JOIN octo.v_individu_statut@octoprod vinds ON vinds.individu_id = uni.c_individu_chaine
 
-             WHERE (icto.d_debut - 184 <= SYSDATE OR icto.d_fin >= SYSDATE)  AND icto.code_ose IS NOT NULL
+             WHERE (COALESCE(icto.d_debut, to_date('01/01/1900', 'dd/mm/YYYY')) - 184 <= SYSDATE OR COALESCE(icto.d_fin, to_date('01/01/9999', 'dd/mm/YYYY')) >= SYSDATE)  AND icto.code_ose IS NOT NULL
 
 
              UNION ALL
@@ -52,7 +53,7 @@ MATERIALIZED VIEW MV_INTERVENANT AS
              FROM octo.individu_unique@octoprod uni
                       JOIN octo.individu_statut@octoprod inds ON inds.individu_id = uni.c_individu_chaine
    					  LEFT JOIN octo.v_individu_statut@octoprod vinds ON vinds.individu_id = uni.c_individu_chaine
-					  LEFT JOIN octo.v_individu_contrat_type_ose@octoprod icto ON uni.c_individu_chaine = icto.individu_id AND (icto.d_debut - 184 <= SYSDATE OR icto.d_fin >= SYSDATE) AND icto.code_ose IS NOT NULL AND icto.code_ose != 'NON_AUTORISE'
+					  LEFT JOIN octo.v_individu_contrat_type_ose@octoprod icto ON uni.c_individu_chaine = icto.individu_id AND  COALESCE(icto.d_debut, to_date('01/01/1900', 'dd/mm/YYYY')) - 184 <= SYSDATE AND COALESCE(inds.d_fin, to_date('01/01/9999', 'dd/mm/YYYY'))  >= SYSDATE AND icto.code_ose IS NOT NULL AND icto.code_ose NOT IN('NON_AUTORISE')
              WHERE inds.d_debut - 184 <= SYSDATE
                --On ne remonte pas de statut autre pour ceux qui ont déjà un certain type de contrat
 	           --AND icto.individu_id IS NULL
@@ -65,6 +66,8 @@ MATERIALIZED VIEW MV_INTERVENANT AS
                --AND (vinds.t_doctorant='N' OR vinds.individu_id IS NULL)
                AND inds.c_source IN ('HARP', 'OCTO', 'SIHAM')
          ) t
+
+
 ),
 
      --Trouver le tel pro principal de l'intervenant
@@ -281,4 +284,8 @@ FROM i
          LEFT JOIN compte ON compte.individu_id = induni.c_individu_chaine
     --On récupére la discipline adaptée directement dans Octopus
          LEFT JOIN cnua cnua ON cnua.individu_id = induni.c_individu_chaine
-WHERE i.validite_fin >= (SYSDATE - (365 * 2))
\ No newline at end of file
+WHERE i.validite_fin >= (SYSDATE - (365 * 2))
+
+
+
+
diff --git a/module/Application/src/Application/Controller/IndicateurController.php b/module/Application/src/Application/Controller/IndicateurController.php
index 7f71e97f10f34a2a2b099113450da79490b1003a..eae0de749954bd40b3aa45ffcb92a035d98ce065 100755
--- a/module/Application/src/Application/Controller/IndicateurController.php
+++ b/module/Application/src/Application/Controller/IndicateurController.php
@@ -15,6 +15,7 @@ use Application\Service\Traits\IndicateurServiceAwareTrait;
 use Application\Service\Traits\IntervenantServiceAwareTrait;
 use Application\Service\Traits\NotificationIndicateurServiceAwareTrait;
 use Application\Filter\IntervenantEmailFormatter;
+use Application\Service\Traits\ParametresServiceAwareTrait;
 use Application\Service\Traits\PeriodeServiceAwareTrait;
 use Application\Service\Traits\TypeVolumeHoraireServiceAwareTrait;
 use Zend\Form\Element\Checkbox;
@@ -240,11 +241,10 @@ class IndicateurController extends AbstractController
             $post = $this->getRequest()->getPost();
             if ($form->setData($post)->isValid()) {
                 $mailer->send($emails, $post);
-                if($post['copy'])
-                {
+                if ($post['copy']) {
                     //envoi une copie du mail à l'utilisateur si il l'a demandé
-                    $utilisateur = $this->getServiceContext()->getUtilisateur();
-                    $emailUtilisateur[ $utilisateur->getEmail()] = $utilisateur->getDisplayName();
+                    $utilisateur                                = $this->getServiceContext()->getUtilisateur();
+                    $emailUtilisateur[$utilisateur->getEmail()] = $utilisateur->getDisplayName();
                     $mailer->sendCopyEmail($emailUtilisateur, $emails, $post);
                 }
                 $count   = count($intervenants);
@@ -364,6 +364,7 @@ class IndicateurController extends AbstractController
 class IndicateurIntervenantsMailer
 {
     use ContextServiceAwareTrait;
+    use ParametresServiceAwareTrait;
 
     /**
      * @var AbstractController
@@ -406,18 +407,16 @@ class IndicateurIntervenantsMailer
     private function createMessage($data)
     {
         // corps au format HTML
-        $html          = $data['body'];
-        if(!empty($data['emailsIntervenant']))
-        {
+        $html = $data['body'];
+        if (!empty($data['emailsIntervenant'])) {
             $htmlLog = "<br/><br/>------------------------------------------------ <br/><br/>";
             $htmlLog = "<p>Email envoyé au(x) destinataire(s) suivant(s) : <br/>";
 
-            foreach($data['emailsIntervenant'] as $email => $name)
-            {
+            foreach ($data['emailsIntervenant'] as $email => $name) {
                 $htmlLog .= $name . " / " . $email . "<br/>";
             }
             $htmlLog .= "</p>";
-            $html .= $htmlLog;
+            $html    .= $htmlLog;
         }
         $part          = new MimePart($html);
         $part->type    = Mime::TYPE_HTML;
@@ -437,7 +436,13 @@ class IndicateurIntervenantsMailer
     public function getFrom()
     {
         /** @var ContextService $context */
-        $context = $this->controller->getServiceContext();
+        $context   = $this->controller->getServiceContext();
+        $parametre = $this->getServiceParametres();
+
+        $from = trim($parametre->get('indicateur_email_expediteur'));
+        if (!empty($from)) {
+            return $from;
+        }
 
         $from = $context->getUtilisateur()->getEmail();
 
@@ -477,13 +482,14 @@ class IndicateurIntervenantsMailer
         return $html;
     }
 
+
+
     public function sendCopyEmail($emailsUtilisateur, $emailsIntervenant, $data, $logs = null)
     {
         $data['emailsIntervenant'] = $emailsIntervenant;
-        $message = $this->createMessage($data);
+        $message                   = $this->createMessage($data);
         $message->setSubject('COPIE | ' . $data['subject']);
-        foreach($emailsUtilisateur as $email => $name)
-        {
+        foreach ($emailsUtilisateur as $email => $name) {
             $message->setTo($email, $name);
         }
         $this->controller->mail()->send($message);
diff --git a/module/Application/src/Application/Controller/StatutIntervenantController.php b/module/Application/src/Application/Controller/StatutIntervenantController.php
index 39c3d8cb25540a9e53e76aa9d75bb5ae66c37689..0323e96d62cd7205d84dc4d07260a1630db1c0c2 100755
--- a/module/Application/src/Application/Controller/StatutIntervenantController.php
+++ b/module/Application/src/Application/Controller/StatutIntervenantController.php
@@ -113,9 +113,7 @@ class StatutIntervenantController extends AbstractController
         $statutIntervenant = $this->getEvent()->getParam('statutIntervenant');
 
         $canEdit = $this->isAllowed(Privileges::getResourceId(Privileges::INTERVENANT_STATUT_EDITION));
-        if ($statutIntervenant->getSource()->getImportable()) {
-            $canEdit = false; // Si la source est synchronisable alors pas d'édition possible
-        }
+        
 
         if (!$canEdit) {
             $this->flashMessenger()->addErrorMessage('Statut non modifiable : droit non accordé, car vous n\'avez pas le privilège pour cela ou bien le statut est synchronisé depuis un autre logiciel');
diff --git a/module/Application/src/Application/Form/Intervenant/RegleStructureValidationForm.php b/module/Application/src/Application/Form/Intervenant/RegleStructureValidationForm.php
index 53d0cd34311e58106018c33cb1f41e329444dc4d..7b0bdbbe05e51b773d37cb51a7ad353c6c0ce3c9 100755
--- a/module/Application/src/Application/Form/Intervenant/RegleStructureValidationForm.php
+++ b/module/Application/src/Application/Form/Intervenant/RegleStructureValidationForm.php
@@ -116,7 +116,16 @@ class RegleStructureValidationForm extends AbstractForm
      */
     public function getInputFilterSpecification()
     {
-        return [];
+        $spec = [
+            'type-intervenant'    => [
+                'required' => false,
+            ],
+            'type-volume-horaire' => [
+                'required' => false,
+            ],
+        ];
+
+        return $spec;
     }
 
 }
\ No newline at end of file
diff --git a/module/Application/src/Application/Form/ParametresForm.php b/module/Application/src/Application/Form/ParametresForm.php
index 6858c6c0d27b47927df31466cd8b540b5819c929..cd0a316a3f566b4688fcb5825eece37a1ca652fd 100755
--- a/module/Application/src/Application/Form/ParametresForm.php
+++ b/module/Application/src/Application/Form/ParametresForm.php
@@ -420,6 +420,14 @@ class ParametresForm extends AbstractForm
             ],
         ]);
 
+        $this->add([
+            'name'    => 'indicateur_email_expediteur',
+            'type'    => 'Text',
+            'options' => [
+                'label' => 'Email expéditeur',
+            ],
+        ]);
+
         $this->add([
             'type'       => 'Select',
             'name'       => 'contrat_regle_franchissement',
diff --git a/module/Application/src/Application/View/Helper/Intervenant/IntervenantViewHelper.php b/module/Application/src/Application/View/Helper/Intervenant/IntervenantViewHelper.php
index 9ddd46b361661f74ac59505d425dbfdb5c6fd589..84f0f4cfb9182ff6dc5c80cb292eea9d053ad9ed 100755
--- a/module/Application/src/Application/View/Helper/Intervenant/IntervenantViewHelper.php
+++ b/module/Application/src/Application/View/Helper/Intervenant/IntervenantViewHelper.php
@@ -75,6 +75,8 @@ class IntervenantViewHelper extends AbstractHtmlElement
                 "N° {$entity->getSource()}" => $entity->getCode(),
                 "N° RH"                     => ($entity->getCodeRh()) ? $entity->getCodeRh() : '<span class="inconnu">(Inconnue)</span>',
                 "Affectation principale"    => $entity->getStructure() ?: '<span class="inconnu">(Inconnue)</span>',
+                "Grade"                     => $entity->getGrade() ?: '<span class="inconnu">(Inconnue)</span>',
+                "Discipline"                => (!empty($entity->getDiscipline()) && $entity->getDiscipline() != '00 Non renseignée') ? $entity->getDiscipline() : '<span class="inconnu">(Inconnue)</span>',
                 "Modifié le"                => $entity->getHistoModification()->format(Constants::DATE_FORMAT),
             ],
             'divers'      => [
diff --git a/module/Application/view/application/intervenant-dossier/index.phtml b/module/Application/view/application/intervenant-dossier/index.phtml
index d7eaea235957ba81dfbf7dceb3841e14471576f4..36569ba949a5331dbe5c644c1dc06c151b3063d3 100755
--- a/module/Application/view/application/intervenant-dossier/index.phtml
+++ b/module/Application/view/application/intervenant-dossier/index.phtml
@@ -110,7 +110,8 @@ $fieldsets = $form->getFieldsets();
         <?php endif; ?>
 
     <?php endif; ?>
-
+    <!--Affichage de l'horodatage pour le dossier de l'intervenant-->
+    <?= $this->historique($intervenantDossier) ?>
 
     <?= $this->form()->openTag($form); ?>
     <!-- legend champs obligatoire -->
diff --git a/module/Application/view/application/parametre/generaux.phtml b/module/Application/view/application/parametre/generaux.phtml
index f6f712bd758f667f93a28f23cf3d82fa8ca882f6..5ab513780ca9e3adece7bc805737818b7ecf3818 100755
--- a/module/Application/view/application/parametre/generaux.phtml
+++ b/module/Application/view/application/parametre/generaux.phtml
@@ -91,6 +91,24 @@
             </div>
         </div>
 
+
+        <div class="panel panel-default">
+            <div class="panel-heading">
+                <h3 class="panel-title">Indicateur</h3>
+            </div>
+            <div class="panel-body">
+                <div class="row">
+                    <div class="col-md-6">
+                        <?= $this->formControlGroup($form->get('indicateur_email_expediteur')); ?>
+                        <div class="help-block">
+                            Si l'email expéditeur est vide alors l'email de l'utilisateur en cours sera utilisé.
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </div>
+
         <div class="panel panel-default">
             <div class="panel-heading">
                 <h3 class="panel-title">Gestion des contrats de travail</h3>