<?php
namespace App\Controller;
use App\Entity\User;
use App\Entity\UserVendor;
use App\Entity\Vendor;
use App\Form\Model\EmailRegistrationFormModel;
use App\Form\RegistrationStep2Type;
use App\Form\RegistrationStep3Type;
use App\Repository\UserRepository;
use App\Repository\VendorRepository;
use App\Repository\WilayahRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
class RegistrationController extends AbstractController
{
private MailerInterface $mailer;
private ManagerRegistry $doctrine;
private UserPasswordHasherInterface $passwordHasher;
private WilayahRepository $wilayahRepository;
public function __construct(
MailerInterface $mailer,
ManagerRegistry $doctrine,
UserPasswordHasherInterface $passwordHasher,
WilayahRepository $wilayahRepository
) {
$this->mailer = $mailer;
$this->doctrine = $doctrine;
$this->passwordHasher = $passwordHasher;
$this->wilayahRepository = $wilayahRepository;
}
private function generatePass(): string
{
$random = null;
$char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$n = 6;
for ($i = 0; $i <= $n; $i++) {
$index = rand(0, strlen($char) - 1);
$random .= $char[$index];
}
return $random;
}
private function sendEmail($email, $random, $url)
{
$mail = (new TemplatedEmail())
->from('sysadmin@wicida.ac.id')
->to($email)
->subject('Konfirmasi Pendaftaran Akun E-tender PDAM')
->htmlTemplate('registration/email.html.twig')
->context([
'url2' => $url . '/registration-step2/' . $random
]);
$this->mailer->send($mail);
return true;
}
private function addVendor($params)
{
$entityManager = $this->doctrine->getManager();
$user = new User();
$user->setEmail($params['email']);
$user->setEnabled(true);
$user->setPlainPassword($params['password']);
$hashedPassword = $this->passwordHasher->hashPassword(
$user,
$params['password']
);
$user->setPassword($hashedPassword);
$user->setRoles([
'ROLE_USER',
'ROLE_VENDOR'
]);
$vendor = new Vendor();
$vendor->setEmail($params['email']);
$vendor->setKodePendaftaran($params['password']);
$vendor->setStatus('DRAFT');
$vendor->setNamaPerusahaan("");
$vendor->setKodePendaftaran($params['password']);
$userVendor = new UserVendor();
$userVendor->setUser($user);
$userVendor->setVendor($vendor);
$userVendor->setKodePendaftaran($params['password']);
$entityManager->persist($user);
$entityManager->persist($vendor);
$entityManager->persist($userVendor);
$entityManager->flush();
}
#[Route('/registration-step2/{kodePendaftaran}', name: 'app_registration_step2')]
public function step2(
Request $request,
VendorRepository $vendorRepository,
UserRepository $userRepository,
ManagerRegistry $doctrine,
$kodePendaftaran
): Response {
$entityManager = $doctrine->getManager();
$vendor = $vendorRepository->findOneBy([
'kodePendaftaran' => $kodePendaftaran
]);
if (!$vendor) {
return $this->redirectToRoute('app_homepage');
}
$form = $this->createForm(RegistrationStep2Type::class, [
'username' => $vendor->getEmail()
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
// but, the original `$task` variable has also been updated
$pendaftaran = $form->getData();
$vendor->setNpwp($pendaftaran['npwp']);
$vendor->setBentukUsaha($pendaftaran['bentukUsaha']);
$vendor->setKantorCabang($pendaftaran['statusKantor']);
$user = $userRepository->findOneBy([
'email' => $vendor->getEmail()
]);
$hashedPassword = $this->passwordHasher->hashPassword(
$user,
$pendaftaran['password']
);
$user->setPassword($hashedPassword);
$entityManager->persist($user);
$entityManager->persist($vendor);
$entityManager->flush();
// ... perform some action, such as saving the task to the database
return $this->redirectToRoute('app_registration_step3', ['kodePendaftaran' => $kodePendaftaran]);
}
return $this->render('registration/step2.html.twig', [
'form' => $form->createView()
]);
}
#[Route('/registration-step3/{kodePendaftaran}', name: 'app_registration_step3')]
public function step3(
Request $request,
VendorRepository $vendorRepository,
UserRepository $userRepository,
ManagerRegistry $doctrine,
$kodePendaftaran
): Response {
$entityManager = $doctrine->getManager();
$vendor = $vendorRepository->findOneBy([
'kodePendaftaran' => $kodePendaftaran
]);
if (!$vendor) {
return $this->redirectToRoute('app_homepage');
}
$form = $this->createForm(RegistrationStep3Type::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
// but, the original `$task` variable has also been updated
$pendaftaran = $form->getData();
$vendor->setProvinsi($pendaftaran['provinsi']);
$kota = $this->wilayahRepository->findOneBy([
'kode' => $pendaftaran['kota']->getKode()
]);
$vendor->setKota($kota);
$vendor->setNoPengukuhanNpwp($pendaftaran['noPKP']);
$vendor->setNamaPerusahaan($pendaftaran['namaPerusahaan']);
$vendor->setAlamatPerusahaan($pendaftaran['alamatPerusahaan']);
$vendor->setKodePOs($pendaftaran['kodepos']);
$vendor->setTelepon($pendaftaran['noTelepon']);
$vendor->setFax($pendaftaran['fax']);
$vendor->setHp($pendaftaran['noHandphone']);
$vendor->setDeskripsi($pendaftaran['deskripsi']);
$entityManager->persist($vendor);
$entityManager->flush();
$email = $vendor->getEmail();
$mail = (new TemplatedEmail())
->from('sysadmin@wicida.ac.id')
->to($email)
->subject('Registrasi Berhasil')
->htmlTemplate('registration/email2.html.twig')
->context([
'username' => $email
]);
$this->mailer->send($mail);
// ... perform some action, such as saving the task to the database
return $this->redirectToRoute('app_registration_success');
}
return $this->render('registration/step2.html.twig', [
'form' => $form->createView()
]);
}
#[Route('/registration-success', name: 'app_registration_success')]
public function registrationSuccess()
{
return $this->render('registration/success.html.twig', []);
}
#[Route('/registration-Email/{email}', name: 'app_registration_Email')]
public function registrationEmail($email)
{
return $this->render('registration/success-email.html.twig', [
'email' => $email
]);
}
#[Route('/registration', name: 'app_registration')]
public function formEmail(Request $request): Response
{
$emailRegistrationForm = new EmailRegistrationFormModel();
$form = $this->createFormBuilder($emailRegistrationForm)
->add('email', EmailType::class, [
'help' => 'Pastikan memasukkan alamat email valid dan aktif. Contoh susan@gmail.com',
'attr' => [
'placeholder' => 'ptanugerah@anugerah.co.id'
]
])
->add('daftar', SubmitType::class, ['label' => 'Daftar'])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
// but, the original `$task` variable has also been updated
$data = $form->getData();
// ... perform some action, such as saving the task to the database
$url = $request->getSchemeAndHttpHost();
$random = $this->generatePass();
$this->addVendor(['email' => $emailRegistrationForm->getEmail(), 'password' => $random]);
$mailing = $this->sendEmail($emailRegistrationForm->getEmail(), $random, $url);
return $this->redirectToRoute('app_registration_Email', ['email' => $emailRegistrationForm->getEmail()]);
}
return $this->render('registration/registrationEmail.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/provinsi/{kodeProvinsi}/kota', name: 'get_kota_by_propinis')]
public function getKota(Request $request, $kodeProvinsi): JsonResponse
{
$data = $this->wilayahRepository->findKotaByKodePropinsi($kodeProvinsi);
return $this->json($data);
}
#[Route('/kota/{kodeKota}/kecamatan', name: 'get_kecamatan_by_kode')]
public function getKecamatan(Request $request, $kodeKota): JsonResponse
{
$data = $this->wilayahRepository->findKecamatanByKodeKota($kodeKota);
return $this->json($data);
}
#[Route('/kecamatan/{kodeKecamatan}/kelurahan', name: 'get_kelurahan_by_kode')]
public function getKelurahan(Request $request, $kodeKecamatan): JsonResponse
{
$data = $this->wilayahRepository->findKelurahanByKodeKecamatan($kodeKecamatan);
return $this->json($data);
}
}