<?php
namespace App\Web;
use App\Entity\Branch;
use App\Entity\SystemUser;
use App\Entity\User;
use App\Entity\UserBranch;
use App\Form\SystemUserType;
use ContainerLSzrMBa\getPasswordHasherInterfaceService;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\Persistence\ObjectManager;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerBuilder;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactory;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\PasswordHasher\PasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
class SystemUsersController extends AbstractController
{
private ObjectManager $em;
//["ROLE_USER","ROLE_WEB","ROLE_ADMIN_WEB"]
private array $ROLES = [
1 => ["ROLE_USER", "ROLE_WEB", "ROLE_ADMIN_WEB", "ROLE_MPESA_ADMIN"],
2 => ["ROLE_USER", "ROLE_WEB", "ROLE_WEB_BRANCH","ROLE_MPESA_ADMIN"],
3 => ["ROLE_USER"]
];
private UserPasswordHasherInterface $passwordHasher;
public function __construct(ManagerRegistry $managerRegistry, UserPasswordHasherInterface $passwordHasher)
{
$this->em = $managerRegistry->getManager();
$this->passwordHasher = $passwordHasher;
}
/**
* @Route("/system_users", name="systemUsersHomeRoute")
* @param Request $request
* @return Response
*/
public function systemUsersHomeAction(Request $request)
{
return $this->render('system_users/all_system_users.html.twig', [
]);
}
/**
* @Route("/system_user/new", name="systemUserNewRoute")
* @param Request $request
* @return Response
*/
public function systemUserNewAction(Request $request)
{
$em = $this->em;
$systemUser = new SystemUser();
$systemUser->setCreatedAt(new \DateTime());
$form = $this->createForm(SystemUserType::class, $systemUser, [
'validation_groups' => [
'Default'
]
]);
$form->handleRequest($request);
/* $sysUser = $em->getRepository(SystemUser::class)->findOneBy([
'idNumber' => $systemUser->getIdNumber()
]);*/
if ($form->isSubmitted()) {
$sysUser = $em->getRepository(SystemUser::class)->getMainSystemUser($systemUser->getPhone());
$branch = null;
if (!$sysUser) {
$form->get('phone')->addError(new FormError('User not found'));
}else{
$branch = $em->getRepository(Branch::class)->findOneBy([
'branchCode' => $sysUser['branchID']
]);
if (!$branch) {
$form->get('phone')->addError(new FormError("Branch code: {$sysUser['branchID']} not available ... "));
}
}
if ($form->isValid()) {
$name = $sysUser['username'];
$phone = $sysUser['phoneNumber'];
$email = trim($sysUser['emailAddress']);
$branchId = $sysUser['branchID'];
$userid = $sysUser['userID'];
$systemUser = new SystemUser();
$systemUser->setPhone(trim($phone));
$systemUser->setCreatedAt(new \DateTime());
$systemUser->setBranchCode(trim($branchId));
$systemUser->setStaffName(trim($name));
$systemUser->setIdNumber(trim($phone));
$systemUser->setStaffCode(trim($userid));
$this->em->persist($systemUser);
$role = $form->get('roles')->getData();
try {
if ($role == 1 || $role == 2) {
$user = new User();
$user->setRoles($this->ROLES[$role]);
$user->setSystemUser($systemUser);
$user->setBranch($branch);
$user->setCreatedAt(new \DateTime());
$user->setPhone($email);
$user->setIsActive(true);
$hashedPass = $this->passwordHasher->hashPassword($user, $systemUser->getPhone());
$user->setPassword($hashedPass);
/** @var Branch[] $branches */
$branches = $form->get('branches')->getData();
dump($branches);
foreach ($branches as $index => $br) {
$userBranch = new UserBranch();
$userBranch->setUser($user);
$userBranch->setBranch($br);
$userBranch->setCreatedBy($this->getUser());
$userBranch->setCreatedAt(new \DateTime());
$this->em->persist($userBranch);
}
$userBranch = new UserBranch();
$userBranch->setUser($user);
$userBranch->setBranch($branch);
$userBranch->setCreatedBy($this->getUser());
$userBranch->setCreatedAt(new \DateTime());
$this->em->persist($userBranch);
$em->persist($user);
dump($user);
}
$em->flush();
return $this->redirectToRoute('systemUserNewRoute');
} catch (\Exception $e) {
dump($e);
}
}
}
return $this->render('system_users/system_user_new.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/system_user/{id}", name="systemUserUpdateRoute")
* @param Request $request
* @return Response
*/
public function systemUserUpdateAction(Request $request, $id)
{
$em = $this->em;
$systemUser = $em->getRepository('App:SystemUser')->findOneBy([
'id' => $id
]);
if (!$systemUser) {
return $this->render('system_users/system_user_new.html.twig', [
'form' => $form->createView()
]);
}
$systemUser->setCreatedAt(new \DateTime());
$form = $this->createForm(SystemUserType::class, $systemUser, [
'validation_groups' => [
'Default'
]
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$branch = $form->get('branch')->getData();
$systemUser->setBranchCode($branch->getBranchCode());
try {
$lastUser = $em->getRepository('App:SystemUser')->findOneBy([], [
'id' => 'desc'
]);
$systemUser->setStaffCode($lastUser->getStaffCode() + 1);
$em->persist($systemUser);
$em->flush();
return $this->redirectToRoute('systemUserNewRoute');
} catch (\Exception $e) {
dump($e);
}
}
return $this->render('system_users/system_user_new.html.twig', [
'form' => $form->createView()
]);
}
/**
* @Route("/system_users/json", name="systemUsersJSONRoute")
* @return Response
*/
public function systemUsersJSON(Request $request)
{
$context = new SerializationContext();
$context->setSerializeNull(true);
$serializer = SerializerBuilder::create()->build();
$em = $this->getDoctrine()->getManager();
$page = $request->request->get('page') > 1 ? $request->request->get('page') : 1;
$rows = $request->request->get('rows') > 1 ? $request->request->get('rows') : 20;
$offset = ($page - 1) * $rows;
$filterRules = $request->request->get('filterRules');
$transactions = $em->getRepository(SystemUser::class)->getAllSystemUsers($filterRules, $offset, $rows);
$count = $em->getRepository(SystemUser::class)->getAllSystemUsersCounter($filterRules);
$data = [
'total' => $count,
'rows' => $transactions,
];
// $data = $serializer->serialize($data, 'json', $context);
// $data = json_encode($data, false);
return new JsonResponse($data, Response::HTTP_OK, [
'ContentType' => 'application/json'
]);
}
}