src/Controller/InvoiceController.php line 605

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Contact\Contact;
  4. use App\Entity\Estimate\Estimate;
  5. use App\Entity\Estimate\EstimateCompany;
  6. use App\Entity\Invoice\Invoice;
  7. use App\Entity\Invoice\InvoiceCompany;
  8. use App\Entity\Search\InvoiceSearch;
  9. use App\Entity\Document\DocumentEmailTemplate;
  10. use App\Form\EstimateType;
  11. use App\Form\Search\InvoiceSearchType;
  12. use App\Repository\Contact\ContactRepository;
  13. use App\Repository\Document\DocumentEmailTemplateRepository;
  14. use App\Repository\Invoice\InvoiceCompanyRepository;
  15. use App\Repository\Invoice\InvoiceRepository;
  16. use App\Repository\Invoice\InvoiceStatusRepository;
  17. use App\Repository\Product\ProductMaterialRepository;
  18. use App\Repository\Product\ProductMismatchedRepository;
  19. use App\Repository\Product\ProductVariationRepository;
  20. use App\Repository\UserRepository;
  21. use Doctrine\ORM\EntityManager;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Doctrine\ORM\NonUniqueResultException;
  24. use Knp\Component\Pager\PaginatorInterface;
  25. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\HttpFoundation\RedirectResponse;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  31. use Symfony\Component\Routing\Annotation\Route;
  32. use DateTime;
  33. use Dompdf\Dompdf;
  34. use Exception;
  35. use Symfony\Component\Mailer\MailerInterface;
  36. use Symfony\Component\Mime\Address;
  37. use Symfony\Component\Mime\Email;
  38. class InvoiceController extends AbstractController
  39. {
  40.     /**
  41.      * @param Request $request
  42.      * @param PaginatorInterface $paginator
  43.      * @param InvoiceRepository $invoiceRepository
  44.      * @return Response
  45.      * 
  46.      * @IsGranted("ROLE_USER")* 
  47.      */
  48.     #[Route('/admin/invoices'name'adminInvoicesDashboard')]
  49.     public function adminInvoicesDashboard(Request $requestPaginatorInterface $paginatorInvoiceRepository $invoiceRepository): Response
  50.     {
  51.         $invoiceSearch = new InvoiceSearch();
  52.         $invoiceSearchForm $this->createForm(InvoiceSearchType::class, $invoiceSearch);
  53.         $invoiceSearchForm->handleRequest($request);
  54. //        dd($invoiceRepository->findSearch($invoiceSearch));
  55.         $invoices $paginator->paginate(
  56.             $invoiceRepository->findSearch($invoiceSearch),
  57.             $request->query->getInt('page'1),
  58.             10
  59.         );
  60.         return $this->render('admin/invoice/dashboard.html.twig', [
  61.             'invoices' => $invoices,
  62.             'invoiceSearchForm' => $invoiceSearchForm->createView(),
  63.         ]);
  64.     }
  65.     /**
  66.      * @param InvoiceRepository $invoiceRepository
  67.      * @param InvoiceStatusRepository $invoiceStatusRepository
  68.      * @param Request $request
  69.      * @param EntityManager $entityManager
  70.      * @param Invoice|null $invoice
  71.      * @return Response
  72.      *
  73.      * @throws NonUniqueResultException
  74.      * @IsGranted("ROLE_USER")
  75.      */
  76.     #[Route('/admin/invoice/deposit/add/deposit/{id}'name'adminInvoicesAddFromDeposit')]
  77.     public function adminInvoicesAddFromDeposit(InvoiceRepository $invoiceRepositoryInvoiceStatusRepository $invoiceStatusRepositoryRequest $requestEntityManagerInterface $entityManagerInvoice $invoice null): Response
  78.     {
  79.         if ($invoice !== null) {
  80.             $newInvoice = clone $invoice;
  81.             $newInvoice->setNumber($this->generateInvoiceNumber($invoiceRepository));
  82.             $newInvoice->setCreationDate(new DateTime());
  83.             $newInvoice->setAllTaxesIncludedPrice($invoice->getAllTaxesIncludedPrice() * 2);
  84.             $newInvoice->setLastUpdate(new DateTime());
  85.             $newInvoice->setIsDeposit(false);
  86.             $newInvoice->setDepositInvoice($invoice);
  87.             $newInvoice->setDepositAmount(0);
  88.             $newInvoice->setInvoice($invoice);
  89.             $newInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'draft']));
  90.             $newInvoice->setLeftToPay($invoice->getAllTaxesIncludedPrice());
  91.             try {
  92.                 $entityManager->persist($newInvoice);
  93.                 $entityManager->flush();
  94.                 $this->addFlash('success''La facture a été ajoutée !');
  95.             } catch (Exception $exception) {
  96.                 $this->addFlash('error''La facture n\'a pas pu être créée - ' $exception->getMessage());
  97.             }
  98.             if ($request->isXmlHttpRequest()) {
  99.                 return new Response($newInvoice->getId(), 200, ['Content-Type' => 'text/plain']);
  100.             } else {
  101.                 return $this->redirectToRoute('adminContactDetails', ['id' => $invoice->getContact()->getId()]);
  102.             }
  103.         }
  104.         $this->addFlash('error''La facture d\'acompte n\'a pas été trouvée !');
  105.         return $this->redirectToRoute('adminInvoicesDashboard');
  106.     }
  107.     /**
  108.      * @param InvoiceRepository $invoiceRepository
  109.      * @param InvoiceCompanyRepository $invoiceCompanyRepository
  110.      * @param InvoiceStatusRepository $invoiceStatusRepository
  111.      * @param EntityManagerInterface $entityManager
  112.      * @param Estimate|null $estimate
  113.      * @param EstimateCompany|null $estimateCompany
  114.      * @return Response
  115.      *
  116.      * @throws NonUniqueResultException
  117.      * @IsGranted("ROLE_USER")
  118.      */
  119.     #[Route('/admin/invoice/deposit/add/estimate/{id}'name'adminInvoicesDepositAddFromEstimate')]
  120.     public function adminInvoicesAddFromEstimate(InvoiceRepository $invoiceRepositoryInvoiceCompanyRepository $invoiceCompanyRepository ,InvoiceStatusRepository $invoiceStatusRepositoryEntityManagerInterface $entityManagerEstimate $estimate nullEstimateCompany $estimateCompany null): Response
  121.     {
  122.         $contact "";
  123.         if ($estimate !== null || $estimateCompany !== null) {
  124.             $depositInvoice $estimate ? new Invoice() : new InvoiceCompany();
  125.             $contact $estimate $estimate->getContact() : $estimateCompany->getCompany();
  126.             $estimateInvoice $estimate ?: $estimateCompany;
  127.             $maximumValidationDate = new DateTime();
  128.             $maximumValidationDate->modify('+6 months');
  129.             $depositInvoice->setNumber($estimate $this->generateInvoiceNumber($invoiceRepository) : $this->generateInvoiceCompanyNumber($invoiceCompanyRepository));
  130.             $depositInvoice->setCreationDate(new DateTime());
  131.             $depositInvoice->setLastUpdate(new DateTime());
  132.             $depositInvoice->setMaximumValidationDate($maximumValidationDate);
  133.             $depositInvoice->setIsDeposit(true);
  134.             $depositInvoice->setDepositAmount(50);
  135.             $depositInvoice->setPreTaxPrice($estimateInvoice->getPreTaxPrice() * (- ($depositInvoice->getDepositAmount() / 100)));
  136.             $depositInvoice->setAllTaxesIncludedPrice($estimateInvoice->getAllTaxesIncludedPrice() * (- ($depositInvoice->getDepositAmount() / 100)));
  137.             $depositInvoice->setTva(20);
  138.             $depositInvoice->addEstimate($estimateInvoice);
  139.             $estimate $depositInvoice->setContact($contact) : $depositInvoice->setCompany($contact);
  140.             $depositInvoice->setSeller($estimateInvoice->getSeller());
  141.             $depositInvoice->setLeftToPay($estimateInvoice->getAllTaxesIncludedPrice() * (- ($depositInvoice->getDepositAmount() / 100)));
  142.             $depositInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'due']));
  143.             $entityManager->persist($depositInvoice);
  144.             $finalInvoice = clone $depositInvoice;
  145.             $finalInvoice->setNumber($estimate $this->generateInvoiceNumber($invoiceRepository) : $this->generateInvoiceCompanyNumber($invoiceCompanyRepository));
  146.             $finalInvoice->setCreationDate(new DateTime());
  147.             $finalInvoice->setAllTaxesIncludedPrice($estimateInvoice->getAllTaxesIncludedPrice());
  148.             $finalInvoice->setPreTaxPrice($estimateInvoice->getPreTaxPrice());
  149.             $finalInvoice->setLeftToPay($estimateInvoice->getAllTaxesIncludedPrice());
  150.             $finalInvoice->setLastUpdate(new DateTime());
  151.             $finalInvoice->setIsDeposit(false);
  152.             $finalInvoice->setDepositInvoice($depositInvoice);
  153.             $finalInvoice->setDepositAmount(0);
  154.             $finalInvoice->setInvoice($depositInvoice);
  155.             $finalInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'payinprogress']));
  156.                 $entityManager->persist($finalInvoice);
  157.                 $entityManager->flush();
  158.                 $this->addFlash('success''La facture d\'acompte a bien été créée !');
  159.                 return $this->redirectToRoute('invoiceDepositSavePayment', ['id' => $depositInvoice->getId()]);
  160.         } else {
  161.             $this->addFlash('error''Le devis n\'a pas été trouvé!');
  162.         }
  163.         return $estimate $this->redirectToRoute('adminContactDetails', ['id' => $contact->getId()]) : $this->redirectToRoute('adminCompanyDetails', ['id' => $contact->getId()]);
  164.     }
  165.     /**
  166.      * @param InvoiceStatusRepository $invoiceStatusRepository
  167.      * @param EntityManagerInterface $entityManager
  168.      * @param Invoice|null $invoice
  169.      * @return Response
  170.      *
  171.      * @IsGranted("ROLE_USER")
  172.      */
  173.     #[Route('/admin/invoice/deposit/add/estimate/definitive/{id}'name'adminInvoicesDepositAddDefinitiveFromAdvance')]
  174.     public function adminInvoicesAddDefinitiveFromAdvance(InvoiceStatusRepository $invoiceStatusRepositoryEntityManagerInterface $entityManagerInvoice $invoice nullInvoiceCompany $invoiceCompany null): Response
  175.     {
  176.         $contact "";
  177.         if ($invoice !== null || $invoiceCompany !== null) {
  178.             $contact $invoice $invoice->getContact() : $invoiceCompany->getCompany();
  179.             $invoiceClone $invoice ?: $invoiceCompany;
  180.             $finalInvoice = clone $invoiceClone;
  181.             $finalInvoice->setNumber($invoiceClone->getNumber());
  182.             $finalInvoice->setCreationDate(new DateTime());
  183.             $finalInvoice->setAllTaxesIncludedPrice($invoiceClone->getAllTaxesIncludedPrice() * 2);
  184.             $finalInvoice->setPreTaxPrice($invoiceClone->getPreTaxPrice());
  185.             $finalInvoice->setLeftToPay(($invoiceClone->getAllTaxesIncludedPrice() * 2) + ($invoiceClone->getLeftToPay() - $invoiceClone->getAllTaxesIncludedPrice()));
  186.             $finalInvoice->setLastUpdate(new DateTime());
  187.             $finalInvoice->setIsDeposit(false);
  188.             $finalInvoice->setDepositInvoice($invoiceClone);
  189.             $finalInvoice->setDepositAmount(0);
  190.             $finalInvoice->setInvoice($invoiceClone);
  191.             $finalInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'payinprogress']));
  192.             try {
  193.                 $entityManager->persist($finalInvoice);
  194.                 $entityManager->flush();
  195.                 $this->addFlash('success''La facture définitive a bien été créée !');
  196.             } catch (Exception $exception) {
  197.                 $this->addFlash('error''La facture définitive n\'a pas pu être créée, elle existe déjà' );
  198.             }
  199.         } else {
  200.             $this->addFlash('error''Le devis n\'a pas été trouvé!');
  201.         }
  202.         return $this->redirectToRoute($invoice 'adminContactDetails' 'adminCompanyDetails', ['id' => $contact->getId()]);
  203.     }
  204.     /**
  205.      * @param Invoice|null $invoice
  206.      * @param InvoiceCompany|null $invoiceCompany
  207.      * @return RedirectResponse|Response
  208.      *
  209.      * @IsGranted("ROLE_USER")
  210.      */
  211.     #[Route('/admin/invoice/view/{id}'name'adminViewInvoice')]
  212.     public function adminViewInvoice(Invoice $invoice  nullInvoiceCompany $invoiceCompany null): RedirectResponse|Response
  213.     {
  214.         if ($invoice !== null || $invoiceCompany !== null) {
  215.             $invoiceToView $invoice ?: $invoiceCompany;
  216.             foreach ($invoiceToView->getEstimate() as $estimate) {
  217.                 $estimateInvoice $estimate;
  218.             }
  219.             return $this->render('admin/invoice/view.html.twig', [
  220.                 'invoice' => $invoiceToView,
  221.                 'estimate' => $estimateInvoice
  222.             ]);
  223.         } else {
  224.             $this->addFlash('error''La facture est introuvable !');
  225.         }
  226.         return $this->redirectToRoute('adminInvoicesDashboard');
  227.     }
  228.     /**
  229.      * @param Invoice|null $invoice
  230.      * @param InvoiceCompany $invoiceCompany
  231.      * @return Response
  232.      *
  233.      * @IsGranted("ROLE_USER")
  234.      */
  235.     #[Route('/admin/invoice/view/pdf/{id}'name'adminPdfViewInvoice')]
  236.     public function adminPdfViewInvoice(Invoice $invoice nullInvoiceCompany $invoiceCompany null): Response
  237.     {
  238.         if ($invoice !== null || $invoiceCompany !== null) {
  239.             $invoicePDF $invoice ?: $invoiceCompany;
  240.             $templateUrl $invoicePDF->getIsDeposit() ? 'admin/invoice/template/depositPdfView.html.twig' 'admin/invoice/template/invoicePdfView.html.twig';
  241.             $domPDF = new Dompdf(['enable_remote' => true]);
  242.             $image getcwd().'/images/rib-lamusee.png';
  243.             $imageData base64_encode(file_get_contents($image));
  244.             $src 'data:'.mime_content_type($image).';base64,'.$imageData;
  245.             $html $this->renderView($templateUrl, [
  246.                 'invoice'  => $invoicePDF,
  247.                 'base_dir' => getcwd(),
  248.                 'rib' => $src,
  249.                 'URL_PREFIX' => $this->getParameter('url_prefix')
  250.             ]);
  251.             $domPDF->loadHtml($html);
  252.             $domPDF->render();
  253.             return new Response(
  254.                 $domPDF->stream($invoicePDF->getNumber() . ".pdf", [
  255.                     "Attachment" => false
  256.                 ]),
  257.                 200,
  258.                 array(
  259.                     'Content-Type'          => 'application/pdf',
  260.                     'Content-Disposition'   => 'inline; filename="' $invoicePDF->getNumber() . '.pdf"'
  261.                 )
  262.             );
  263.         } else {
  264.             $this->addFlash('error''La facture n\'existe pas');
  265.             return $this->redirectToRoute('adminInvoicesDashboard');
  266.         }
  267.     }
  268.     /**
  269.      * @param InvoiceCompany|null $invoiceCompany
  270.      * @param Request $request
  271.      * @param MailerInterface $mailer
  272.      * @return Response
  273.      *
  274.      * @throws TransportExceptionInterface
  275.      * @IsGranted("ROLE_USER")
  276.      */
  277.     #[Route('/admin/company/relaunch/{id}'name'adminCompanyRelaunch')]
  278.     public function adminCompanyRelaunch(InvoiceCompany $invoiceCompany nullRequest $requestMailerInterface $mailer): Response
  279.     {
  280.         if ($invoiceCompany !== null) {
  281.             $invoiceRelaunchEmail = (new Email())
  282.                 ->from(new Address('contact@lamusee.com''LAMUSEE'))
  283.                 ->subject('Relance paiement L\'Amusee ' $invoiceCompany->getNumber())
  284.                 ->to($invoiceCompany->getCompany()->getEmail())
  285.                 ->bcc('contact@lamusee.com'// Ajout de la copie cachée pour le suivi
  286.                 ->html($this->render('admin/email/relaunch_multibrand.html.twig', ['invoice'=> $invoiceCompany'CUSTOMER_SPACE_URL_PREFIX' => $this->getParameter('customer_space_url_prefix')])->getContent());
  287.             $mailer->send($invoiceRelaunchEmail);
  288.             $this->addFlash('success''La relance a bien été envoyé');
  289.             return $this->redirectToRoute('adminCompanyDetails', ['id' => $invoiceCompany->getCompany()->getId()]);
  290.         } else {
  291.             $this->addFlash('error''La société n\'a pas été trouvé !');
  292.             return $this->redirectToRoute('adminContactDashboard');
  293.         }
  294.     }
  295.     /**
  296.      * @param Request $request
  297.      * @param UserRepository $userRepository
  298.      * @param Contact|null $contact
  299.      * @return Response
  300.      *
  301.      * @IsGranted("ROLE_USER")
  302.      */
  303.     #[Route('/admin/invoice/add/{id}'name'adminAddInvoice')]
  304.     public function adminAddInvoice(Request $requestUserRepository $userRepositoryContact $contact null): Response
  305.     {
  306.         if ($contact !== null) {
  307.             $estimateForm $this->createForm(EstimateType::class, $contact);
  308.             $estimateForm->handleRequest($request);
  309.             return $this->render('admin/invoice/add.html.twig', [
  310.                 'contact' => $contact,
  311.                 'estimateForm' => $estimateForm->createView(),
  312.                 'sellerList' => $userRepository->findAll()
  313.             ]);
  314.         }
  315.         $this->addFlash('error''Merci de donner un contact valide !');
  316.         return $this->redirectToRoute('adminInvoicesDashboard');
  317.     }
  318.     /**
  319.      * @param Request $request
  320.      * @param UserRepository $userRepository
  321.      * @param ProductMaterialRepository $productMaterialRepository
  322.      * @param ProductMismatchedRepository $productMismatchedRepository
  323.      * @param Invoice|null $invoice
  324.      * @return Response
  325.      *
  326.      * @IsGranted("ROLE_USER")
  327.      */
  328.     #[Route('/admin/invoice/edit/{id}'name'adminEditInvoice')]
  329.     public function adminEditInvoice(Request $requestUserRepository $userRepositoryProductMaterialRepository $productMaterialRepositoryProductMismatchedRepository $productMismatchedRepositoryInvoice $invoice null): Response
  330.     {
  331.         if ($invoice !== null) {
  332.             $estimateForm $this->createForm(EstimateType::class, $invoice);
  333.             $estimateForm->handleRequest($request);
  334.             return $this->render('admin/invoice/edit.html.twig', [
  335.                 'invoice' => $invoice,
  336.                 'estimateForm' => $estimateForm->createView(),
  337.                 'sellerList' => $userRepository->findAll(),
  338.                 'productMaterial' => $productMaterialRepository->findAll(),
  339.                 'productMismatched' => $productMismatchedRepository->findAll(),
  340.             ]);
  341.         }
  342.         $this->addFlash('error''La facture n\'a pas été trouvée');
  343.         return $this->redirectToRoute('adminInvoicesDashboard');
  344.     }
  345.     /**
  346.      * @param InvoiceRepository $invoiceRepository
  347.      * @param EntityManagerInterface $entityManager
  348.      * @param Invoice|null $invoice
  349.      * @return Response
  350.      *
  351.      * @throws NonUniqueResultException
  352.      * @IsGranted("ROLE_USER")
  353.      */
  354.     #[Route('/admin/invoice/duplicate/{id}'name'adminDuplicateInvoice')]
  355.     public function adminDuplicateInvoice(InvoiceRepository $invoiceRepositoryEntityManagerInterface $entityManagerInvoice $invoice null): Response
  356.     {
  357.         if ($invoice !== null) {
  358.             $duplicateInvoice = clone $invoice;
  359.             $duplicateInvoice->setNumber($this->generateInvoiceNumber($invoiceRepository));
  360.             $duplicateInvoice->setCreationDate(new DateTime());
  361.             $duplicateInvoice->setLastUpdate(new DateTime());
  362.             try {
  363.                 $entityManager->persist($duplicateInvoice);
  364.                 $entityManager->flush();
  365.                 $this->addFlash('success''La facture a été dupliquée');
  366.             } catch (Exception $exception) {
  367.                 $this->addFlash('error''La facture n\'a pas pu être dupliquée - ' $exception->getMessage());
  368.                 return $this->redirectToRoute('adminInvoicesDashboard');
  369.             }
  370.         } else {
  371.             $this->addFlash('error''La facture n\'a pas été trouvée');
  372.         }
  373.         return $this->redirectToRoute('adminInvoicesDashboard');
  374.     }
  375.     /**
  376.      * @param EntityManagerInterface $entityManager
  377.      * @param Invoice|null $invoice
  378.      * @param InvoiceCompany|null $invoiceCompany
  379.      * @return Response
  380.      *
  381.      * @IsGranted("ROLE_USER")
  382.      */
  383.     #[Route('/admin/invoice/delete/{id}'name'adminDeleteInvoice')]
  384.     public function adminDeleteInvoice(EntityManagerInterface $entityManagerInvoice $invoice nullInvoiceCompany $invoiceCompany null): Response
  385.     {
  386.         if ($invoice !== null || $invoiceCompany !== null) {
  387.             try {
  388.                 $invoiceToDelete $invoice?: $invoiceCompany;
  389.                 $invoiceToDelete->setInvoice(null);
  390.                 $invoiceToDelete->setDepositInvoice(null);
  391.                 foreach ($invoiceToDelete->getEstimate() as $estimate) {
  392.                     $invoiceToDelete->removeEstimate($estimate);
  393.                 }
  394.                 foreach ($invoiceToDelete->getPayments() as $payment) {
  395.                     $invoiceToDelete->removePayment($payment);
  396.                 }
  397.                 foreach ($invoiceToDelete->getProductVariation() as $product) {
  398.                     $invoiceToDelete->removeProduct($product);
  399.                 }
  400.                 $entityManager->remove($invoiceToDelete);
  401.                 $entityManager->flush();
  402.                 $this->addFlash('success''La facture à été supprimée !');
  403.             } catch (Exception $exception) {
  404.                 $this->addFlash('error''La facture n\'a pas été supprimée ! (' $exception->getMessage() . ')');
  405.             }
  406.         } else {
  407.             $this->addFlash('error''Le facture n\'a pas été trouvée !');
  408.         }
  409.         return $invoice $this->redirectToRoute('adminContactDetails', ['id' => $invoice->getContact()->getId()]) : $this->redirectToRoute('adminCompanyDetails', ['id' => $invoiceCompany->getCompany()->getId()]);
  410.     }
  411.     /**
  412.      * @throws NonUniqueResultException
  413.      */
  414.     #[Route('/admin/invoice/save'name'adminSaveInvoice')]
  415.     public function adminSaveInvoice(Request $requestEntityManagerInterface $entityManagerInvoiceRepository $invoiceRepository,UserRepository $userRepositoryContactRepository $contactRepositoryProductVariationRepository $productVariationRepositoryInvoiceStatusRepository $invoiceStatusRepository): Response
  416.     {
  417.         if ($request->isXmlHttpRequest() && $request->request->get('documentFormData')) {
  418.             if($request->request->get('invoiceId') && $invoiceRepository->findOneBy(['id' => $request->request->get('invoiceId')]) !== null){
  419.                 $invoice $invoiceRepository->findOneBy(['id' =>$request->request->get('invoiceId')]);
  420.             } else{
  421.                 $invoice = new Invoice();
  422.             }
  423.             $invoiceDetails = [];
  424.             $maximumValidationDate = new DateTime();
  425.             $maximumValidationDate->modify('+6 month');
  426.             $invoice->setLastUpdate(new DateTime());
  427.             $invoice->setMaximumValidationDate($maximumValidationDate);
  428.             if (!$invoice->getCreationDate()) $invoice->setCreationDate(new DateTime());
  429.             if (!$invoice->getNumber()) $invoice->setNumber($this->generateInvoiceNumber($invoiceRepository));
  430.             if ($request->request->get('paiementIsRegistered') && $request->request->get('paiementIsRegistered')) $invoice->setPaymentDate(new DateTime());
  431.             if ($request->request->get('documentSeller')) $invoice->setSeller($userRepository->findOneBy(['id'  => $request->request->get('documentSeller')]));
  432.             if ($request->request->get('contact')) $invoice->setContact($contactRepository->findOneBy(['id'  => $request->request->get('contact')]));
  433.             if ($request->request->get('preTaxPrice')) $invoice->setPreTaxPrice((float)$request->request->get('preTaxPrice'));
  434.             if ($request->request->get('totalPrice')) $invoice->setAllTaxesIncludedPrice((float)$request->request->get('totalPrice'));
  435.             if ($request->request->get('documentObject')) $invoice->setSubject($request->request->get('documentObject'));
  436.             if ($request->request->get('documentNotes')) $invoice->setNote($request->request->get('documentNotes'));
  437.             if ($request->request->get('leftToPay')) {
  438.                 if ($request->request->get('paiementIsRegistered') && $request->request->get('paiementAmount')) {
  439.                     $invoice->setLeftToPay((float)$request->request->get('leftToPay') == : (float)$request->request->get('leftToPay') - (float)$request->request->get('paiementAmount'));
  440.                 } else {
  441.                     $invoice->setLeftToPay($request->request->get('leftToPay'));
  442.                 }
  443.             }
  444.             if ($request->request->get('isDeposit')) $invoice->setIsDeposit(!($request->request->get('isDeposit') === "false"));
  445.             if ($request->request->get('estimateDetails')) {
  446.                 try {
  447.                     foreach (json_decode($request->request->get('estimateDetails')) as $detail) {
  448.                         if ($detail->ref === "produit") {
  449.                             $invoice->addProductVariation($productVariationRepository->findOneBy(['id' => $detail->product_id]));
  450.                         }
  451.                         $invoiceDetails[] = $detail;
  452.                     }
  453.                     $invoice->setDetail($invoiceDetails);
  454.                 } catch (Exception $exception) {
  455.                     dd($exception->getMessage());
  456.                 }
  457.             }
  458.             if ($invoice->getLeftToPay() === 0.0) {
  459.                 $invoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'paid']));
  460.             } else {
  461.                 $invoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'payinprogress']));
  462.             }
  463.             try {
  464.                 $entityManager->persist($invoice);
  465.                 $entityManager->flush();
  466.                 $this->addFlash('success''La facture a été sauvegardé');
  467.                 return new Response(json_encode(['id' => $invoice->getContact()->getId()]), 200, ["Content-Type" => "application/json"]);
  468.             } catch (Exception $exception) {
  469.                 $this->addFlash('error''La facture n\'a pas pu être sauvegardé ' $exception->getMessage());
  470.                 //return new Response('error', 403, [ "Content-Type" => "text/plain"]);
  471.                 dd($exception->getMessage());
  472.             }
  473.         }
  474.         return new Response(""404, ["Content-Type" => "text/plain"]);
  475.     }
  476.     /**
  477.      * @IsGranted("ROLE_USER")
  478.      */
  479.     #[Route('admin/invoice/send/{id}'name'adminInvoiceSend')]
  480.     public function adminInvoiceSend(Request $requestEntityManagerInterface $entityManagerMailerInterface $mailerDocumentEmailTemplateRepository $documentEmailTemplateRepositoryInvoiceStatusRepository $invoiceStatusRepositoryInvoice $invoice nullInvoiceCompany $invoiceCompany null): RedirectResponse|Response
  481.     {
  482.         if ($request->isXmlHttpRequest() && ($invoice !== null || $invoiceCompany !== null) && $request->request->get('emailDisplaySubject')) {
  483.             $invoiceSend $invoiceCompany ?: $invoice;
  484.             $email = (new Email())
  485.                 ->from(new Address('contact@lamusee.com''LAMUSEE'))
  486.                 ->bcc('contact@lamusee.com'// Ajout de la copie cachée pour le suivi
  487.                 ->subject($request->request->get('emailDisplaySubject'))
  488.                 ->html($request->request->get('emailHtmlContent'));
  489.             foreach (json_decode($request->request->get('emailRecipients')) as $emailAdress) {
  490.                 $email->addTo($emailAdress);
  491.             }
  492.             try {
  493.                 $mailer->send($email);
  494.                 $invoiceSend->setLastUpdate(new DateTime());
  495.                 $entityManager->persist($invoiceSend);
  496.                 $entityManager->flush();
  497.                 $this->addFlash('success''Le mail a été envoyé !');
  498.             } catch (Exception $exception) {
  499.                 $this->addFlash('error''Une erreur est survenue lors de l\'envoi du mail ! - ' $exception->getMessage());
  500.             }
  501.             if($invoiceCompany){
  502.                 return new Response(json_encode(['id' => $invoiceSend->getCompany()->getId(), 'type' => 'company']), 200, [ "Content-Type" => "application/json"]);
  503.             }else{
  504.                 return new Response(json_encode(['id' => $invoiceSend->getContact()->getId(), 'type' => 'normal']), 200, [ "Content-Type" => "application/json"]);
  505.             }
  506.         }
  507.         if ($invoice !== null || $invoiceCompany !== null) {
  508.             $invoiceSend $invoice ?: $invoiceCompany;
  509.             $emailTemplateList null;
  510.             foreach ($documentEmailTemplateRepository->findAll() as $template){
  511.                 if(!$invoice){
  512.                     if (str_contains($template->getTemplateName(), 'Multimarques')){
  513.                         if(str_contains($template->getTemplateName(), 'Devis') && str_contains($_SERVER['REQUEST_URI'], 'estimate')){
  514.                             $emailTemplateList[] = $template;
  515.                         }elseif(str_contains($template->getTemplateName(), 'Facture') && str_contains($_SERVER['REQUEST_URI'], 'invoice')){
  516.                             $emailTemplateList[] = $template;
  517.                         }
  518.                     }
  519.                 }else{
  520.                     if(!str_contains($template->getTemplateName(), 'Multimarques')){
  521.                         if(str_contains($template->getTemplateName(), 'Devis') && str_contains($_SERVER['REQUEST_URI'], 'estimate')){
  522.                             $emailTemplateList[] = $template;
  523.                         } elseif (str_contains($template->getTemplateName(), 'Facture') && str_contains($_SERVER['REQUEST_URI'], 'invoice')){
  524.                             if($invoiceSend->getIsDeposit() === true && str_contains($template->getTemplateName(), 'acompte')){
  525.                                 $emailTemplateList[] = $template;
  526.                             }elseif($invoiceSend->getIsDeposit() === false && str_contains($template->getTemplateName(), 'définitive')){
  527.                                 $emailTemplateList[] = $template;
  528.                             }
  529.                         }
  530.                     }
  531.                 }
  532.             }
  533.             return $this->render('admin/invoice/send.html.twig', [
  534.                 'invoice' => $invoiceSend,
  535.                 'emailTemplateList' => $emailTemplateList
  536.             ]);
  537.         } else {
  538.             $this->addFlash('error''Le devis n\'existe pas !');
  539.         }
  540.     }
  541.     #[Route('admin/invoice/email/template/{id}'name'adminInvoiceEmailTemplate')]
  542.     public function adminInvoiceEmailTemplate(Request $requestInvoiceRepository $invoiceRepositoryInvoiceCompanyRepository $invoiceCompanyRepositoryDocumentEmailTemplate $documentEmailTemplate null): Response
  543.     {
  544.         $response = [];
  545.         if ($request->isXmlHttpRequest() && $documentEmailTemplate !== null && $request->query->get('invoice')) {
  546.             $invoice $invoiceRepository->findOneBy(['id' => $request->query->get('invoice')]) ?: $invoiceCompanyRepository->findOneBy(['id' => $request->query->get('invoice')]);
  547.             $estimateInvoice '';
  548.             foreach ($invoice->getEstimate() as $estimate) {
  549.                 $estimateInvoice $estimate;
  550.             }
  551.             $collections = [];
  552.             foreach ($estimateInvoice->getProductVariation() as $product_variation) {
  553.                 $collections[] = $product_variation->getProduct()->getCollectionCatalogue()->getName();
  554.             }
  555.             $appointment_url in_array('ceremonie'$collections) ? 'https://appt.link/lamusee-20494/rendu-1h' 'https://appt.link/lamusee-20494/rendu';
  556.             return $this->render('/admin/email/templates/' $documentEmailTemplate->getEmailTemplate(), [
  557.                 'invoice' => $invoice,
  558.                 'estimate' => $estimateInvoice,
  559.                 'appointment_url' => $appointment_url,
  560.                 'CUSTOMER_SPACE_URL_PREFIX' => $this->getParameter('customer_space_url_prefix'),
  561.                 'URL_PREFIX' => $this->getParameter('url_prefix')
  562.             ]);
  563.         }
  564.     }
  565.     /**
  566.      * @param InvoiceRepository $invoiceRepository
  567.      * @return string [type]
  568.      * @throws NonUniqueResultException
  569.      */
  570.     protected function generateInvoiceNumber(InvoiceRepository $invoiceRepository): string
  571.     {
  572.         $todayDate = new DateTime();
  573.         $lastInvoice $invoiceRepository->findLast();
  574.         return 'FAC-' $todayDate->format('dmy-') . (explode('-'$lastInvoice->getNumber())[2] + 1);
  575.     }
  576.     /**
  577.      * @param InvoiceCompanyRepository $invoiceCompanyRepository
  578.      * @return string [type]
  579.      * @throws NonUniqueResultException
  580.      */
  581.     protected function generateInvoiceCompanyNumber(InvoiceCompanyRepository $invoiceCompanyRepository): string
  582.     {
  583.         $lastInvoice $invoiceCompanyRepository->findLast();
  584.         if($lastInvoice != null){
  585.             return 'FAC-M' . (explode('-M'$lastInvoice->getNumber())[1] + 1);
  586.         }else{
  587.             return 'FAC-M1';
  588.         }
  589.     }
  590. }