<?php
namespace App\Controller;
use App\DTO\OrderFormDTO;
use App\Entity\P24roninOrders;
use App\Entity\User;
use App\Helper\RandStringHelper;
use App\Service\Integrations\Przelewy24;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Mailer\MailerInterface;
use App\Security\EmailVerifier;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Address;
use App\Form\ContactFormType;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Throwable;
class DefaultController extends AbstractController
{
const P24_MERCHANT_ID = 204581;
const P24_POS_ID = 204581;
const P24_CRC = '9060559fa034dfd7';
private EmailVerifier $emailVerifier;
private EntityManagerInterface $em;
public function __construct(
EmailVerifier $emailVerifier,
EntityManagerInterface $em
) {
$this->emailVerifier = $emailVerifier;
$this->em = $em;
}
#[Route('/', name: 'home')]
public function index(): Response
{
$contactForm = $this->createForm(ContactFormType::class);
return $this->render('default/index.html.twig', [
'controller_name' => 'DefaultController',
'session_id' => md5(session_id().date("YmdHis")),
'contactForm' => $contactForm->createView(),
]);
}
#[Route('/homepage_order_form', name: 'app_form_order')]
public function orderFormAction(Request $request, MailerInterface $mailer): JsonResponse
{
if($request->isMethod('POST')) {
$objectNormalizer = new ObjectNormalizer();
$normalizers = [$objectNormalizer];
$encoders = [new JsonEncoder()];
$serializer = new Serializer($normalizers, $encoders);
/** @var OrderFormDTO $formData */
$formData = $serializer->deserialize($request->getContent(), OrderFormDTO::class, 'json');
try {
$string_pass = null;
$user = $this->em->getRepository(User::class)->findOneByEmail($formData->getEmail());
if ($user === null) {
$generatePass = RandStringHelper::generate();
$string_pass = "Hasło: ".$generatePass;
$user = $this->em->getRepository(User::class)->addUserFromMail($generatePass, $formData->getEmail());
}
// Price in pennies by gross price => amount of assessments
$availableAssessments = [
1 => 1,
2448 => 1,
11058 => 5,
40578 => 20,
98388 => 50,
];
$selectedAssessment = $availableAssessments[$formData->getFinalPriceGross()];
$mailToClient = (new TemplatedEmail())
->from(new Address('kontakt@ronin24.pl', 'Ronin24'))
->to($formData->getEmail())
->subject('Potwierdzenie złożenia zamówienia w RONiN24.pl')
->htmlTemplate('default/order_email.html.twig')
->context([
'company_name' => $formData->getCompany() ?? '-',
'nip' => $formData->getNip() ?? '-',
'address' => $formData->getFullAddress(),
'pakiet' => $selectedAssessment,
'netto' => number_format($formData->getFinalPriceNet()/100, 2),
'brutto' => number_format($formData->getFinalPriceGross()/100, 2),
'phone' => $formData->getPhone(),
'client' => $formData->getName(),
'cemail' => $formData->getEmail(),
'password' => $string_pass,
])
;
$mailToRoninAdmins = (new TemplatedEmail())
->from(new Address('kontakt@ronin24.pl', 'Ronin24'))
->to('kontakt@ronin24.pl')
->subject('Nowe zapytanie ofertowe w RONiN24.pl')
->htmlTemplate('default/order_email.html.twig')
->context([
'company_name' => $formData->getCompany() ?? '-',
'nip' => $formData->getNip() ?? '-',
'address' => $formData->getFullAddress(),
'pakiet' => $selectedAssessment,
'netto' => number_format($formData->getFinalPriceNet()/100, 2),
'brutto' => number_format($formData->getFinalPriceGross()/100, 2),
'phone' => $formData->getPhone(),
'client' => $formData->getName(),
'cemail' => $formData->getEmail(),
'password' => $string_pass,
])
;
$mailer->send($mailToClient);
$mailer->send($mailToRoninAdmins);
$randomSessionID = md5(session_id().date("YmdHis"));
// Można było zdecydowanie lepiej to zrobić, ale niestety czas na gonił ;p
// $P24 = new Przelewy24(self::P24_MERCHANT_ID, self::P24_POS_ID, self::P24_CRC, false); // Prod
$P24 = new Przelewy24(204580, 204580, '41944b70501d6345', true); // Sandbox
$P24->addValue("p24_session_id", $randomSessionID);
$P24->addValue("p24_order_id", rand());
$P24->addValue("p24_amount", $formData->getFinalPriceGross());
$P24->addValue("p24_currency", 'PLN');
$P24->addValue("p24_description", 'Zakup uslugi Ronin');
$P24->addValue("p24_country", 'PL');
$P24->addValue('p24_api_version', '3.2');
$P24->addValue("p24_email", $formData->getEmail());
$P24->addValue("p24_client", $formData->getCompany() ?? $formData->getName());
$P24->addValue("p24_street", $formData->getAddress());
$P24->addValue("p24_number_street", $formData->getApartmentNumber());
$P24->addValue("p24_city", $formData->getCity());
$P24->addValue("p24_zip_code", $formData->getPostalCode());
$P24->addValue("p24_phone", $formData->getPhone());
$P24->addValue('p24_url_return', 'https://' . $request->getHost() . '/potwierdzono');
$P24->addValue('p24_url_status', 'https://' . $request->getHost() . '/zaplac?ok=2');
$orderSession = $this->em->getRepository(P24roninOrders::class)->findOneBy(array('p24_session_id' => $randomSessionID));
if ($orderSession === null){
$p24Sign = md5($randomSessionID ."|". self::P24_POS_ID ."|". $formData->getFinalPriceGross()/100 ."|PLN|".self::P24_CRC) ;
$p24ronin_orders = new P24roninOrders();
$p24ronin_orders->setP24MerchantId(self::P24_MERCHANT_ID);
$p24ronin_orders->setP24PosId(self::P24_POS_ID);
$p24ronin_orders->setP24Crc(self::P24_CRC);
$p24ronin_orders->setP24SessionId($randomSessionID);
$p24ronin_orders->setP24Amount($formData->getFinalPriceGross()/100);
$p24ronin_orders->setP24Currency('PLN');
$p24ronin_orders->setP24Client($formData->getName());
$p24ronin_orders->setP24Email($formData->getEmail());
$p24ronin_orders->setP24Company($formData->getCompany() ?? '');
$p24ronin_orders->setP24Address($formData->getFullAddress());
$p24ronin_orders->setP24Nip($formData->getNip() ?? '');
$p24ronin_orders->setDateinsert(new \DateTime());
$p24ronin_orders->setP24Phone($formData->getPhone());
$p24ronin_orders->setP24Sign($p24Sign);
$p24ronin_orders->setUserId($user->getId());
$p24ronin_orders->setP24Netto($formData->getFinalPriceNet()/100);
$this->em->persist($p24ronin_orders);
$this->em->flush();
}
$p24TestConnection = $P24->testConnection();
if(isset($p24TestConnection["error"]) && $p24TestConnection["error"] !== '0') {
dump('test_connection_error');
return new JsonResponse(
[
'status' => 'error',
'message' => 'Błąd podczas wysyłki formularza! Spróbuj ponownie później!',
],
500);
}
$p24Register = $P24->trnRegister();
return new JsonResponse(
[
'status' => 'success',
'message' => "Zaraz zostaniesz przekierowany do płatności!",
'p24RedirectToken' => $P24->trnRequest($p24Register['token'], false),
],
200
);
} catch ( Throwable $t ) {
dump($t->getMessage());
return new JsonResponse(
[
'status' => 'error',
'message' => 'Błąd podczas składania zamówienia! Spróbuj ponownie później!',
],
500);
}
}
return new JsonResponse(
[
'status' => 'error',
'message' => 'Błąd podczas składania zamówienia! Spróbuj ponownie później!',
],
500);
}
// #[Route('/order', name: 'order')]
// public function order(Request $request, ManagerRegistry $doctrine,MailerInterface $mailer): Response
// {
// $pattern = '/^[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/';
// if ($_POST['p24_email'] !== '' && $_POST['nip'] !== '' && $_POST['company_name'] !== '' && $_POST['p24_amount'] !== '' && $_POST['p24_phone'] !== '' && preg_match($pattern, $_POST['p24_email'])){
// $price = $_POST['p24_amount']/100;
// $brutto = $price*1.23;
//
// $mail = (new TemplatedEmail())
// ->from(new Address('kontakt@ronin24.pl', 'Ronin24'))
// ->to($_POST['p24_email'])
// ->subject('Potwierdzenie złożenia zamówienia w RONiN24.pl')
// ->htmlTemplate('default/order_email.html.twig')
// ->context([
// 'company_name' => $_POST['company_name'],
// 'nip' => $_POST['nip'],
// 'address' => $_POST['p24_address'],
// 'pakiet' => $_POST['pakiet'],
// 'netto' => $price,
// 'brutto' => number_format($brutto, 2),
// 'phone' => $_POST['p24_phone'],
// 'client' => $_POST['p24_client'],
//
// ])
// ;
// $mailer->send($mail);
// $mail2 = (new TemplatedEmail())
// ->from(new Address($_POST['p24_email'], $_POST['p24_client']))
// ->to('kontakt@ronin24.pl')
// ->subject('Nowe zapytanie ofertowe w RONiN24.pl')
// ->htmlTemplate('default/order_email.html.twig')
// ->context([
// 'company_name' => $_POST['company_name'],
// 'nip' => $_POST['nip'],
// 'address' => $_POST['p24_address'],
// 'pakiet' => $_POST['pakiet'],
// 'netto' => $price,
// 'brutto' => number_format($brutto, 2),
// 'phone' => $_POST['p24_phone'],
// 'client' => $_POST['p24_client'],
//
// ])
// ;
// $mailer->send($mail2);
//
// return new JsonResponse(1);
// }
// else {
// return new JsonResponse(0);
// }
//
// }
#[Route('/contact', name: 'contact')]
public function contact(Request $request, ManagerRegistry $doctrine,MailerInterface $mailer): Response
{
$pattern = '/^[a-zA-Z0-9.\-_]+@[a-zA-Z0-9\-.]+\.[a-zA-Z]{2,4}$/';
if ($_POST["contact_form"]["email"] !== '' && $_POST["contact_form"]['phone'] !== '' && $_POST["contact_form"]['textarea'] !== '' && $_POST["contact_form"]['checkbox'] !== '' && preg_match($pattern, $_POST["contact_form"]["email"] )){
$mail = (new TemplatedEmail())
->from(new Address('kontakt@ronin24.pl', 'Ronin24'))
->to($_POST["contact_form"]["email"])
->subject('Potwierdzenie wysłania z formularza w RONiN24.pl')
->htmlTemplate('default/contact_email.html.twig')
->context([
'phone' => $_POST["contact_form"]['phone'],
'textarea' => $_POST["contact_form"]['textarea'],
])
;
$mailer->send($mail);
$mail2 = (new TemplatedEmail())
->from(new Address($_POST["contact_form"]["email"], ' Email'))
->to('kontakt@ronin24.pl')
->subject('Nowe wiadomosć w RONiN24.pl')
->htmlTemplate('default/contact_email.html.twig')
->context([
'phone' => $_POST["contact_form"]['phone'],
'textarea' => $_POST["contact_form"]['textarea'],
])
;
$mailer->send($mail2);
return new JsonResponse(1);
}
else {
return new JsonResponse(0);
}
}
}