<?php
namespace App\Controller;
use Dompdf\Dompdf;
use Dompdf\Options;
use App\Entity\Site;
use App\Entity\User;
use App\Entity\Klient;
use App\Entity\Atrybuty;
use App\Entity\Produkty;
use App\Entity\Purchaser;
use App\Form\PricingType;
use App\Entity\Zamowienia;
use App\Entity\AtrybutyGrupy;
use App\Entity\AtrybutyProdukt;
use Symfony\Component\Mime\Email;
use App\Repository\SiteRepository;
use App\Repository\UserRepository;
use App\Repository\ProduktyRepository;
use App\Repository\SettingsRepository;
use App\Repository\KategorieRepository;
use App\Repository\PurchaserRepository;
use App\Repository\AtrybutyGrupyRepository;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use App\Repository\AtrybutyProduktrepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Doctrine\Persistence\ManagerRegistry as PersistenceManagerRegistry;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class DefaultController extends AbstractController
{
public function __construct(private SiteRepository $siteRepository){
}
/**
* @Route("/page/{page}", name="page")
*/
public function indexPage(Site $page, Request $request, PersistenceManagerRegistry $doctrine,
KategorieRepository $kategorieRepository)
{
// replace this example code with whatever you need
//$repository = $doctrine
//->getRepository($kategorie);
$strony = $this->siteRepository->findBy([],['sortOrder'=>'ASC']);
return $this->render('/default/page.html.twig', [
'strona' => $page,
'strony'=>$strony
]);
}
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request, PersistenceManagerRegistry $doctrine,
KategorieRepository $kategorieRepository)
{
// replace this example code with whatever you need
//$repository = $doctrine
//->getRepository($kategorie);
$kategorie = $kategorieRepository->findBy(['visible' => true],['kategoria'=>'ASC']);
$strony = $this->siteRepository->findBy([],['sortOrder'=>'ASC']);
return $this->render('/default/index.html.twig', [
'kategorie' => $kategorie,
'strony'=>$strony
]);
}
/**
* @Route("/produkty.html", name="strona_produkty")
*/
public function produktyAction(Request $request, PersistenceManagerRegistry $doctrine, ProduktyRepository $produktyRepository)
{
// replace this example code with whatever you need
$repository = $produktyRepository;
$strony = $this->siteRepository->findBy([],['sortOrder'=>'ASC']);
$produkty = $repository->findBy([
'kategoria' => $request->query->get('id'),
'aktywny'=>true]);
return $this->render('/default/produkty.html.twig', [
'produkty' => $produkty,
'strony'=>$strony
]);
}
/**
* @Route("/produkt.html", name="strona_produkt")
*/
public function produktAction(Request $request, PersistenceManagerRegistry $doctrine, SettingsRepository $settingsRepository, ProduktyRepository $produktyRepository, AtrybutyGrupyRepository $atrybutyGrupyRepository, AtrybutyProduktrepository $atrybutyProduktrepository)
{
// pobieramy konfiguracje i przydzielamy do tablicy
$rows = $settingsRepository->findAll();
$settings = array();
foreach ($rows as $row) {
$settings[$row->getConfigName()] = $row->getConfigValue();
}
$produkt = $produktyRepository->findOneById($request->query->get('id'));
$atrybutygrupy = $atrybutyGrupyRepository->findBy(array(), array('kolejnosc' => 'asc'));
//$repository = $atrybutyProduktrepository->findAll();
$grupy = array();
foreach ($atrybutygrupy as $foo) {
$atrybutyprodukt = $atrybutyProduktrepository->findBy(
array(
'idGrupy' => $foo->getId(),
'idProduktu' => $request->query->get('id')
),
array('kolejnosc' => 'ASC')
);
$par = array();
foreach ($atrybutyprodukt as $foo2) {
$par[$foo2->getIdAtrybut()] = $foo2;
}
$grupy[] = array(
'id' => $foo->getId(),
'nazwa' => $foo->getNazwa(),
'typ' => $foo->getTyp(),
'pokaz_cene' => $foo->getPokazCene(),
'par' => $par
);
}
//dd($grupy);
$form = $this->createForm(PricingType::class);
$strony = $this->siteRepository->findBy([],['sortOrder'=>'ASC']);
return $this->render('/default/produkt.html.twig', array(
'produkt' => $produkt,
'grupy' => $grupy,
'settings' => $settings,
'back_href' => $this->container->get('request_stack')->getCurrentRequest()->headers->get('referer'),
'form' => $form->createView(),
'strony'=>$strony
));
}
/**
* @Route("/potwierdz_zamowienie.html", name="strona_potwierdz")
*/
public function potwierdzAction(Request $request, PersistenceManagerRegistry $doctrine, ProduktyRepository $produktyRepository, AtrybutyGrupyRepository $atrybutyGrupyRepository, AtrybutyProduktrepository $atrybutyProduktrepository)
{
// replace this example code with whatever you need
// $repository = $doctrine
// ->getRepository('App:Produkty');
$produkt = $produktyRepository->findOneById($request->get('id'));
//$content = $request->getContent();
//dd($content);
$gr = $request->get('gr');
$war = $request->get('war');
$ord = array();
$cena = 0;
$square = $request->get('powierzchnia');
$vat = $request->get('vat');
//dd($war);
foreach ($war as $key => $value) {
$atrybutyprodukt = $atrybutyProduktrepository->findOneById($key);
$atrybutygrupa = $atrybutyGrupyRepository->findOneById($atrybutyprodukt->getIdGrupy());
if ($atrybutyprodukt) {
$ord[] = array(
'nazwa' => $atrybutyprodukt->getNazwa(),
'id' => $atrybutyprodukt->getId(),
'wartosc' => $value,
'cena' => $atrybutyprodukt->getCena(),
'typ' => $atrybutyprodukt->getTyp(),
'grupa' => $atrybutygrupa->getNazwa()
);
if ($atrybutyprodukt->getCenaWymiar()) {
$cena += $atrybutyprodukt->getCena() * $square;
} else {
$cena += $atrybutyprodukt->getCena();
}
}
}
foreach ($gr as $key => $value) {
$atrybutyprodukt = $atrybutyProduktrepository->findOneById($value);
$atrybutygrupa = $atrybutyGrupyRepository->findOneById($atrybutyprodukt->getIdGrupy());
if ($atrybutyprodukt) {
$ord[] = array(
'nazwa' => $atrybutyprodukt->getNazwa(),
'id' => $atrybutyprodukt->getId(),
'wartosc' => $value,
'cena' => $atrybutyprodukt->getCena(),
'typ' => $atrybutyprodukt->getTyp(),
'grupa' => $atrybutygrupa->getNazwa()
);
if ($atrybutyprodukt->getCenaWymiar()) {
$cena += $atrybutyprodukt->getCena() * $square;
} else {
$cena += $atrybutyprodukt->getCena();
}
//echo $atrybutyprodukt->getNazwa() . ' ' . $atrybutyprodukt->getCena() . ' c: ' . $cena . '<br>';
}
}
$strony = $this->siteRepository->findBy([],['sortOrder'=>'ASC']);
return $this->render('/default/potwierdz.html.twig', array(
'produkt' => $produkt,
'order' => $ord,
'cena' => $cena,
'vat' => $vat,
'powierzchnia' => $square,
'strony'=>$strony
));
}
/**
* @Route("/realizuj.html", name="strona_realizuj")
*/
public function realizujAction(
Request $request,
PersistenceManagerRegistry $doctrine,
UserRepository $userRepository,
AtrybutyProduktrepository $atrybutyProduktrepository,
AtrybutyGrupyRepository $atrybutyGrupyRepository,
ProduktyRepository $produktyRepository,
MailerInterface $mailer,
ParameterBagInterface $parameterBag,
PurchaserRepository $purchaserRepository
) {
// owner sunglass i user www dla zamowienia ze strony
$user = $userRepository->findOneBy(array('www' => 1));
/**
* @var User $user
*/
$id_user = $user->getId();
/**
* @var User $id_owner
*/
$partner = $user->getPartner();
$order = $request->get('order');
$purchaser = $purchaserRepository->findOneBy([
'partner' => $partner,
'mail' => $request->get('email_firmy')
]);
if (!$purchaser) {
$purchaser = new Purchaser();
$purchaser->setNazwa($request->get('nazwa_firmy'));
$purchaser->setAdres($request->get('adres'));
$purchaser->setKod($request->get('kod'));
$purchaser->setMiasto($request->get('miasto'));
$purchaser->setTelefon($request->get('telefon'));
$purchaser->setMail($request->get('email_firmy'));
$purchaser->setPartner($partner);
$purchaser->setUser($user);
$purchaser->setWojewodztwo($request->get('wojewodztwo'));
$em = $doctrine->getManager();
$em->persist($purchaser);
$em->flush();
}
$id_klient = $purchaser->getId();
$square = $request->get('powierzchnia');
$order = $request->get('order');
$vat = $request->get('vat');
$margin = 0;
$cena = 0;
$cenaRabat = 0;
$cenaBezMarzy = 0;
$discount = 0;
$all = [];
$marginEnd = $user->getPartner()->getMarza();
$discountEnd = $request->get('rabat_hidden');
foreach ($order as $key => $foo) {
$atrybutyprodukt = $atrybutyProduktrepository->findOneById($key);
if ($atrybutyprodukt->getStalaCena()) {
$margin = 0;
$discount = 0;
} else {
$margin = $marginEnd;
$discount = $discountEnd;
}
if ($atrybutyprodukt->getCenaWymiar()) {
$cena += $atrybutyprodukt->getCena() * $square;
$cenaBezMarzy += $atrybutyprodukt->getCenaRabat($margin) * $square;
$cenaRabat += ($atrybutyprodukt->getCena() * $square) * (1 - $discount / 100);
} else {
$cena += $atrybutyprodukt->getCena();
$cenaBezMarzy += $atrybutyprodukt->getCenaRabat($margin);
$cenaRabat += $atrybutyprodukt->getCena() * (1 - $discount / 100);
}
$all[$key] = array(
'id' => $atrybutyprodukt->getId(),
'nazwa' => $atrybutyprodukt->getNazwa(),
'cena' => $atrybutyprodukt->getCena(),
'brutto' => $atrybutyprodukt->getBrutto($vat),
'cena_marza' => $atrybutyprodukt->getCena(),
'brutto_marza' => $atrybutyprodukt->getBrutto($vat),
'wartosc' => $foo,
'img' => $atrybutyprodukt->getWebPath(),
'typ' => $atrybutyprodukt->getTyp(),
'grupa' => $atrybutyprodukt->getIdGrupy()
);
}
$zamowienie = new Zamowienia();
$zamowienie->setIdProdukt($request->get('id'));
$zamowienie->setUser($user);
$zamowienie->setPurchaser($purchaser);
$zamowienie->setPartner($partner);
// cena netto bez marży
$zamowienie->setWartosc($cena);
$zamowienie->setNazwaDostawa($request->get('nazwa_firmy'));
$zamowienie->setAdresDostawa($request->get('adres'));
$zamowienie->setKodDostawa($request->get('kod'));
$zamowienie->setDataZamowienia(new \DateTime());
$zamowienie->setMiastoDostawa($request->get('miasto'));
$zamowienie->setProdukt($all);
$zamowienie->setVat($vat);
$zamowienie->setMargin($partner->getMarza());
$zamowienie->setDiscount(0);
$zamowienie->setSquare($square);
$zamowienie->setMail($request->get('email_firmy'));
$zamowienie->setCenaBezRabat($cena);
$zamowienie->setCenaBezMarza($cenaBezMarzy);
$zamowienie->setProfit($cenaRabat-$cenaBezMarzy);
$zamowienie->setWojewodztwo($request->get('wojewodztwo'));
$em = $doctrine->getManager();
$em->persist($zamowienie);
$em->flush();
// ********************************
// wyslanie maila z potwierdzeniem
//
foreach ($zamowienie->getProdukt() as $key => $value) {
$attributes[] = array(
'nazwa' => $value['nazwa'],
'id' => $value['id'],
'wartosc' => $value['wartosc'],
'typ' => $value['typ'],
'grupa' => $atrybutyGrupyRepository->findOneById($value['grupa'])->getNazwa()
);
}
// tworzymy załącznik pdf
$path = '../public/uploads/pdf/';
$filename = 'zamowienie-' . sha1(uniqid(mt_rand(), true)) . '.pdf';
$cena_netto = $cena;
$cena_brutto = $cena * $vat;
$cena_rabat_netto = $cena_netto * (1 - $discount / 100);
$cena_rabat_brutto = $cena_rabat_netto * $vat;
$discount_value = $cena_netto - $cena_rabat_netto;
//dd($user->getKlient());
//dd( $request->get('image'));
$pdf_data = array(
'attributes' => $attributes,
'product' => $produktyRepository
->findOneById($zamowienie->getIdProdukt()),
'nr' => $zamowienie->getId(),
'client' => array(
'name' => $request->get('nazwa_firmy'),
'adres' => $request->get('adres'),
'miasto' => $request->get('kod') . ' ' . $request->get('miasto'),
'tel' => $request->get('telefon'),
'email' => $request->get('email_firmy')
),
'trader' => array(
'username' => $user->getName(),
'nazwa' => $user->getPartner()->getNazwa(),
'adres' => $user->getPartner()->getAdres(),
'miasto' => $user->getPartner()->getKod() . ' ' . $user->getPartner()->getMiasto(),
'tel' => $user->getPartner()->getTelefon(),
'email' => $user->getEmail(),
'tytul' => $user->getPartner()->getPartnerKategory()->getNazwa()
),
'image' => $this->imageToBase64($this->getParameter('kernel.project_dir') .'/public/'. $request->get('image')),
'netto' => $cena_netto,
'brutto' => $cena_brutto,
'netto_discount' => $cena_rabat_netto,
'brutto_discount' => $cena_rabat_brutto,
'vat' => $cena_rabat_brutto - $cena_rabat_netto,
'discount' => $discount,
'discount_value' => $discount_value,
'uwagi' => $request->get('uwagi')
);
// $html = $this->renderView('/emails/zamowienie-klient.pdf.html.twig', $pdf_data);
// $arguments = array(
// 'outputFilename' => $path . $filename,
// 'outputDest' => 'F'
// );
$fontPath = $parameterBag->get('kernel.project_dir').'/public/fonts';
$html = $this->renderView('/emails/zamowienie-klient.pdf.html.twig', $pdf_data);
//return $this->render('/emails/zamowienie-klient.pdf.html.twig', $pdf_data);
$pdfOptions = new Options(['isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true,'fontDir' => $fontPath]);
$pdfOptions->setChroot($fontPath);
$pdfOptions->set('defaultFont', 'DejaVu Sans');
$dompdf = new Dompdf($pdfOptions);
$dompdf->getFontMetrics()->registerFont(
['family' => 'DejaVu Sans', 'style' => 'normal', 'weight' => 'normal'],
$fontPath . '/DejaVuSans.ttf'
);
$dompdf->getFontMetrics()->registerFont(
['family' => 'DejaVu Sans', 'style' => 'normal', 'weight' => 'bold'],
$fontPath . '/DejaVuSans-Bold.ttf'
); // you have to set the style (e.g. italic) and weigh
//$font = $dompdf->getFontMetrics()->get_font("DejaVu Sans", "normal");
//dd($font);
$dompdf->loadHtml($html,'UTF-8');
$dompdf->render();
//die($html);
$output = $dompdf->output();
//die($output);
// $dompdf->stream("mypdf.pdf", [
// "Attachment" => true
// ]);
//die();
$html = [
'attributes' => $attributes,
'nr' => $zamowienie->getId(),
'trader' => array(
'username' => $user->getName(),
'nazwa' => $user->getPartner()->getNazwa(),
'adres' => $user->getPartner()->getAdres(),
'miasto' => $user->getPartner()->getKod() . ' ' . $user->getPartner()->getMiasto(),
'tel' => $user->getPartner()->getTelefon(),
'email' => $user->getEmail()
)
];
$bcc = ['biuro@glazio.pl'];
$bcc = array_unique($bcc);
// wysylamy email
$message = (new TemplatedEmail())
->subject('Zamówienie nr ' . $zamowienie->getId())
->from('biuro@glazio.pl')
->to($purchaser->getMail());
foreach($bcc as $foo){
$message->bcc($foo);
}
$message
->context($html)
->htmlTemplate('emails/zamowienie.email.html.twig')
->attach($output.'.pdf', $filename);
try {
$mailer->send($message);
} catch (TransportExceptionInterface $e) {
// some error prevented the email sending; display an
// error message or try to resend the message
echo $e->getMessage();
}
// $transport = $this->container->get('mailer')->getTransport();
// $spool = $transport->getSpool();
// $spool->flushQueue($this->container->get('swiftmailer.transport.real'));
//unlink($path . $filename);
$strony = $this->siteRepository->findBy([],['sortOrder'=>'ASC']);
return $this->render('/default/realizuj.html.twig', array('strony'=>$strony));
}
/**
* @Route("/strona_pytanie", name="strona_pytanie")
*/
public function questionAction(
Request $request,
PersistenceManagerRegistry $doctrine,
ProduktyRepository $produktyRepository,
AtrybutyGrupyRepository $atrybutyGrupyRepository,
AtrybutyProduktrepository $atrybutyProduktrepository,
UserRepository $userRepository,
MailerInterface $mailer,
ParameterBagInterface $parameterBag
)
{
$response = array();
$attributes = array();
// informacje o ustawionych atrybutach
$produkt = $produktyRepository->findOneById($request->get('id'));
$gr = $request->get('gr');
$war = $request->get('war');
foreach($gr as $key => $value) {
if(empty($value)) continue;
$atrybutyprodukt = $atrybutyProduktrepository->findOneById($value);
$atrybutygrupy = $atrybutyGrupyRepository->findOneById($atrybutyprodukt->getIdGrupy());
$attributes[] = array(
'grupa' => $atrybutygrupy->getNazwa(),
'nazwa' => $atrybutyprodukt->getNazwa()
);
}
foreach($war as $key => $value) {
if(empty($value)) continue;
$atrybutyprodukt = $atrybutyProduktrepository->findOneById($key);
$atrybutygrupy = $atrybutyGrupyRepository->findOneById($atrybutyprodukt->getIdGrupy());
$attributes[] = array(
'grupa' => $atrybutyprodukt->getNazwa(),
'nazwa' => $value
);
}
// -- walidacja ----------------
// zły nadawca
if( empty($request->get('sender_name')) ) {
$response = array(
'name' => 'sender_name',
'error' => 'Popraw to pole.'
);
// zły email
} else if ( ! filter_var($request->get('sender_email'), FILTER_VALIDATE_EMAIL) ) {
$response = array(
'name' => 'sender_email',
'error' => 'Popraw to pole.'
);
// wszystko w porządku
} else {
// pobieramy zalogowanego usera
$user = $userRepository->findOneBy(array('www' => 1));
// ceny dla salonu i sklepu
$cena_netto = $request->get('cena_netto');
$cena_brutto = $request->get('cena_brutto');
// dodatkowe ceny dla salonu, dla sklepu rabat zawsze 0
$discount = $request->get('rabat_send',0);
$cena_rabat_netto = $request->get('cena_rabat_netto',0);
$cena_rabat_brutto = $request->get('cena_rabat_brutto',0);
if ($cena_rabat_netto)
$discount_value = $cena_rabat_netto - $cena_netto;
else
$discount_value = 0;
// tworzymy załącznik pdf
$path = './../../public/uploads/pdf/';
$filename = 'wycena-' . sha1(uniqid(mt_rand(), true)) . '.pdf';
$pdf_data = array(
'attributes' => $attributes,
'product' => $produkt,
'client' => array(
'name' => $request->get('sender_name'),
'tel' => $request->get('sender_tel'),
'email' => $request->get('sender_email'),
),
'trader' => array(
'username' => $user->getName(),
'nazwa' => $user->getPartner()->getNazwa(),
'adres' => $user->getPartner()->getAdres(),
'miasto' => $user->getPartner()->getKod() . ' ' . $user->getPartner()->getMiasto(),
'tel' => $user->getPartner()->getTelefon(),
//'email' => $user->getEmail()
),
'image' => $request->getScheme() . '://' . $request->getHttpHost() .'/'. $request->getBasePath() . $request->get('image'),
'comments' => $request->get('comments'),
'netto' => $cena_netto,
'brutto' => $cena_brutto,
'vat' => $cena_rabat_brutto - $cena_rabat_netto,
'discount' => $discount,
'discount_value' => $discount_value,
'netto_discount' => $cena_rabat_netto?$cena_rabat_netto:$cena_netto,
'brutto_discount' => $cena_rabat_brutto?$cena_rabat_brutto:$cena_brutto
);
//dd($pdf_data);
$fontPath = $parameterBag->get('kernel.project_dir').'/public/fonts';
$html = $this->renderView('/emails/wycena.pdf.html.twig', $pdf_data);
$pdfOptions = new Options(['isHtml5ParserEnabled' => true, 'isRemoteEnabled' => true,'fontDir' => $fontPath]);
$pdfOptions->set('defaultFont', 'DejaVu Sans');
$dompdf = new Dompdf($pdfOptions);
$dompdf->loadHtml($html,'UTF-8');
$dompdf->render();
//die($html);
$output = $dompdf->output();
$body = array(
'attributes' => $attributes,
'product' => $produkt,
'client' => array(
'name' => $request->get('sender_name'),
'tel' => $request->get('sender_tel'),
'email' => $request->get('sender_email'),
),
'trader' => array(
'username' => $user->getName(),
'nazwa' => $user->getPartner()->getNazwa(),
'adres' => $user->getPartner()->getAdres(),
'miasto' => $user->getPartner()->getKod() . ' ' . $user->getPartner()->getMiasto(),
'tel' => $user->getPartner()->getTelefon(),
'email' => $user->getEmail()
),
);
//->setFrom($user->getEmail())
$message = (new TemplatedEmail())
->subject('Prośba o wycenę produktu')
->from('biuro@glazio.pl')
->to($request->get('sender_email'))
->cc($user->getEmail())
->context($body,'text/html')
->attach($output.'.pdf', $filename);
if( $request->get('username') != 'www') {
$message->bcc('biuro@glazio.pl');
}
try {
$mailer->send($message);
} catch (TransportExceptionInterface $e) {
// some error prevented the email sending; display an
// error message or try to resend the message
echo $e->getMessage();
}
// $this->get('mailer')->send($message);
// $transport = $this->container->get('mailer')->getTransport();
// $spool = $transport->getSpool();
// $spool->flushQueue($this->container->get('swiftmailer.transport.real'));
// unlink($path.$filename);
$response['success'] = 'Wiadomość została wysłana.';
}
$json = new Response();
$json->setContent(json_encode($response));
$json->headers->set('Content-Type', 'application/json');
return $json;
}
// #[Route('/default', name: 'app_default')]
// public function index(): Response
// {
// return $this->render('default/index.html.twig', [
// 'controller_name' => 'DefaultController',
// ]);
// }
private function imageToBase64($path) {
$path = $path;
$type = pathinfo($path, PATHINFO_EXTENSION);
$data = file_get_contents($path);
$base64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
return $base64;
}
}