src/Controller/InvoiceController.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Invoice;
  4. use App\Entity\InvoiceStatus;
  5. use App\Form\ClientFilterType;
  6. use App\Form\InvoiceType;
  7. use App\Generator\InvoicePdfGenerator;
  8. use App\Generator\PdfGenerator;
  9. use App\Helper\UserHelper;
  10. use App\Repository\InvoiceRepository;
  11. use App\Security\Voter\InvoiceVoter;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  17. use Symfony\Component\Process\Process;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  20. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  21. use Symfony\Component\Workflow\Workflow;
  22. use Symfony\Component\Workflow\WorkflowInterface;
  23. #[Route('/invoice')]
  24. class InvoiceController extends AbstractController
  25. {
  26.     #[Route('/'name'app_invoice_index'methods: ['GET'])]
  27.     public function index(Request $requestInvoiceRepository $invoiceRepositoryWorkflowInterface $invoiceStateMachine): Response
  28.     {
  29.         $form $this->createForm(ClientFilterType::class);
  30.         $form->handleRequest($request);
  31.         if ($form->isSubmitted() && $form->isValid()) {
  32.             $data $form->getData();
  33.             $invoices $invoiceRepository->findByFilter(
  34.                 $data['client'],
  35.                 $data['dateFrom'],
  36.                 $data['dateTo'],
  37.                 $data['datePaidFrom'],
  38.                 $data['datePaidTo'],
  39.                 $data['status'],
  40.             );
  41.         } else {
  42.             $invoices $invoiceRepository->findAll();
  43.         }
  44.         $paidInvoices array_filter($invoices, fn(Invoice $invoice) => $invoice->getStatus() === 'paid');
  45.         $byMonths = [];
  46.         for ($i 1$i <= 12$i++) {
  47.             $monthName date('F'mktime(000$i12000));
  48.             $byMonths[$monthName] = ['ht' => 0,'vat' => 0,];
  49.         }
  50.         $toPayVat $toPayUrssaf 0;
  51.         foreach ($paidInvoices as $invoice) {
  52.             if ($invoice->getPaymentDate() === null) continue;
  53.             $byMonths[$invoice->getPaymentDate()->format('F')]['ht'] += $invoice->getTotalHT();
  54.             $byMonths[$invoice->getPaymentDate()->format('F')]['vat'] += $invoice->getTotalVAT();
  55.             $toPayVat += $invoice->isVatPaid() ? $invoice->getTotalVAT();
  56.             $toPayUrssaf += $invoice->isUrssafPaid() ? 0.235 $invoice->getTotalHT();
  57.         }
  58.         return $this->render('invoice/index.html.twig', [
  59.             'invoices' => $invoices,
  60.             'form_filter' => $form->createView(),
  61.             'total_ht_all' => array_sum(array_map(fn(Invoice $invoice) => $invoice->getTotalHT(), $invoices)),
  62.             'total_ttc_all' => array_sum(array_map(fn(Invoice $invoice) => $invoice->getTotalTTC(), $invoices)),
  63.             'total_tva_all' => array_sum(array_map(fn(Invoice $invoice) => $invoice->getTotalVAT(), $invoices)),
  64.             'total_ht_paid' => array_sum(array_map(fn(Invoice $invoice) => $invoice->getTotalHT(), $paidInvoices)),
  65.             'total_ttc_paid' => array_sum(array_map(fn(Invoice $invoice) => $invoice->getTotalTTC(), $paidInvoices)),
  66.             'total_tva_paid' => array_sum(array_map(fn(Invoice $invoice) => $invoice->getTotalVAT(), $paidInvoices)),
  67.             'total_quantity' => array_sum(array_map(fn(Invoice $invoice) => $invoice->getQuantity(), $invoices)),
  68.             'paid_months' => $byMonths,
  69.             'to_pay_vat' => $toPayVat,
  70.             'to_pay_urssaf' => $toPayUrssaf,
  71.         ]);
  72.     }
  73.     #[Route('/new'name'app_invoice_new'methods: ['GET''POST'])]
  74.     public function new(Request $requestInvoiceRepository $invoiceRepositoryTokenStorageInterface $tokenStorage): Response
  75.     {
  76.         $invoice = new Invoice();
  77.         $invoice->setAuthor($tokenStorage->getToken()->getUser());
  78.         $form $this->createForm(InvoiceType::class, $invoice);
  79.         $form->handleRequest($request);
  80.         if ($form->isSubmitted() && $form->isValid()) {
  81.             $invoiceRepository->save($invoicetrue);
  82.             return $this->redirectToRoute('app_invoice_index', [], Response::HTTP_SEE_OTHER);
  83.         }
  84.         return $this->renderForm('invoice/new.html.twig', [
  85.             'invoice' => $invoice,
  86.             'form' => $form,
  87.         ]);
  88.     }
  89.     #[Route('/{id}'name'app_invoice_show'methods: ['GET'])]
  90.     public function show(Invoice $invoice): Response
  91.     {
  92.         return $this->render('invoice/show.html.twig', [
  93.             'invoice' => $invoice,
  94.         ]);
  95.     }
  96.     #[Route('/{id}/edit'name'app_invoice_edit'methods: ['GET''POST'])]
  97.     public function edit(Request $requestInvoice $invoiceInvoiceRepository $invoiceRepository): Response
  98.     {
  99.         $form $this->createForm(InvoiceType::class, $invoice);
  100.         $form->handleRequest($request);
  101.         if ($form->isSubmitted() && $form->isValid()) {
  102.             $invoiceRepository->save($invoicetrue);
  103.             return $this->redirectToRoute('app_invoice_index', [], Response::HTTP_SEE_OTHER);
  104.         }
  105.         return $this->renderForm('invoice/edit.html.twig', [
  106.             'invoice' => $invoice,
  107.             'form' => $form,
  108.         ]);
  109.     }
  110.     #[Route('/{id}/delete'name'app_invoice_delete')]
  111.     public function delete(Invoice $invoiceInvoiceRepository $invoiceRepository): Response
  112.     {
  113.         $this->denyAccessUnlessGranted(InvoiceVoter::DELETE$invoice);
  114.         $invoiceRepository->remove($invoicetrue);
  115.         return $this->redirectToRoute('app_invoice_index', [], Response::HTTP_SEE_OTHER);
  116.     }
  117.     #[Route('/{id}/preview/pdf'name'invoice_preview_pdf')]
  118.     public function previewPdf(InvoicePdfGenerator $pdfGeneratorInvoice $invoice): Response
  119.     {
  120.         $pdfGenerator->generate($invoicetrue);
  121.         $response = new BinaryFileResponse($invoice->getGeneratedPath());
  122.         $response->setContentDisposition(
  123.             ResponseHeaderBag::DISPOSITION_INLINE,
  124.             ($invoice->getReference() ?: uniqid()) . '.pdf'
  125.         );
  126.         return $response;
  127.     }
  128.     #[Route('/{id}/preview/html'name'invoice_preview_html')]
  129.     public function previewHtml(Invoice $invoiceUserHelper $userHelper): Response
  130.     {
  131.         return $this->render('invoice_tailwind.html.twig', [
  132.             'invoice' => $invoice,
  133.             'information' => $userHelper->getOrCreatePersonalInformation(),
  134.         ]);
  135.     }
  136.     #[Route('/{id}/generate'name'invoice_pdf_generate')]
  137.     public function generate(Invoice $invoiceInvoicePdfGenerator $invoicePdfGenerator): Response
  138.     {
  139.         $invoicePdfGenerator->generate($invoicetrue);
  140.         return new Response(null204);
  141.     }
  142.     #[Route('/{id}/apply/{transition}'name'app_invoice_apply_transition'methods: ['GET'])]
  143.     public function applyTransition(
  144.         Request $request,
  145.         WorkflowInterface $invoiceStateMachine,
  146.         Invoice $invoice,
  147.         string $transition,
  148.         InvoiceRepository $invoiceRepository): Response
  149.     {
  150.         $invoiceStateMachine->apply($invoice$transition);
  151.         if ($invoice->getStatus() === InvoiceStatus::Paid->value && !$invoice->getPaymentDate()) {
  152.             $invoice->setPaymentDate(new \DateTime());
  153.         }
  154.         $invoiceRepository->save($invoicetrue);
  155.         return $this->redirect($request->headers->get('referer'));
  156.     }
  157. }