Skip to content
Snippets Groups Projects
Commit 1a2ff51d authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Possibilité de chercher directement dans le LDAP pour associer un compte à un...

Possibilité de chercher directement dans le LDAP pour associer un compte à un intervenant, ou bien de créer directement un nouvel utilisateur en BDD
parent 73b34db5
No related branches found
No related tags found
1 merge request!55Ll bug report services
......@@ -8,21 +8,5 @@
* @var $viewFile string
*/
/**
* @var $si \Application\Service\IntervenantService
*/
$si = $container->get(\Application\Service\IntervenantService::class);
$routeParams = [
'code:OSE5ea29a39d99a0',
'51954',
'51965',
'39778',
'45xc',
];
foreach ($routeParams as $routeParam) {
$i = $si->getByRouteParam($routeParam);
var_dump($routeParam . ' = ' . ($i ? $i->getId() . ':' : '- NULL -') . $i);
}
$sql = 'update intervenant set utilisateur_code = \'dd\' where id = 196998;';
$container->get(\Application\Constants::BDD)->getConnection()->execute($sql);
\ No newline at end of file
......@@ -36,4 +36,16 @@ BEGIN
IF cs > 0 THEN
raise_application_error(-20101, 'Un intervenant ne peut pas avoir deux fois le même statut le même année');
END IF;
-- On ne peut pas assicoer un même login à plusieurs intervenants
SELECT COUNT(*) INTO cs FROM INTERVENANT WHERE
id <> :NEW.id AND histo_destruction IS NULL
AND code <> :NEW.code
AND annee_id = :NEW.annee_id
AND utilisateur_code = :NEW.utilisateur_code
;
IF cs > 0 THEN
raise_application_error(-20101, 'L''utilisateur est déjà utilisé pour un autre intervenant. Merci d''en choisir un autre.');
END IF;
END;
\ No newline at end of file
......@@ -98,6 +98,13 @@ class LdapConnecteur extends AbstractService
public function isActif(): bool
{
return \AppConfig::get('ldap', 'actif', true);
}
/**
* @param string $critere
*
......@@ -106,7 +113,7 @@ class LdapConnecteur extends AbstractService
public function rechercheUtilisateurs($critere)
{
$result = [];
if (($username = $critere) && \AppConfig::get('ldap', 'actif', true)) {
if (($username = $critere) && $this->isActif()) {
$foundUsers = $this->mapperPeople->findAllByNameOrUsername($username, $this->getUtilisateurLogin(), $this->getUtilisateurFiltre());
/* @var $foundUsers People[] */
......@@ -155,7 +162,6 @@ class LdapConnecteur extends AbstractService
/**
* Enregistre un people dans la BDD et retourne l'enregistrement correspondant. S'il existe déjà alors il est simplement
* retourné...
......@@ -165,7 +171,7 @@ class LdapConnecteur extends AbstractService
*
* @return Utilisateur
*/
public function getUtilisateur($login, $autoInsert = true)
public function getUtilisateur(string $login, bool $autoInsert = true): ?Utilisateur
{
if ($user = $this->getServiceUtilisateur()->getRepo()->findOneBy(['username' => $login])) return $user; // si on le trouve alors c'est OK
if ($user = $this->mapperUser->findByUsername($login)) return $user; // si on le trouve alors c'est OK
......@@ -190,6 +196,53 @@ class LdapConnecteur extends AbstractService
/**
* Enregistre un people dans la BDD et retourne l'enregistrement correspondant. S'il existe déjà alors il est simplement
* retourné...
*
* @param string $login
* @param boolean $autoInsert
*
* @return Utilisateur
*/
public function getUtilisateurFromCode(string $code, bool $autoInsert = true): ?Utilisateur
{
if ($user = $this->getServiceUtilisateur()->getRepo()->findOneBy(['code' => $code])) return $user; // si on le trouve alors c'est OK
if ($this->isActif()) {
$ldapUser = $this->mapperPeople->findOneByNoIndividu($code);
if ($ldapUser) {
$login = $this->getPeopleAttribute($ldapUser, $this->getUtilisateurLogin());
return $this->getUtilisateur($login, $autoInsert);
}
}
return null;
}
public function getCodeFromLogin(string $login): ?string
{
$code = null;
$u = $this->getUtilisateur($login);
if ($u) {
$code = $u->getCode();
}
if (!$code && $this->isActif()) {
$ldapUser = $this->mapperPeople->findOneByUsername($login);
$code = $this->getPeopleAttribute($ldapUser, $this->getUtilisateurCode());
}
return $code;
}
/**
* @return Utilisateur
*/
......
......@@ -22,6 +22,7 @@ use Application\Service\Traits\RegleStructureValidationServiceAwareTrait;
use Application\Service\Traits\SourceServiceAwareTrait;
use Application\Service\Traits\StatutIntervenantServiceAwareTrait;
use Application\Service\Traits\TypeVolumeHoraireServiceAwareTrait;
use Application\Service\Traits\UtilisateurServiceAwareTrait;
use Application\Service\Traits\ValidationServiceAwareTrait;
use Application\Service\Traits\WorkflowServiceAwareTrait;
use UnicaenApp\Traits\SessionContainerTrait;
......@@ -58,7 +59,7 @@ class IntervenantController extends AbstractController
use RegleStructureValidationFormAwareTrait;
use StatutIntervenantServiceAwareTrait;
use SourceServiceAwareTrait;
use UtilisateurServiceAwareTrait;
public function indexAction()
......@@ -316,6 +317,17 @@ class IntervenantController extends AbstractController
if ((!$form->isReadOnly()) && $form->isValid()) {
try {
$form->protection($intervenant);
if ($form->get('login')->getValue() && $form->get('password')->getValue()) {
$nom = $intervenant->getNomUsuel();
$prenom = $intervenant->getPrenom();
$dateNaissance = $intervenant->getDateNaissance();
$login = $form->get('login')->getValue();
$password = $form->get('password')->getValue();
$utilisateur = $this->getServiceUtilisateur()->creerUtilisateur($nom, $prenom, $dateNaissance, $login, $password);
$utilisateur->setCode($intervenant->getCode());
$this->getServiceUtilisateur()->save($utilisateur);
$intervenant->setUtilisateurCode($utilisateur->getCode());
}
$this->getServiceIntervenant()->save($intervenant);
$this->getServiceWorkflow()->calculerTableauxBord([], $intervenant);
$form->get('id')->setValue($intervenant->getId()); // transmet le nouvel ID
......
......@@ -2,6 +2,7 @@
namespace Application\Form\Intervenant;
use Application\Connecteur\Traits\LdapConnecteurAwareTrait;
use Application\Entity\Db\Civilite;
use Application\Entity\Db\Discipline;
use Application\Entity\Db\Grade;
......@@ -18,6 +19,8 @@ use Application\Service\Traits\GradeServiceAwareTrait;
use Application\Service\Traits\SourceServiceAwareTrait;
use Application\Service\Traits\StatutIntervenantServiceAwareTrait;
use Application\Service\Traits\StructureServiceAwareTrait;
use Application\Service\Traits\UtilisateurServiceAwareTrait;
use UnicaenApp\Form\Element\SearchAndSelect;
use UnicaenApp\Util;
use UnicaenImport\Entity\Db\Source;
use UnicaenImport\Service\Traits\SchemaServiceAwareTrait;
......@@ -67,7 +70,7 @@ class EditionForm extends AbstractForm
public function init()
{
$hydrator = new GenericHydrator($this->getServiceSource()->getEntityManager(), $this->hydratorElements);
$hydrator = new EditionFormHydrator($this->getServiceSource()->getEntityManager(), $this->hydratorElements);
$this->setHydrator($hydrator);
$this->setAttribute('action', $this->getCurrentUrl());
$this->setAttribute('class', 'form-intervenant-edition no-intranavigation');
......@@ -203,12 +206,43 @@ class EditionForm extends AbstractForm
],
]);
$utilisateur = new SearchAndSelect('utilisateur');
$utilisateur->setRequired(false)
->setSelectionRequired(false)
->setAutocompleteSource(
$this->getUrl('recherche', ['action' => 'utilisateurFind'])
)
->setLabel("Utilisateur")
->setAttributes(['title' => "Saisissez le nom suivi éventuellement du prénom (2 lettres au moins)"]);
$this->add($utilisateur);
$this->add([
'name' => 'login',
'type' => 'Text',
'options' => [
'label' => 'Login',
],
]);
$this->add([
'name' => 'password',
'type' => 'Password',
'options' => [
'label' => 'Mot de passe',
],
]);
$this->add([
'name' => 'utilisateurCode',
'name' => 'prenom',
'type' => 'Text',
'options' => [
'label' => 'Identifiant LDAP éventuel (' . \AppConfig::get('ldap', 'utilisateurCode', 'supannEmpId') . ')',
'label' => 'Prénom <span class="text-danger">*</span>',
'label_options' => ['disable_html_escape' => true],
],
]);
$this->add([
......@@ -407,10 +441,72 @@ class EditionForm extends AbstractForm
'discipline' => ['required' => false],
'grade' => ['required' => false],
'code' => ['required' => true],
'utilisateurCode' => ['required' => false],
'utilisateur' => ['required' => false],
'login' => ['required' => false],
'password' => ['required' => false],
'source' => ['required' => false],
'sourceCode' => ['required' => false],
'montantIndemniteFc' => ['required' => false],
];
}
}
class EditionFormHydrator extends GenericHydrator
{
use UtilisateurServiceAwareTrait;
use LdapConnecteurAwareTrait;
protected $noGenericParse = ['utilisateur', 'creerUtilisateur'];
/**
* @param array $data
* @param \Application\Entity\Db\Intervenant $object
*
* @return object
*/
public function hydrate(array $data, $object)
{
parent::hydrate($data, $object);
$login = isset($data['utilisateur']['id']) ? $data['utilisateur']['id'] : null;
if ($login) {
$code = $this->getConnecteurLdap()->getCodeFromLogin($login);
} else {
$code = null;
}
$object->setUtilisateurCode($code);
}
/**
* @param \Application\Entity\Db\Intervenant $object
*
* @return array
*/
public function extract($object)
{
$res = parent::extract($object);
$res['creerUtilisateur'] = !$object->getId() && !\AppConfig::get('cas', 'actif');
if ($code = $object->getUtilisateurCode()) {
$utilisateur = $this->getConnecteurLdap()->getUtilisateurFromCode($code, false);
if ($utilisateur) {
$res['utilisateur'] = [
'id' => $utilisateur->getUsername(),
'label' => (string)$utilisateur,
];
}
}
return $res;
}
}
\ No newline at end of file
......@@ -64,10 +64,31 @@ if ($errors) {
<div class="panel panel-default">
<div class="panel-heading">Liens avec le système d'information</div>
<div class="panel-body">
<?php
echo $this->formControlGroup($form->get('utilisateurCode'));
?>
<div class="row">
<div class="col-md-12">
<!-- Nav tabs -->
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active"><a href="#exists-user" aria-controls="exists-user"
role="tab" data-toggle="tab">Compte existant</a>
</li>
<li role="presentation"><a href="#new-user" aria-controls=new-user" role="tab"
data-toggle="tab">Créer un nouveau compte</a></li>
</ul>
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="exists-user">
<?= $this->formControlGroup($form->get('utilisateur')); ?>
</div>
<div role="tabpanel" class="tab-pane" id="new-user">
<div class="row">
<div class="col-md-6"><?= $this->formControlGroup($form->get('login')); ?></div>
<div class="col-md-6"><?= $this->formControlGroup($form->get('password')); ?></div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6"><?= $this->formControlGroup($form->get('source')); ?></div>
<div class="col-md-6"><?= $this->formControlGroup($form->get('sourceCode')); ?></div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment