<?php
namespace App\Controller\Admin;
use App\Entity\Admin\Produit;
use App\Entity\Admin\User;
use App\Entity\Admin\UserDocument;
use App\Form\Admin\UserType;
use App\Form\Admin\UserMassType;
use App\Manager\Admin\BranchManager;
use App\Manager\Admin\BranchProduitManager;
use App\Manager\Admin\BranchTypeManager;
use App\Manager\Admin\DepartmentManager;
use App\Manager\Admin\DroitManager;
use App\Manager\Admin\PerimetreManager;
use App\Manager\Admin\PerimetreSystemManager;
use App\Manager\Admin\ProduitManager;
use App\Manager\Admin\ProprietaireManager;
use App\Manager\Admin\UserFonctionnaliteManager;
use App\Manager\Admin\UserManager;
use App\Manager\Admin\UserProduitManager;
use App\Manager\Admin\UserProfilManager;
use App\Manager\Admin\UserProprietaireManager;
use App\Manager\Admin\UserDocumentManager;
use App\Manager\Nose\PrestationManager;
use App\Manager\Admin\ChampPersoManager;
use App\Manager\Admin\ChampPersoValueManager;
use App\Manager\Admin\DepartmentProduitManager;
use App\Repository\Admin\ProfilRepository;
use App\Service\FileService;
use App\Service\FilterService;
use App\Service\MessageManager;
use App\Service\ProduitApiConnector;
use App\Service\Utilities;
use Doctrine\DBAL\Connection;
use Doctrine\Persistence\ManagerRegistry;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class UserController
* @package App\Controller\Admin
* @Route("/admin/user", name="admin_user_")
*/
class UserController extends AbstractController
{
private Connection $abiConnection;
private string $droit = "UTILISATEUR";
public function __construct(
ManagerRegistry $managerRegistry,
private readonly BranchManager $branchManager,
private readonly BranchTypeManager $branchTypeManager,
private readonly ChampPersoManager $champPersoManager,
private readonly ChampPersoValueManager $champPersoValueManager,
private readonly DepartmentManager $departmentManager,
private readonly DroitManager $droitManager,
private readonly MessageManager $messageManager,
private readonly PerimetreManager $perimetreManager,
private readonly PerimetreSystemManager $perimetreSystemManager,
private readonly ProduitManager $produitManager,
private readonly PrestationManager $prestationManager,
private readonly ProprietaireManager $proprietaireManager,
private readonly UserManager $userManager,
private readonly UserFonctionnaliteManager $userFonctionnaliteManager,
private readonly UserProduitManager $userProduitManager,
private readonly UserProfilManager $userProfilManager,
private readonly UserProprietaireManager $userProprietaireManager,
private readonly FileService $fileService,
private readonly CacheInterface $cache
) {
$this->abiConnection = $managerRegistry->getConnection('abi');
}
/**
* @Route("/home/{page}/{nbOfResults}", name="home", defaults={"page" = 1, "nbOfResults" = 10})
*/
public function index(Request $request, FilterService $filterService, int $page, int $nbOfResults): Response
{
$this->droitManager->verifyUserRight($this->droit, "R");
[$success, $error, $filters] = $filterService->filterWithRequest($request, ['User'], $this->userManager->getRepository(), $page, $nbOfResults, false);
$users = $filterService->getItems();
/*foreach ($users as $user) {
$produitsTmp = $this->produitManager->getRepository()->getProduitByUser($user);
$user->produits = [];
if ($produitsTmp) {
foreach ($produitsTmp as $pt) {
if (!isset($user->produits[$pt['id']])) {
$user->produits[$pt['id']] = ['name' => $pt['name'], 'id' => $pt['id'], 'fullname' => $pt['name'] . ' ()'];
}
$user->produits[$pt['id']]['fullname'] = str_replace('(, ', '(', str_replace(')', (', ' . $pt['profil'] . ')'), $user->produits[$pt['id']]['fullname']));
}
$user->produits = array_values($user->produits);
}
}*/
$form = $this->createForm(UserMassType::class);
[$produits, $services, $branchs, $branch_types, $proprietaires] = $this->cache->get('user_filtres', function (ItemInterface $item) {
$item->expiresAfter(300);
return [
$this->produitManager->getRepository()->findAll(),
$this->departmentManager->getRepository()->findBy(['deletedAt' => null], ['name' => 'ASC']),
$this->branchManager->getRepository()->findBy(['deletedAt' => null], ['raisonSociale' => 'ASC']),
$this->branchTypeManager->getRepository()->findAll(),
$this->proprietaireManager->getRepository()->findBy([], ['nom' => 'ASC'])
];
});
return $this->render('admin/user/index.html.twig', [
'users' => $users,
'pagination' => $filterService->getPagination(),
'filters' => $filters,
'produits' => $produits,
'services' => $services,
'branchs' => $branchs,
'fields' => $filterService->getFields('user'),
'branch_types' => $branch_types,
'form' => $form->createView(),
'success' => $this->messageManager->getSuccess($success),
'error' => $this->messageManager->getError($error),
'udroits' => $this->droitManager->getUserRight($this->droit),
'proprietaires' => $proprietaires
]);
}
/**
* @Route("/new", name="new")
*/
public function create(Request $request): Response
{
$this->droitManager->verifyUserRight($this->droit, "C", "JAZMIN", 1);
$username = $request->get('username');
$user = $this->userManager->getRepository()->findOneBy(['username' => $username]);
if (empty($user)) {
$department = $this->departmentManager->getRepository()->find($request->get('department'));
$user = $this->userManager->insert($username, $request->get('lastname'), $request->get('firstname'), [], $request->get('email'), $request->get('type'), $department);
$data = [
'success' => true,
'error' => null,
'message' => 'OK !',
'user' => ['id' => $user->getId()],
];
} else {
$data = [
'success' => false,
'error' => "L'identifiant " . $username . " est déjà utilisé.",
'message' => "Erreur",
];
}
return new JsonResponse($data);
}
/**
* @Route("/new/embed", name="new_embed")
*/
public function newEmbed(Request $request): Response
{
$this->droitManager->verifyUserRight($this->droit, "C");
return $this->render('admin/user/new_embed.html.twig', [
'departments' => $this->departmentManager->getRepository()->findBy(['branch' => $request->get('branch_id'), 'deletedAt' => null], ['name' => 'ASC']),
'udroits' => [
'UTILISATEUR' => $this->droitManager->getUserRight($this->droit),
'PERIM_USER' => $this->droitManager->getUserRight("PERIM_USER"),
'FONCTIONNALITE' => $this->droitManager->getUserRight("FONCTIONNALITE"),
'PROFIL' => $this->droitManager->getUserRight("PROFIL")
]
]);
}
/**
* @Route("/show/{user}", name="show")
*/
public function read(User $user): Response
{
$this->droitManager->verifyUserRight($this->droit, "R");
$produitsData = [];
foreach ($user->getUserProfils() as $userProfil) {
if ($userProfil->getIsActive()) {
$profil = $userProfil->getProfil();
$profilDroits = $profil->getProfilDroits();
foreach ($profilDroits as $profilDroit) {
$droit = $profilDroit->getDroit();
$produit = $droit->getProduit();
$profilDroitData = [
"droit-code" => $droit->getCode(),
"droit-name" => $droit->getName(),
"has-read" => $profilDroit->getHasRead() ? '1' : '0',
"has-update" => $profilDroit->getHasUpdate() ? '1' : '0',
"has-create" => $profilDroit->getHasCreate() ? '1' : '0',
"has-delete" => $profilDroit->getHasDelete() ? '1' : '0',
"has-execute" => $profilDroit->getHasExecute() ? '1' : '0',
];
$produitsData[$produit->getName()]['profils'][$profil->getName()]['profilDroits'][] =
$profilDroitData;
$produitsData[$produit->getName()]['profils'][$profil->getName()]['id'] = $profil->getId();
$produitsData[$produit->getName()]['id'] = $produit->getId();
}
}
}
foreach ($produitsData as &$produit) {
foreach ($produit['profils'] as &$profil) {
$profil['profilDroits'] = htmlspecialchars(json_encode($profil['profilDroits']));
}
unset($profil);
ksort($produit['profils']);
}
unset($produit);
ksort($produitsData);
return $this->render('admin/user/show.html.twig', [
'user' => $user,
'produits' => $produitsData,
'udroits' => [
'UTILISATEUR' => $this->droitManager->getUserRight($this->droit),
'PERIM_USER' => $this->droitManager->getUserRight("PERIM_USER"),
'FONCTIONNALITE' => $this->droitManager->getUserRight("FONCTIONNALITE"),
'PROFIL' => $this->droitManager->getUserRight("PROFIL")
],
]);
}
/**
* @Route("/edit/{user}/embed", name="edit_embed")
*/
public function editEmbed(Request $request, User $user): Response
{
return $this->edit($request, $user, true);
}
/**
* @Route("/edit/{user}", name="edit")
*/
public function edit(Request $request, User $user, bool $embed = false): Response
{
$this->droitManager->verifyUserRight($this->droit, "U");
$redirect = $request->get('redirect');
$success = $request->get('success');
$userDept = $user->getDepartment();
$branch = $userDept->getBranch();
$departments = $this->departmentManager->getRepository()->findBy(['branch' => $branch, 'deletedAt' => null], ['name' => 'ASC']);
$userTreeList = $this->userManager->getUsersTreeListByBranch($branch, $departments);
// Enregistrement des infos du formulaire
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
$okForm = false;
$clientList = Utilities::selectDistinct($this->abiConnection, 'CO_DOSSIER', 'CLI_CODE', [], '', true);
if ($form->isSubmitted() && $form->isValid()) {
$okForm = true;
$this->champPersoManager->saveChampPersos("User", $user->getId(), $form);
// Périmètre client
$giveAccessUsers = $form->get('accessUsersInverse')->getData();
foreach ($giveAccessUsers as $giveAccessUser) {
/** @var User $targerUser */
$targerUser = $giveAccessUser;
$targerUser->addAccessUser($user);
$this->userManager->update($targerUser);
}
if ($this->droitManager->getUserRight("PERIM_USER", "U")) {
$this->perimetreManager->processRequest($user, $request, $clientList);
}
// Fonctionnalités
if ($this->droitManager->getUserRight("FONCTIONNALITE", "U")) {
$this->userFonctionnaliteManager->processRequest($user, $request);
}
// Profils
if ($this->droitManager->getUserRight("PROFIL", "U")) {
$this->userProfilManager->processRequest($user, $request);
}
if ($request->get('new_user')) {
$this->userManager->initializePassword($user);
}
$user->setDepartment($form->get('department')->getData());
$this->userManager->update($user);
$success = $this->messageManager->getSuccess('user_updated');
}
$openOffCanvas = $request->get('offcanvas') === 'on';
$newUser = $request->get('user') === 'new';
// Produits
$produitMesssage = '';
$produitList = [];
$reglages = [];
$fonctionnaliteList = [];
$profils = [];
$perimetres = [];
$etapeList = Utilities::selectDistinct($this->abiConnection, 'CO_DOSSIER', 'ETAPE', [], '', true);
$proprietaireList = Utilities::selectDistinct($this->abiConnection, 'CO_DOSSIER', 'PROPRIETAIRE', [], '', true);
$typeEnqueteList = Utilities::selectDistinct($this->abiConnection, 'CO_DOSSIER', 'TYPE', [], '', true);
if (empty($branch)) {
$produitMesssage = 'Veuillez sélectionner une organisation puis valider les modifications.';
} else {
$deptProduits = $userDept->getDepartmentProduits();
foreach ($deptProduits as $deptProduit) {
if ($deptProduit->getIsActive()) $produitList[] = $deptProduit->getProduit();
}
if (empty($produitList)) {
$produitMesssage = "Aucun produit trouvé pour le departement [" . $branch->getRaisonSociale() . " (" . $userDept->getName() . ")].";
} else {
// Fonctionnalités
$departmentFonctionnalites = $user->getDepartment()->getDepartmentFonctionnalites();
foreach ($departmentFonctionnalites as $departmentFonctionnalite) {
$userFonctionnalite = $this->userFonctionnaliteManager
->getRepository()
->findOneBy(['departmentFonctionnalite' => $departmentFonctionnalite->getId(), 'user_' => $user->getId()], []);
if (empty($userFonctionnalite)) {
$userFonctionnalite = $this->userFonctionnaliteManager->insert($user, $departmentFonctionnalite, true);
}
if ($departmentFonctionnalite->getIsActive()) {
$detailFonctionnalite = $departmentFonctionnalite->getDetailFonctionnalite();
$fonctionnalite = $detailFonctionnalite->getFonctionnalite();
$fonctionnaliteList[$fonctionnalite->getProduit()->getId()][] = [
'id' => $userFonctionnalite->getId(),
'libelle' => $detailFonctionnalite->getLibelleOverride() ?? $fonctionnalite->getLibelle(),
'is_active' => $userFonctionnalite->getIsActive()
];
}
}
foreach ($produitList as $produit) {
$reglages[$produit->getId()] = $this->userProduitManager->processRequest($user, $produit, $request, $okForm);
$profils[strval($produit->getId())] = $this->userProfilManager->processRequestProduit($user, $produit);
// Périmètres
$perimetres = $this->perimetreManager->processRequestWithProduit($user, $produit, $clientList, $etapeList, $proprietaireList, $typeEnqueteList, $perimetres);
}
}
}
// Propriétaires
$proprietaires = $this->userProprietaireManager->processRequest($user, $request, $okForm ?? false);
$userDocuments = [];
foreach ($user->getDocuments() as $userDocument) {
$userDocuments[] = $this->champPersoValueManager->populateChampPersos('UserDocument', $userDocument->getFormattedDatas(), true, true);
}
$perimetreSystemsByProduit = $this->perimetreSystemManager->getRepository()->getPerimetreSystemsByUserGroupedByProducts($user);
$perimetreSystemsByProduitNot = $this->perimetreSystemManager->getRepository()->getPerimetreSystemsByUserGroupedByProducts($user, true);
if (!empty($redirect)) {
return $this->redirect($redirect);
}
return $this->render('admin/user/edit' . ($embed ? '_embed' : '') . '.html.twig', [
'openOffCanvas' => $openOffCanvas,
'newUser' => $newUser,
'user' => $user,
'user_trees' => $userTreeList,
'departments' => $departments,
'department_selected' => $user->getDepartment(),
'form' => $form->createView(),
'profils' => $profils,
'produits' => $produitList,
'reglages' => $reglages,
'fonctionnalites' => $fonctionnaliteList,
'produit_message' => $produitMesssage,
'success' => $success,
'userDocuments' => $userDocuments,
'listChampsPerso' => $this->champPersoManager->getRepository()->getListChampPersos("UserDocument"),
// Périmètre dossier
'perimetres' => $perimetres,
'perimetreSystemsByProduit' => $perimetreSystemsByProduit,
'perimetreSystemsByProduitNot' => $perimetreSystemsByProduitNot,
'gestionnaires' => $this->userManager->getRepository()->findAll(),
'prestations' => $this->prestationManager->getRepository()->findAll(),
'gammes' => [],
'clients' => [],
'orga_affects' => [],
'etapes' => [
['id' => '1', 'label' => '1'],
['id' => '2', 'label' => '2'],
['id' => '3', 'label' => '3'],
['id' => '4', 'label' => '4'],
['id' => '5', 'label' => '5']
],
'groupes_commerciaux' => [],
'proprietaires' => $proprietaires,
'types_enquetes' => [],
'statut_archive' => [
['id' => '0', 'label' => '0'],
['id' => '1', 'label' => '1'],
['id' => '2', 'label' => '2'],
],
'user_highlight' => $request->get("user_highlight"),
'udroits' => [
'UTILISATEUR' => $this->droitManager->getUserRight($this->droit),
'PERIM_USER' => $this->droitManager->getUserRight("PERIM_USER"),
'FONCTIONNALITE' => $this->droitManager->getUserRight("FONCTIONNALITE"),
'PROFIL' => $this->droitManager->getUserRight("PROFIL")
]
]);
}
/**
* @Route("/tree", name="edit_tree")
*/
public function updateUserTrees(Request $request): Response
{
$this->droitManager->verifyUserRight($this->droit, "U", "JAZMIN", 1);
$trees = $request->get('user_trees');
if (!empty($trees)) {
foreach ($trees as $node) {
if (empty($node['parent'])) {
$this->userManager->getRepository()->cleanParentRootNiveauLeftAndRight($node['id']);
}
}
$this->userManager->updateUserTree($trees);
}
return new JsonResponse(['trees' => $trees]);
}
/**
* @Route("/delete/{user}/{route}", name="delete")
*/
public function delete(User $user, ?string $route = null): Response
{
$this->droitManager->verifyUserRight($this->droit, "D");
$error = null;
$success = null;
try {
$this->userManager->softDelete($user);
$success = 'user_removed';
} catch (Exception $exception) {
$error = $exception->getMessage();
}
if (!empty($route)) {
return $this->redirectToRoute('admin_user_home', [
'error' => $error,
'success' => $success,
]);
}
return new JsonResponse(json_encode([
'success' => $this->messageManager->getSuccess($success),
'error' => $this->messageManager->getError($error)
]));
}
/**
* @Route("/activate/{user}", name="activate")
*/
public function activate(User $user): Response
{
$this->droitManager->verifyUserRight($this->droit, "U");
$this->userManager->activate($user);
return $this->redirectToRoute('admin_user_home', [
'success' => 'user_activated',
]);
}
/**
* @Route("/deactivate/{user}", name="deactivate")
*/
public function deactivate(User $user): Response
{
$this->droitManager->verifyUserRight($this->droit, "U");
$this->userManager->deactivate($user);
return $this->redirectToRoute('admin_user_home', [
'success' => 'user_deactivated',
]);
}
/**
* @Route("/init_password", name="init_password")
*/
public function initPassword(Request $request, ProduitApiConnector $connector): JsonResponse|RedirectResponse
{
$this->droitManager->verifyUserRight($this->droit, "U");
$error = $this->initOnePassword($request->get('user_id'), $request->get('produit')[0], $connector);
$response_data = [
'success' => $error ? '' : 'user_password_initiated',
'error' => $error
];
$redirection = $request->get('redirection');
if (!empty($redirection) && $redirection) {
return new JsonResponse($response_data);
}
return $this->redirectToRoute('admin_user_home', $response_data);
}
/**
* @Route("/bulk_init_password", name="bulk_init_password")
*/
public function bulkInitPassword(Request $request, ProduitApiConnector $connector): RedirectResponse
{
$this->droitManager->verifyUserRight($this->droit, "U");
$produit = $request->get('produit')[0];
$usersId = $request->get('users_id');
$error = null;
if (!empty($usersId) && !empty($produit)) {
foreach ($usersId as $userId) {
$error = $this->initOnePassword($userId, $produit, $connector) ?? $error;
}
} else $error = 'produit_or_user_missing';
return $this->redirectToRoute('admin_user_home', [
'success' => $error ? '' : 'user_password_initiated',
'error' => $error
]);
}
private function initOnePassword(string $userId, string $produitName, ProduitApiConnector $connector): ?string
{
if (empty($userId) || empty($produitName)) {
return 'produit_or_user_missing';
}
/** @var Produit $produit */
$produit = $this->produitManager->getRepository()->find($produitName);
/** @var User $user */
$user = $this->userManager->getRepository()->find($userId);
if ($produit === null || $user === null || !empty($user->getDeletedAt())) {
return 'produit_or_user_missing';
}
if ($produit->getName() === 'JAZMIN') {
$this->userManager->initializePasswordForJazmin($user);
} else if ($produit->getName() === 'NOSE') {
$this->userManager->initializePasswordForNose($user);
} else {
$token = $this->userManager->setInitTokenForProduit($user->getUsername());
$organisation = $user->getDepartment()->getBranch();
$parameters = [
'token' => $token,
'username' => $user->getUsername(),
'nom' => $user->getLastname() . ' ' . $user->getFirstname(),
'email' => $user->getEmail(),
'ste' => $organisation->getMnemonique(),
];
$connector->sendRequestToProduit($produit, $parameters, 'GET', $produit->getInitPasswordUrl() ?? 'user/pass/init');
}
return null;
}
/**
* @Route("/reset_password", name="reset_password")
*/
public function resetPassword(Request $request, ProduitApiConnector $connector): JsonResponse|RedirectResponse
{
$this->droitManager->verifyUserRight($this->droit, "U");
$error = $this->resetOnePassword($request->get('user_id'), $request->get('produit')[0], $connector);
$response_data = [
'success' => $error ? '' : 'user_password_initiated',
'error' => $error
];
$redirection = $request->get('redirection');
if (!empty($redirection) && $redirection) {
return new JsonResponse($response_data);
}
return $this->redirectToRoute('admin_user_home', $response_data);
}
/**
* @Route("/bulk_reset_password", name="bulk_reset_password")
*/
public function bulkResetPassword(Request $request, ProduitApiConnector $connector): RedirectResponse
{
$this->droitManager->verifyUserRight($this->droit, "U");
$produit = $request->get('produit')[0];
$usersId = $request->get('users_id');
$error = null;
if (!empty($usersId) && !empty($produit)) {
foreach ($usersId as $userId) {
$error = $this->resetOnePassword($userId, $produit, $connector) ?? $error;
}
} else $error = 'produit_or_user_missing';
return $this->redirectToRoute('admin_user_home', [
'success' => $error ? '' : 'user_password_reset',
'error' => $error
]);
}
private function resetOnePassword(string $userId, string $produitName, ProduitApiConnector $connector): ?string
{
if (empty($userId) || empty($produitName)) {
return 'produit_or_user_missing';
}
/** @var Produit $produit */
$produit = $this->produitManager->getRepository()->find($produitName);
/** @var User $user */
$user = $this->userManager->getRepository()->find($userId);
if ($produit === null || $user === null || !empty($user->getDeletedAt())) {
return 'produit_or_user_missing';
}
if ($produit->getName() === 'JAZMIN') {
$this->userManager->resetPasswordForJazmin($user->getUsername());
} else if ($produit->getName() === 'NOSE') {
$this->userManager->resetPasswordForNose($user->getUsername());
} else {
$token = $this->userManager->resetPasswordForProduit($user->getUsername());
$organisation = $user->getDepartment()->getBranch();
$parameters = [
'token' => $token,
'username' => $user->getUsername(),
'nom' => $user->getLastname() . ' ' . $user->getFirstname(),
'email' => $user->getEmail(),
'ste' => $organisation->getMnemonique(),
];
$connector->sendRequestToProduit($produit, $parameters, 'GET', $produit->getResetPasswordUrl() ?? 'user/pass/reset');
}
return null;
}
/**
* @Route("/switch/{user}/{produit}", name="switch")
*/
public function switchUser(User $user, Produit $produit): JsonResponse
{
$this->droitManager->verifyUserRight($this->droit, "R");
[$url, $error] = $this->userManager->getSwitchUrl($user, $produit, $this->getUser());
return new JsonResponse(['url' => $url, 'error' => $error, 'success' => $error ? '' : 'URL trouvée']);
}
/**
* @Route("/mass/{users}/{key}/{value}/{route}", name="mass")
*/
public function mass(
string $users,
string $key,
$value,
?string $route = null,
BranchProduitManager $branchProduitManager,
DepartmentProduitManager $departmentProduitManager,
ProfilRepository $profilRepository
): Response {
$this->droitManager->verifyUserRight($this->droit, "U", "JAZMIN", 1);
$success = null;
$error = null;
try {
switch ($key) {
case 'department':
$value = $this->departmentManager->getRepository()->find($value);
break;
case 'fonction':
case 'type':
if (empty($value)) $value = null;
break;
case 'produit':
$value = explode('_', $value);
break;
}
foreach (explode(',', $users) as $user) {
$user = $this->userManager->getRepository()->find($user);
if ($user) {
switch ($key) {
case 'department':
$user->setDeparment($value);
break;
case 'fonction':
case 'type':
$user->{'set' . ucfirst($key)}($value);
break;
case 'produit':
$produit = $this->produitManager->getRepository()->find($value[0]);
$profil = $profilRepository->find($value[1]);
$branchProduitManager->checkAndInsert($user->getDepartment()->getBranch(), $produit, true, null, true);
$departmentProduitManager->checkAndInsert($user->getDepartment(), $produit, true, null, true);
$this->userProduitManager->checkAndInsert($user, $produit, true, null, true, null);
$this->userProfilManager->insert($user, $profil, true);
break;
default:
$this->champPersoManager->saveChampPerso("User", $user->getId(), $this->champPersoManager->getRepository()->findOneBy(['code' => $key]), $value);
break;
}
$this->userManager->update($user);
}
}
$success = 'user_mass_maj';
} catch (Exception $exception) {
$error = $exception->getMessage() . ' at ' . $exception->getLine();
}
if (!empty($route)) {
return $this->redirectToRoute('admin_user_' . $route, [
'success' => $success,
'error' => $error
]);
}
return new JsonResponse(json_encode([
'success' => $this->messageManager->getSuccess($success),
'error' => $this->messageManager->getError($error)
]));
}
/**
* @Route("/document/upload/{user}", name="upload_user_document", methods={"POST"})
*/
public function uploadUserDocument(Request $request, User $user, UserDocumentManager $userDocumentManager): JsonResponse
{
$this->droitManager->verifyUserRight("ORGANISATION", "U");
/** @var UploadedFile|null $file */
$file = $request->files->get('file');
if (!$file || !$file->isValid()) {
throw new \RuntimeException('Fichier invalide ou manquant');
}
// ---------- Nom du fichier ----------
$originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
$safeFilename = strtolower(Utilities::cleanString($originalFilename));
$uniq = uniqid();
$filename = sprintf(
'%s-%s.%s',
$safeFilename,
$uniq,
$file->guessExtension()
);
// ---------- DB ----------
$userDocument = $userDocumentManager->insert(
$user,
$request->request->get('nom'),
$filename,
$request->request->get('dateValid'),
$request->request->get('dateAlert')
);
// ---------- Stockage (local ou SMB) ----------
$this->fileService->saveUploadedFile(
$userDocument->getDocPath(),
$file,
$filename
);
// ---------- Champ perso ----------
$this->champPersoManager->saveChampPerso(
'UserDocument',
$userDocument->getId(),
$this->champPersoManager
->getRepository()
->findOneBy(['code' => 'USERDOCUMENT']),
$request->request->get('typeDeDocument')
);
return new JsonResponse(
$this->champPersoValueManager->populateChampPersos(
'UserDocument',
$userDocument->getFormattedDatas(),
true,
true
)
);
}
/**
* @Route("/document/view/{userDocument}", name="view_user_document", methods={"GET"})
*/
public function viewUserDocument(UserDocument $userDocument): BinaryFileResponse
{
$this->droitManager->verifyUserRight("ORGANISATION", "R");
return $this->fileService->getBinaryResponse($userDocument->getDocPath() . '/' . $userDocument->getPath());
}
/**
* @Route("/document/delete/{userDocument}", name="delete_user_document", methods={"GET"})
*/
public function deleteUserDocument(UserDocument $userDocument, UserDocumentManager $userDocumentManager): JsonResponse
{
$this->droitManager->verifyUserRight("ORGANISATION", "D");
$userDocumentManager->delete($userDocument);
return new JsonResponse(['ok']);
}
/**
* @Route("/getproduits/{user}", name="getproduits")
*/
public function getProduits(int $user): JsonResponse
{
$this->droitManager->verifyUserRight($this->droit, "R");
if ($user === 0) {
return new JsonResponse($this->produitManager->getRepository()->getSwitchableProduits());
}
return new JsonResponse($this->userManager->getRepository()->getProduits($user));
}
}