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>