<?php
namespace App\Controller;
use App\Entity\Event;
use App\Form\EventType;
use App\Repository\BillRepository;
use App\Repository\EventRepository;
use App\Repository\ItemRepository;
use Doctrine\ORM\EntityManagerInterface;
use Dompdf\Dompdf;
use Dompdf\Options;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\Mime\NamedAddress;
use Symfony\Component\Mime\Address;
/**
* @IsGranted("IS_AUTHENTICATED_FULLY")
*/
#[Route('/event')]
class EventController extends AbstractController
{
#[Route('/', name: 'event_index', methods: ['GET'])]
public function index(EventRepository $eventRepository, BillRepository $billRepository, ItemRepository $itemRepository, Security $security): Response
{
if ($security->getUser()->getRoles()[0] == 'ROLE_ADMIN') {
$events = $eventRepository->findAllEvents();
} else {
$events = $eventRepository->findActive();
}
$additionalInformation = [];
foreach ($events as $event) {
$additionalInformation[$event->getId()] = $this->getEventInfo($event, $billRepository, $itemRepository);
}
return $this->render('event/index.html.twig', [
'events' => $events,
'eventInfo' => $additionalInformation,
]);
}
protected function getEventInfo($event, BillRepository $billRepository, ItemRepository $itemRepository)
{
$return = [];
$allQuery = $billRepository->createQueryBuilder('b')
->select('count(b.id)')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->setParameter('eventid', $event->getId())
->getQuery();
$return['countBills'] = $allQuery->getSingleScalarResult();
$allQuery = $billRepository->createQueryBuilder('b')
->select('SUM(b.result)')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->setParameter('eventid', $event->getId())
->getQuery();
$return['countUmsatz'] = $allQuery->getSingleScalarResult();
$qb = $itemRepository->createQueryBuilder('i');
$allQuery = $qb
->select($qb->expr()->countDistinct('i.seller'))
->innerJoin('i.bill', 'b')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->setParameter('eventid', $event->getId())
->getQuery();
$return['countSeller'] = $allQuery->getSingleScalarResult();
$qb = $itemRepository->createQueryBuilder('i');
$allQuery = $qb
->select($qb->expr()->countDistinct('i.id'))
->innerJoin('i.bill', 'b')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->setParameter('eventid', $event->getId())
->getQuery();
$return['countArtikel'] = $allQuery->getSingleScalarResult();
return $return;
}
#[Route('/new', name: 'event_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response
{
$event = new Event();
$form = $this->createForm(EventType::class, $event);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$event->setUserCreated($this->getUser());
$event->setCreateDate(new \DateTime ('now'));
$entityManager->persist($event);
$entityManager->flush();
return $this->redirectToRoute('event_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('event/new.html.twig', [
'event' => $event,
'form' => $form,
]);
}
#[Route('/{id}', name: 'event_show', methods: ['GET'])]
public function show(Event $event, RequestStack $requestStack, BillRepository $billRepository, ItemRepository $itemRepository): Response
{
// stores an attribute in the session for later reuse
$session = $requestStack->getSession();
$session->set('CURRENT_EVENT', $event->getId());
$eventInfo = $this->getEventInfo($event, $billRepository, $itemRepository);
return $this->render('event/show.html.twig', [
'event' => $event,
'eventInfo' => $eventInfo,
]);
}
#[Route('/{id}/edit', name: 'event_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Event $event, EntityManagerInterface $entityManager): Response
{
$form = $this->createForm(EventType::class, $event);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->flush();
return $this->redirectToRoute('event_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('event/edit.html.twig', [
'event' => $event,
'form' => $form,
]);
}
#[Route('/{id}', name: 'event_delete', methods: ['POST'])]
public function delete(Request $request, Event $event, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete' . $event->getId(), $request->request->get('_token'))) {
$entityManager->remove($event);
$entityManager->flush();
}
return $this->redirectToRoute('event_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/{id}/export_pdf', name: 'event_pdf', methods: ['GET', 'POST'])]
public function exportPdf(Event $event, Request $request, EntityManagerInterface $entityManager, ItemRepository $itemRepository, MailerInterface $mailer): Response
{
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Helvetica');
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
$allQuery = $itemRepository->createQueryBuilder('i')
->select('i.seller, SUM(i.price) AS result')
->innerJoin('i.bill', 'b')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->setParameter('eventid', $event->getId())
->groupBy('i.seller')
->getQuery();
$data = $allQuery->getResult();
$sellers = [];
$etti = $prozent = 0;
foreach ($data as $seller){
if ($seller['seller'] > 0 && $seller['seller'] <= 15) {
$prozent = 5;
}
if ($seller['seller'] > 15 && $seller['seller'] < 200){
$prozent = 10;
$etti = 3;
}
if ($seller['seller'] >= 200 ){
$prozent = 20;
$etti = 3;
}
$allQuery = $itemRepository->createQueryBuilder('i')
->select('i')
->innerJoin('i.bill', 'b')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->andWhere('i.seller = :sellerid')
->setParameter('eventid', $event->getId())
->setParameter('sellerid', $seller['seller'])
->getQuery();
$items = $allQuery->getResult();
$sellers[$seller['seller']] = [
'id' => $seller['seller'],
'etti' => $etti,
'prozent' => $prozent,
'positionen' => $items,
];
}
// Retrieve the HTML generated in our twig file
$html = $this->renderView('event/rechnungen.html.twig', [
'title' => 'Rechnung ',
'sellers' => $sellers,
'event' => $event,
]);
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
$output = $dompdf->output();
$tmpfname = tempnam("/tmp", "FOO");
$tmpfname .= 'pdf';
file_put_contents($tmpfname, $output);
$email = (new Email())
->from(new Address('flohmarkt@jüngel.com', 'Flohmarkt-Team'))
->to($this->getUser()->getEmail())
->subject('PDF Export "' . $event->getName() . '"')
->attachFromPath( $tmpfname, 'Abrechnung.pdf')
->text('PDF')
->html('<p>PDF</p>');
$mailer->send($email);
// Output the generated PDF to Browser (force download)
$dompdf->stream("Rechnung", [
"Attachment" => true
]);
}
#[Route('/{id}/export', name: 'event_export', methods: ['GET', 'POST'])]
public function export(Event $event, Request $request, EntityManagerInterface $entityManager, ItemRepository $itemRepository, MailerInterface $mailer): Response
{
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle($event->getName());
$allQuery = $itemRepository->createQueryBuilder('i')
->select('i.seller, SUM(i.price) AS result')
->innerJoin('i.bill', 'b')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->setParameter('eventid', $event->getId())
->groupBy('i.seller')
->getQuery();
$data = $allQuery->getResult();
$row = 10;
$umsatz = $gesamtProv = $gesamtGuthaben = 0;
$sheet->setCellValueByColumnAndRow(1, $row, 'Verkäufer');
$sheet->setCellValueByColumnAndRow(2, $row, 'Umsatz');
$sheet->setCellValueByColumnAndRow(3, $row, 'Prozent');
$sheet->setCellValueByColumnAndRow(4, $row, 'Etiketten');
$sheet->setCellValueByColumnAndRow(5, $row, 'Provision');
$sheet->setCellValueByColumnAndRow(6, $row, 'Guthaben');
foreach ($data as $item) {
$etti = $prozent = $provision = 0;
$row++;
$umsatz += $item['result'];
$result = $item['result'];
$sheet->setCellValueByColumnAndRow(1, $row, $item['seller']);
$sheet->setCellValueByColumnAndRow(2, $row, $item['result']);
if ($item['seller'] > 0 && $item['seller'] <= 15) {
$prozent = 5;
}
if ($item['seller'] > 15 && $item['seller'] < 200){
$prozent = 10;
$etti = 3;
}
if ($item['seller'] >= 200 ){
$prozent = 20;
$etti = 3;
}
/* if (strlen($item['seller']) == 6) {
$prozent = substr($item['seller'], 0, 2);
$etti = substr($item['seller'], 2, 1);
if (intval($etti) == 1) {
$etti = 3.5;
}
$provision = $result * (intval($prozent) / 100);
$gesamtProv += $provision;
$gesamtProv += $etti;
}*/
$provision = $result * (intval($prozent) / 100);
$gesamtProv += $provision;
$gesamtProv += $etti;
$result = $result - ($provision + $etti);
$sheet->setCellValueByColumnAndRow(3, $row, $prozent);
$sheet->setCellValueByColumnAndRow(4, $row, $etti);
$sheet->setCellValueByColumnAndRow(5, $row, $provision);
$sheet->setCellValueByColumnAndRow(6, $row, $result);
}
$row += 3;
$sheet->setCellValueByColumnAndRow(1, $row, 'Umsatz');
$sheet->setCellValueByColumnAndRow(2, $row, $umsatz);
$row += 1;
$sheet->setCellValueByColumnAndRow(1, $row, 'Gesamt-Provision');
$sheet->setCellValueByColumnAndRow(2, $row, $gesamtProv);
// Create your Office 2007 Excel (XLSX Format)
$writer = new Xlsx($spreadsheet);
// Create a Temporary file in the system
$fileName = $event->getName() . '.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
// Create the excel file in the tmp directory of the system
$writer->save($temp_file);
/*$email = (new Email())
->from(new Address('flohmarkt@jüngel.com', 'Flohmarkt-Team'))
->to($this->getUser()->getEmail())
->subject('XLS Export "' . $event->getName() . '"')
->attachFromPath( $temp_file, 'Abrechnung.xls')
->text('XLS')
->html('<p>XLS</p>');
$mailer->send($email);*/
// Return the excel file as an attachment
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
#[Route('/{id}/export_position', name: 'event_position', methods: ['GET', 'POST'])]
public function exportPosition(Event $event, Request $request, EntityManagerInterface $entityManager, ItemRepository $itemRepository, MailerInterface $mailer): Response
{
$allQuery = $itemRepository->createQueryBuilder('i')
->select('i.seller, i.price')
->innerJoin('i.bill', 'b')
->innerJoin('b.event', 'e')
->where('e.id = :eventid')
->orderBy('i.seller')
->setParameter('eventid', $event->getId())
->getQuery();
$data = $allQuery->getResult();
$fileName = $event->getName() . '.csv';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$file = fopen($temp_file, 'w');
$pos = $prozent = $etti = 0;
$seller = $data[0]['seller'];
foreach ($data as $item) {
if ($seller != $item['seller']){
$pos = 0;
$seller = $item['seller'];
}
if ($item['seller'] > 0 && $item['seller'] <= 15) {
$prozent = 5;
}
if ($item['seller'] > 15 && $item['seller'] < 200){
$prozent = 10;
$etti = 3;
}
if ($item['seller'] >= 200 ){
$prozent = 20;
$etti = 3;
}
$provision = $item['price'] * (intval($prozent) / 100);
$pos = $pos + 1;
fputcsv($file, [$item['seller'], $pos, $prozent, $item['price'], ($item['price']-$provision), $etti]);
}
fclose($file);
// Return the csv file as an attachment
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
}