<?php
namespace App\Controller;
use App\Entity\EventLog;
use App\Entity\Plant;
use App\Entity\Position;
use App\Entity\Role;
use App\Entity\SituationType;
use App\Entity\Supplier;
use App\Entity\SupplierStatus;
use App\Entity\TypeEventLog;
use App\Entity\User;
use App\Service\Notifications;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use App\Security\LoginFormAuthenticator;
use Twig\Environment;
/**
* @Route("/user")
*/
class UserController extends AbstractController
{
private $entityManager;
private $passwordEncoder;
private $userAuthenticator;
private $authenticator;
private $twig;
// Constructor actualizado
public function __construct(
EntityManagerInterface $entityManager,
UserPasswordHasherInterface $passwordEncoder,
UserAuthenticatorInterface $userAuthenticator,
LoginFormAuthenticator $authenticator,
Environment $twig
) {
$this->entityManager = $entityManager;
$this->passwordEncoder = $passwordEncoder;
$this->userAuthenticator = $userAuthenticator;
$this->authenticator = $authenticator;
$this->twig = $twig;
}
/**
* @Route("/list", name="app_user")
*/
public function index(): Response
{
$em = $this->entityManager;
//$users = $em->getRepository(User::class)->listUsers();
$users = $em->getRepository(User::class)->findAll();
$roles = $em->getRepository(Role::class)->findAll();
return $this->render('user/index.html.twig', [
'users' => $users,
'roles' => $roles
]);
}
/**
* @Route("/search", name="search_user")
*/
public function searchUser(Request $request): Response
{
$em = $this->entityManager;
$id = $request->get('id');
$userExist = $em->getRepository(User::class)->find($id);
$userData = [
'nameUser' => $userExist->getNameUser(),
'userEmail' => $userExist->getEmail(),
'personName' => $userExist->getNamePerson(),
'avatar' => $userExist->getAvatar(),
'RoleName' => $userExist->getRolesString(),
'RoleId' => $userExist->getRolesId(),
'status' => $userExist->getActive(),
];
$response = new Response(json_encode(['data' => $userData]));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/profile/{id}", name="profile_user")
*/
public function profileUser($id): Response
{
$em = $this->entityManager;
$userExist = $em->getRepository(User::class)->find($id);
$roles = $em->getRepository(Role::class)->findAll();
$userData = [
'id' => $userExist->getId(),
'nameUser' => $userExist->getNameUser(),
'userEmail' => $userExist->getEmail(),
'personName' => $userExist->getNamePerson(),
'avatar' => $userExist->getAvatar(),
'RoleName' => $userExist->getRolesString(),
'RoleId' => $userExist->getRolesId(),
'status' => $userExist->getActive(),
];
return $this->render('user/profile.html.twig', [
'users' => $userData,
'roles' => $roles
]);
}
/**
* @Route("/edit/{id}", name="load_user")
*/
public function editUser($id): Response
{
$em = $this->entityManager;
$userExist = $em->getRepository(User::class)->find($id);
$roles = $em->getRepository(Role::class)->findAll();
$userData = [
'id' => $id,
'nameUser' => $userExist->getName(),
'userEmail' => $userExist->getEmail(),
'personName' => $userExist->getNamePerson(),
'avatar' => $userExist->getAvatar(),
'password' => $userExist->getPassword(),
'RoleName' => $userExist->getRolesString(),
'RoleId' => $userExist->getRolesId(),
'status' => $userExist->getActive(),
];
return $this->render('user/edit.html.twig', [
'users' => $userData,
'roles' => $roles
]);
}
/**
* @Route("/verify", name="verify_user")
*/
public function verifyUser(Request $request): Response
{
$em = $this->entityManager;
$username = $request->get('userName');
$userExist = $em->getRepository(User::class)->findOneBy(['email' => $username]);
if ($userExist) {
$Active = $userExist->isActive();
} else {
$Active = null;
}
$response = new Response(json_encode(['exists' => $userExist !== null, 'Active' => $Active]));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/edit/profile", name="edit_profile", methods={"POST"})
*/
public function editProfile(Request $request)
{
$em = $this->entityManager;
$id = $this->getUser()->getId();
try {
$userName = $request->get('userNameEdit');
$roles = $request->get('rolesEdit');
$personName = $request->get('personNameEdit');
$userEmail = $request->get('userEmailEdit');
$plant_select = $request->get('plant_selectEdit');
$avatar = $request->get('imageEdit');
$statusSwitch = $request->get('statusSwitch');
$status = ($statusSwitch === 'on') ? true : false;
$userExist = $em->getRepository(User::class)->findOneBy(['nameUser' => $userName]);
$plant = $em->getRepository(Plant::class)->findOneBy(['id' => $plant_select]);
if ($avatar) {
$userExist->setAvatar($avatar);
}
if ($plant) {
$this->removeAllRolesExceptSuperAdmin($userExist);
$userExist->setActive($status);
$userExist->setPlant($plant);
foreach ($roles as $roleName) {
$role = $em->getRepository(Role::class)->findOneBy(['textName' => $roleName]);
if ($role) {
$userExist->addRole($role);
}
}
}
$userExist->setUpdatedAt(new \DateTime());
$userExist->setNameUser($userName);
$userExist->setEmail($userEmail);
$userExist->setNamePerson($personName);
$em->persist($userExist);
$em->flush();
$this->addFlash(
'success',
'El usuario fue actualizado exitosamente.'
);
} catch (\Throwable $th) {
$this->addFlash(
'error',
'Ocurrio un error al actualizar el usuario.'
);
}
return $this->redirectToRoute('load_user', ['id' => $id]);
}
/**
* @Route("/edit", name="edit_user", methods={"POST"})
*/
public function edit(Request $request)
{
$em = $this->entityManager;
try {
$userName = $request->get('userNameEdit');
$personName = $request->get('personNameEdit');
$userEmail = $request->get('userEmailEdit');
$avatar = $request->get('imageEdit');
$statusSwitch = $request->get('statusSwitch');
$status = ($statusSwitch === 'on') ? true : false;
$userExist = $em->getRepository(User::class)->findOneBy(['nameUser' => $userName]);
if ($avatar) {
$userExist->setAvatar($avatar);
}
$userExist->setActive($status);
$roles = $request->get('rolesEdit');
$currentRoles = $userExist->getRolesName();
foreach ($roles as $roleName) {
$role = $em->getRepository(Role::class)->findOneBy(['textName' => $roleName]);
// Verifica si el usuario ya tiene asignado el rol
if ($role && !in_array($role, $currentRoles)) {
$userExist->addRole($role);
}
}
$userExist->setUpdateAt();
$userExist->setNameUser($userName);
$userExist->setEmail($userEmail);
$userExist->setNamePerson($personName);
$em->persist($userExist);
$em->flush();
$this->addFlash(
'success',
'El usuario fue actualizado exitosamente.'
);
} catch (\Throwable $th) {
$this->addFlash(
'error',
'Ocurrió un error al actualizar el usuario.'
);
}
return $this->redirectToRoute('app_user');
}
/**
* @Route("/created", name="created_user", methods={"POST"})
*/
public function created(Request $request): Response
{
$em = $this->entityManager;
$userName = $request->get('userName');
$personName = $request->get('personName');
$userEmail = $request->get('userEmail');
$plant_select = $request->get('plant_select');
$idPosition = $request->get('idPosition');
$avatar = $request->get('image');
$password = 1234;
$position = $em->getRepository(Position::class)->findOneBy(['id' => $idPosition]);
$plant = $em->getRepository(Plant::class)->findOneBy(['id' => $plant_select]);
$userExist = $em->getRepository(User::class)->findOneBy(['nameUser' => $userName]);
if (!$userExist) {
$userExist = new User();
$userExist->setCreatedAt(new \DateTime());
$userExist->setPassword($this->passwordEncoder->hashPassword(
$userExist,
$password
));
}
if ($avatar) {
$userExist->setAvatar($avatar);
}
$userExist->setNameUser($userName);
$userExist->setEmail($userEmail);
$userExist->setPlant($plant);
$userExist->setPosition($position);
$userExist->setActive(1);
$userExist->setNamePerson($personName);
$roles = $request->get('roles');
foreach ($roles as $roleName) {
$role = $em->getRepository(Role::class)->findOneBy(['textName' => $roleName]);
if ($role) {
$userExist->addRole($role);
}
}
$em->persist($userExist);
$em->flush();
$this->addFlash(
'success',
'El usuario fue creado exitosamente.'
);
return $this->redirectToRoute('app_user');
}
/**
* @Route("/", name="register_provider", methods={"GET"})
*/
public function showRegisterProviderForm(): Response
{
return $this->render('user/register_provider.html.twig');
}
/**
* @Route("/", name="register_provider_post", methods={"POST"})
*/
public function registerProvider(Request $request, EntityManagerInterface $em, Notifications $notifications): Response
{
$rut = $request->get('rut');
$userName = $request->get('userName');
$userEmail = $request->get('userEmail');
$password = $request->get('password');
$representativeDni = $request->get('legalRepresentativeDni');
$fantasyName = $request->get('fantasyName');
$representativeName = $request->get('representativeName');
$existingSupplier = $em->getRepository(Supplier::class)->findOneBy(['supplierDni' => $rut]);
if ($existingSupplier) {
$this->addFlash('error', 'Ya existe un proveedor registrado con este RUT.');
return $this->redirectToRoute('register_provider');
}
if (empty($userName)) {
$this->addFlash('error', 'El campo de nombre de usuario no puede estar vacío.');
return $this->redirectToRoute('register_provider');
}
$existingUser = $em->getRepository(User::class)->findOneBy(['email' => $userEmail]);
if ($existingUser) {
$this->addFlash('error', 'Este correo ya se encuentra asociado a un usuario.');
return $this->redirectToRoute('register_provider');
}
$user = new User();
$user->setName($userName);
$user->setEmail($userEmail);
$user->setPassword($this->passwordEncoder->hashPassword($user, $password));
$role = $em->getRepository(Role::class)->find(3);
if ($role) {
$user->addRole($role);
}
$em->persist($user);
$em->flush();
$supplier = new Supplier();
$supplier->setUser($user);
$supplier->setSupplierDni($rut);
$supplier->setSupplierName($fantasyName);
$supplier->setCreatedAt();
$supplier->setContactEmailVal($userEmail);
$supplier->setActive(1);
$supplier->setEntityUser($user->getId());
$supplier->setRepresentativeDni($representativeDni);
$supplier->setRepresentativeName($representativeName);
$supplier->setBusinessName($userName);
$em->persist($supplier);
$em->flush();
$eventLog = new EventLog();
$eventLog->setCreatedAt();
$eventLog->setDescription(" se registro el usuario N°: " . $supplier->getId());
$eventLog->setTypeEntity("Supplier");
$eventLog->setUser($this->getUser());
$eventLog->setEntityId($supplier->getId());
$eventLog->setIndView(1);
$eventLog->setTypeEventLog($em->getRepository(TypeEventLog::class)->find(1));
$em->persist($eventLog);
$em->flush();
$situationType = $em->getRepository(SituationType::class)->find(1);
$supplierStatus = new SupplierStatus();
$supplierStatus->setStartDate($supplier->getCreatedAt());
$supplierStatus->setSituationType($situationType);
$supplierStatus->setSupplier($supplier);
$supplierStatus->setComment('Inicial');
$supplierStatus->setEntityUser($user->getId());
$em->persist($supplierStatus);
$em->flush();
$eventLog = new EventLog();
$eventLog->setCreatedAt();
$eventLog->setDescription( " se inicializo el proveedor proveedor N° " . $supplier->getId() . " a " . $situationType->getName());
$eventLog->setTypeEntity("SupplierStatus");
$eventLog->setUser($user);
$eventLog->setEntityId($supplierStatus->getId());
$eventLog->setIndView(1);
$eventLog->setTypeEventLog($em->getRepository(TypeEventLog::class)->find(1));
$em->persist($eventLog);
$em->flush();
$admins = $em->getRepository(User::class)->getUserByRoleId(2, true);
foreach ($admins as $admin) {
if (isset($admin['email'], $admin['name'])) {
$subject = 'Proveedor Ingresado en el Sistema';
$message = "
Estimado/a " . trim($admin['name']) . ",<br><br>
Se ha ingresado un nuevo proveedor en el sistema.<br>
Le invitamos a revisar la información del proveedor en el portal para verificar que esté completa y actualizar cualquier dato necesario.<br><br>
Saludos cordiales.<br>
";
$url = $this->generateUrl('view_supplier', ['id' => $supplier->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
$htmlContents = $this->twig->render('security/email.html.twig', [
'title' => $subject,
'messages' => $message,
'url' => $url,
]);
$notifications->newNotificationSystem($admin['email'], $subject, $htmlContents);
}
}
$addressContraloria = $em->getRepository(User::class)->find(97)->getEmail();
if ($addressContraloria) {
$subject = 'Proveedor Registrado en Plataforma';
$message = "
Estimada Área Cumplimiento,<br><br>
A continuacion se envian el nombre y rut de la empresa del proveedor registrado en plataforma de licitaciones. <br>
<strong> Nombre: </strong> " . $userName . " <br>
<strong> Rut: </strong> " . $rut . " <br><br>
Saludos cordiales.<br>";
$url = $this->generateUrl('supplier_add_document_external', ['supplierId' => $supplier->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
$htmlContents = $this->twig->render('security/email.html.twig', [
'title' => $subject,
'messages' => $message,
'url' => $url,
]);
$notifications->newNotificationSystem($addressContraloria, $subject, $htmlContents);
}
$this->addFlash('success', 'Usuario registrado exitosamente como Proveedor.');
$this->userAuthenticator->authenticateUser(
$user,
$this->authenticator,
$request
);
return $this->redirectToRoute('app_dash', ['rut' => $rut]);
}
/*****************************************************************************************/
}