<?php
namespace App\Controller;
use App\Entity\Contact\Contact;
use App\Entity\Estimate\Estimate;
use App\Entity\Estimate\EstimateCompany;
use App\Entity\Invoice\Invoice;
use App\Entity\Invoice\InvoiceCompany;
use App\Entity\Search\InvoiceSearch;
use App\Entity\Document\DocumentEmailTemplate;
use App\Form\EstimateType;
use App\Form\Search\InvoiceSearchType;
use App\Repository\Contact\ContactRepository;
use App\Repository\Document\DocumentEmailTemplateRepository;
use App\Repository\Invoice\InvoiceCompanyRepository;
use App\Repository\Invoice\InvoiceRepository;
use App\Repository\Invoice\InvoiceStatusRepository;
use App\Repository\Product\ProductMaterialRepository;
use App\Repository\Product\ProductMismatchedRepository;
use App\Repository\Product\ProductVariationRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Knp\Component\Pager\PaginatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Routing\Annotation\Route;
use DateTime;
use Dompdf\Dompdf;
use Exception;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
class InvoiceController extends AbstractController
{
/**
* @param Request $request
* @param PaginatorInterface $paginator
* @param InvoiceRepository $invoiceRepository
* @return Response
*
* @IsGranted("ROLE_USER")*
*/
#[Route('/admin/invoices', name: 'adminInvoicesDashboard')]
public function adminInvoicesDashboard(Request $request, PaginatorInterface $paginator, InvoiceRepository $invoiceRepository): Response
{
$invoiceSearch = new InvoiceSearch();
$invoiceSearchForm = $this->createForm(InvoiceSearchType::class, $invoiceSearch);
$invoiceSearchForm->handleRequest($request);
// dd($invoiceRepository->findSearch($invoiceSearch));
$invoices = $paginator->paginate(
$invoiceRepository->findSearch($invoiceSearch),
$request->query->getInt('page', 1),
10
);
return $this->render('admin/invoice/dashboard.html.twig', [
'invoices' => $invoices,
'invoiceSearchForm' => $invoiceSearchForm->createView(),
]);
}
/**
* @param InvoiceRepository $invoiceRepository
* @param InvoiceStatusRepository $invoiceStatusRepository
* @param Request $request
* @param EntityManager $entityManager
* @param Invoice|null $invoice
* @return Response
*
* @throws NonUniqueResultException
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/deposit/add/deposit/{id}', name: 'adminInvoicesAddFromDeposit')]
public function adminInvoicesAddFromDeposit(InvoiceRepository $invoiceRepository, InvoiceStatusRepository $invoiceStatusRepository, Request $request, EntityManagerInterface $entityManager, Invoice $invoice = null): Response
{
if ($invoice !== null) {
$newInvoice = clone $invoice;
$newInvoice->setNumber($this->generateInvoiceNumber($invoiceRepository));
$newInvoice->setCreationDate(new DateTime());
$newInvoice->setAllTaxesIncludedPrice($invoice->getAllTaxesIncludedPrice() * 2);
$newInvoice->setLastUpdate(new DateTime());
$newInvoice->setIsDeposit(false);
$newInvoice->setDepositInvoice($invoice);
$newInvoice->setDepositAmount(0);
$newInvoice->setInvoice($invoice);
$newInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'draft']));
$newInvoice->setLeftToPay($invoice->getAllTaxesIncludedPrice());
try {
$entityManager->persist($newInvoice);
$entityManager->flush();
$this->addFlash('success', 'La facture a été ajoutée !');
} catch (Exception $exception) {
$this->addFlash('error', 'La facture n\'a pas pu être créée - ' . $exception->getMessage());
}
if ($request->isXmlHttpRequest()) {
return new Response($newInvoice->getId(), 200, ['Content-Type' => 'text/plain']);
} else {
return $this->redirectToRoute('adminContactDetails', ['id' => $invoice->getContact()->getId()]);
}
}
$this->addFlash('error', 'La facture d\'acompte n\'a pas été trouvée !');
return $this->redirectToRoute('adminInvoicesDashboard');
}
/**
* @param InvoiceRepository $invoiceRepository
* @param InvoiceCompanyRepository $invoiceCompanyRepository
* @param InvoiceStatusRepository $invoiceStatusRepository
* @param EntityManagerInterface $entityManager
* @param Estimate|null $estimate
* @param EstimateCompany|null $estimateCompany
* @return Response
*
* @throws NonUniqueResultException
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/deposit/add/estimate/{id}', name: 'adminInvoicesDepositAddFromEstimate')]
public function adminInvoicesAddFromEstimate(InvoiceRepository $invoiceRepository, InvoiceCompanyRepository $invoiceCompanyRepository ,InvoiceStatusRepository $invoiceStatusRepository, EntityManagerInterface $entityManager, Estimate $estimate = null, EstimateCompany $estimateCompany = null): Response
{
$contact = "";
if ($estimate !== null || $estimateCompany !== null) {
$depositInvoice = $estimate ? new Invoice() : new InvoiceCompany();
$contact = $estimate ? $estimate->getContact() : $estimateCompany->getCompany();
$estimateInvoice = $estimate ?: $estimateCompany;
$maximumValidationDate = new DateTime();
$maximumValidationDate->modify('+6 months');
$depositInvoice->setNumber($estimate ? $this->generateInvoiceNumber($invoiceRepository) : $this->generateInvoiceCompanyNumber($invoiceCompanyRepository));
$depositInvoice->setCreationDate(new DateTime());
$depositInvoice->setLastUpdate(new DateTime());
$depositInvoice->setMaximumValidationDate($maximumValidationDate);
$depositInvoice->setIsDeposit(true);
$depositInvoice->setDepositAmount(50);
$depositInvoice->setPreTaxPrice($estimateInvoice->getPreTaxPrice() * (1 - ($depositInvoice->getDepositAmount() / 100)));
$depositInvoice->setAllTaxesIncludedPrice($estimateInvoice->getAllTaxesIncludedPrice() * (1 - ($depositInvoice->getDepositAmount() / 100)));
$depositInvoice->setTva(20);
$depositInvoice->addEstimate($estimateInvoice);
$estimate ? $depositInvoice->setContact($contact) : $depositInvoice->setCompany($contact);
$depositInvoice->setSeller($estimateInvoice->getSeller());
$depositInvoice->setLeftToPay($estimateInvoice->getAllTaxesIncludedPrice() * (1 - ($depositInvoice->getDepositAmount() / 100)));
$depositInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'due']));
$entityManager->persist($depositInvoice);
$finalInvoice = clone $depositInvoice;
$finalInvoice->setNumber($estimate ? $this->generateInvoiceNumber($invoiceRepository) : $this->generateInvoiceCompanyNumber($invoiceCompanyRepository));
$finalInvoice->setCreationDate(new DateTime());
$finalInvoice->setAllTaxesIncludedPrice($estimateInvoice->getAllTaxesIncludedPrice());
$finalInvoice->setPreTaxPrice($estimateInvoice->getPreTaxPrice());
$finalInvoice->setLeftToPay($estimateInvoice->getAllTaxesIncludedPrice());
$finalInvoice->setLastUpdate(new DateTime());
$finalInvoice->setIsDeposit(false);
$finalInvoice->setDepositInvoice($depositInvoice);
$finalInvoice->setDepositAmount(0);
$finalInvoice->setInvoice($depositInvoice);
$finalInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'payinprogress']));
$entityManager->persist($finalInvoice);
$entityManager->flush();
$this->addFlash('success', 'La facture d\'acompte a bien été créée !');
return $this->redirectToRoute('invoiceDepositSavePayment', ['id' => $depositInvoice->getId()]);
} else {
$this->addFlash('error', 'Le devis n\'a pas été trouvé!');
}
return $estimate ? $this->redirectToRoute('adminContactDetails', ['id' => $contact->getId()]) : $this->redirectToRoute('adminCompanyDetails', ['id' => $contact->getId()]);
}
/**
* @param InvoiceStatusRepository $invoiceStatusRepository
* @param EntityManagerInterface $entityManager
* @param Invoice|null $invoice
* @return Response
*
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/deposit/add/estimate/definitive/{id}', name: 'adminInvoicesDepositAddDefinitiveFromAdvance')]
public function adminInvoicesAddDefinitiveFromAdvance(InvoiceStatusRepository $invoiceStatusRepository, EntityManagerInterface $entityManager, Invoice $invoice = null, InvoiceCompany $invoiceCompany = null): Response
{
$contact = "";
if ($invoice !== null || $invoiceCompany !== null) {
$contact = $invoice ? $invoice->getContact() : $invoiceCompany->getCompany();
$invoiceClone = $invoice ?: $invoiceCompany;
$finalInvoice = clone $invoiceClone;
$finalInvoice->setNumber($invoiceClone->getNumber());
$finalInvoice->setCreationDate(new DateTime());
$finalInvoice->setAllTaxesIncludedPrice($invoiceClone->getAllTaxesIncludedPrice() * 2);
$finalInvoice->setPreTaxPrice($invoiceClone->getPreTaxPrice());
$finalInvoice->setLeftToPay(($invoiceClone->getAllTaxesIncludedPrice() * 2) + ($invoiceClone->getLeftToPay() - $invoiceClone->getAllTaxesIncludedPrice()));
$finalInvoice->setLastUpdate(new DateTime());
$finalInvoice->setIsDeposit(false);
$finalInvoice->setDepositInvoice($invoiceClone);
$finalInvoice->setDepositAmount(0);
$finalInvoice->setInvoice($invoiceClone);
$finalInvoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'payinprogress']));
try {
$entityManager->persist($finalInvoice);
$entityManager->flush();
$this->addFlash('success', 'La facture définitive a bien été créée !');
} catch (Exception $exception) {
$this->addFlash('error', 'La facture définitive n\'a pas pu être créée, elle existe déjà' );
}
} else {
$this->addFlash('error', 'Le devis n\'a pas été trouvé!');
}
return $this->redirectToRoute($invoice ? 'adminContactDetails' : 'adminCompanyDetails', ['id' => $contact->getId()]);
}
/**
* @param Invoice|null $invoice
* @param InvoiceCompany|null $invoiceCompany
* @return RedirectResponse|Response
*
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/view/{id}', name: 'adminViewInvoice')]
public function adminViewInvoice(Invoice $invoice = null, InvoiceCompany $invoiceCompany = null): RedirectResponse|Response
{
if ($invoice !== null || $invoiceCompany !== null) {
$invoiceToView = $invoice ?: $invoiceCompany;
foreach ($invoiceToView->getEstimate() as $estimate) {
$estimateInvoice = $estimate;
}
return $this->render('admin/invoice/view.html.twig', [
'invoice' => $invoiceToView,
'estimate' => $estimateInvoice
]);
} else {
$this->addFlash('error', 'La facture est introuvable !');
}
return $this->redirectToRoute('adminInvoicesDashboard');
}
/**
* @param Invoice|null $invoice
* @param InvoiceCompany $invoiceCompany
* @return Response
*
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/view/pdf/{id}', name: 'adminPdfViewInvoice')]
public function adminPdfViewInvoice(Invoice $invoice = null, InvoiceCompany $invoiceCompany = null): Response
{
if ($invoice !== null || $invoiceCompany !== null) {
$invoicePDF = $invoice ?: $invoiceCompany;
$templateUrl = $invoicePDF->getIsDeposit() ? 'admin/invoice/template/depositPdfView.html.twig' : 'admin/invoice/template/invoicePdfView.html.twig';
$domPDF = new Dompdf(['enable_remote' => true]);
$image = getcwd().'/images/rib-lamusee.png';
$imageData = base64_encode(file_get_contents($image));
$src = 'data:'.mime_content_type($image).';base64,'.$imageData;
$html = $this->renderView($templateUrl, [
'invoice' => $invoicePDF,
'base_dir' => getcwd(),
'rib' => $src,
'URL_PREFIX' => $this->getParameter('url_prefix')
]);
$domPDF->loadHtml($html);
$domPDF->render();
return new Response(
$domPDF->stream($invoicePDF->getNumber() . ".pdf", [
"Attachment" => false
]),
200,
array(
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="' . $invoicePDF->getNumber() . '.pdf"'
)
);
} else {
$this->addFlash('error', 'La facture n\'existe pas');
return $this->redirectToRoute('adminInvoicesDashboard');
}
}
/**
* @param InvoiceCompany|null $invoiceCompany
* @param Request $request
* @param MailerInterface $mailer
* @return Response
*
* @throws TransportExceptionInterface
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/company/relaunch/{id}', name: 'adminCompanyRelaunch')]
public function adminCompanyRelaunch(InvoiceCompany $invoiceCompany = null, Request $request, MailerInterface $mailer): Response
{
if ($invoiceCompany !== null) {
$invoiceRelaunchEmail = (new Email())
->from(new Address('contact@lamusee.com', 'LAMUSEE'))
->subject('Relance paiement L\'Amusee ' . $invoiceCompany->getNumber())
->to($invoiceCompany->getCompany()->getEmail())
->bcc('contact@lamusee.com') // Ajout de la copie cachée pour le suivi
->html($this->render('admin/email/relaunch_multibrand.html.twig', ['invoice'=> $invoiceCompany, 'CUSTOMER_SPACE_URL_PREFIX' => $this->getParameter('customer_space_url_prefix')])->getContent());
$mailer->send($invoiceRelaunchEmail);
$this->addFlash('success', 'La relance a bien été envoyé');
return $this->redirectToRoute('adminCompanyDetails', ['id' => $invoiceCompany->getCompany()->getId()]);
} else {
$this->addFlash('error', 'La société n\'a pas été trouvé !');
return $this->redirectToRoute('adminContactDashboard');
}
}
/**
* @param Request $request
* @param UserRepository $userRepository
* @param Contact|null $contact
* @return Response
*
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/add/{id}', name: 'adminAddInvoice')]
public function adminAddInvoice(Request $request, UserRepository $userRepository, Contact $contact = null): Response
{
if ($contact !== null) {
$estimateForm = $this->createForm(EstimateType::class, $contact);
$estimateForm->handleRequest($request);
return $this->render('admin/invoice/add.html.twig', [
'contact' => $contact,
'estimateForm' => $estimateForm->createView(),
'sellerList' => $userRepository->findAll()
]);
}
$this->addFlash('error', 'Merci de donner un contact valide !');
return $this->redirectToRoute('adminInvoicesDashboard');
}
/**
* @param Request $request
* @param UserRepository $userRepository
* @param ProductMaterialRepository $productMaterialRepository
* @param ProductMismatchedRepository $productMismatchedRepository
* @param Invoice|null $invoice
* @return Response
*
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/edit/{id}', name: 'adminEditInvoice')]
public function adminEditInvoice(Request $request, UserRepository $userRepository, ProductMaterialRepository $productMaterialRepository, ProductMismatchedRepository $productMismatchedRepository, Invoice $invoice = null): Response
{
if ($invoice !== null) {
$estimateForm = $this->createForm(EstimateType::class, $invoice);
$estimateForm->handleRequest($request);
return $this->render('admin/invoice/edit.html.twig', [
'invoice' => $invoice,
'estimateForm' => $estimateForm->createView(),
'sellerList' => $userRepository->findAll(),
'productMaterial' => $productMaterialRepository->findAll(),
'productMismatched' => $productMismatchedRepository->findAll(),
]);
}
$this->addFlash('error', 'La facture n\'a pas été trouvée');
return $this->redirectToRoute('adminInvoicesDashboard');
}
/**
* @param InvoiceRepository $invoiceRepository
* @param EntityManagerInterface $entityManager
* @param Invoice|null $invoice
* @return Response
*
* @throws NonUniqueResultException
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/duplicate/{id}', name: 'adminDuplicateInvoice')]
public function adminDuplicateInvoice(InvoiceRepository $invoiceRepository, EntityManagerInterface $entityManager, Invoice $invoice = null): Response
{
if ($invoice !== null) {
$duplicateInvoice = clone $invoice;
$duplicateInvoice->setNumber($this->generateInvoiceNumber($invoiceRepository));
$duplicateInvoice->setCreationDate(new DateTime());
$duplicateInvoice->setLastUpdate(new DateTime());
try {
$entityManager->persist($duplicateInvoice);
$entityManager->flush();
$this->addFlash('success', 'La facture a été dupliquée');
} catch (Exception $exception) {
$this->addFlash('error', 'La facture n\'a pas pu être dupliquée - ' . $exception->getMessage());
return $this->redirectToRoute('adminInvoicesDashboard');
}
} else {
$this->addFlash('error', 'La facture n\'a pas été trouvée');
}
return $this->redirectToRoute('adminInvoicesDashboard');
}
/**
* @param EntityManagerInterface $entityManager
* @param Invoice|null $invoice
* @param InvoiceCompany|null $invoiceCompany
* @return Response
*
* @IsGranted("ROLE_USER")
*/
#[Route('/admin/invoice/delete/{id}', name: 'adminDeleteInvoice')]
public function adminDeleteInvoice(EntityManagerInterface $entityManager, Invoice $invoice = null, InvoiceCompany $invoiceCompany = null): Response
{
if ($invoice !== null || $invoiceCompany !== null) {
try {
$invoiceToDelete = $invoice?: $invoiceCompany;
$invoiceToDelete->setInvoice(null);
$invoiceToDelete->setDepositInvoice(null);
foreach ($invoiceToDelete->getEstimate() as $estimate) {
$invoiceToDelete->removeEstimate($estimate);
}
foreach ($invoiceToDelete->getPayments() as $payment) {
$invoiceToDelete->removePayment($payment);
}
foreach ($invoiceToDelete->getProductVariation() as $product) {
$invoiceToDelete->removeProduct($product);
}
$entityManager->remove($invoiceToDelete);
$entityManager->flush();
$this->addFlash('success', 'La facture à été supprimée !');
} catch (Exception $exception) {
$this->addFlash('error', 'La facture n\'a pas été supprimée ! (' . $exception->getMessage() . ')');
}
} else {
$this->addFlash('error', 'Le facture n\'a pas été trouvée !');
}
return $invoice ? $this->redirectToRoute('adminContactDetails', ['id' => $invoice->getContact()->getId()]) : $this->redirectToRoute('adminCompanyDetails', ['id' => $invoiceCompany->getCompany()->getId()]);
}
/**
* @throws NonUniqueResultException
*/
#[Route('/admin/invoice/save', name: 'adminSaveInvoice')]
public function adminSaveInvoice(Request $request, EntityManagerInterface $entityManager, InvoiceRepository $invoiceRepository,UserRepository $userRepository, ContactRepository $contactRepository, ProductVariationRepository $productVariationRepository, InvoiceStatusRepository $invoiceStatusRepository): Response
{
if ($request->isXmlHttpRequest() && $request->request->get('documentFormData')) {
if($request->request->get('invoiceId') && $invoiceRepository->findOneBy(['id' => $request->request->get('invoiceId')]) !== null){
$invoice = $invoiceRepository->findOneBy(['id' =>$request->request->get('invoiceId')]);
} else{
$invoice = new Invoice();
}
$invoiceDetails = [];
$maximumValidationDate = new DateTime();
$maximumValidationDate->modify('+6 month');
$invoice->setLastUpdate(new DateTime());
$invoice->setMaximumValidationDate($maximumValidationDate);
if (!$invoice->getCreationDate()) $invoice->setCreationDate(new DateTime());
if (!$invoice->getNumber()) $invoice->setNumber($this->generateInvoiceNumber($invoiceRepository));
if ($request->request->get('paiementIsRegistered') && $request->request->get('paiementIsRegistered')) $invoice->setPaymentDate(new DateTime());
if ($request->request->get('documentSeller')) $invoice->setSeller($userRepository->findOneBy(['id' => $request->request->get('documentSeller')]));
if ($request->request->get('contact')) $invoice->setContact($contactRepository->findOneBy(['id' => $request->request->get('contact')]));
if ($request->request->get('preTaxPrice')) $invoice->setPreTaxPrice((float)$request->request->get('preTaxPrice'));
if ($request->request->get('totalPrice')) $invoice->setAllTaxesIncludedPrice((float)$request->request->get('totalPrice'));
if ($request->request->get('documentObject')) $invoice->setSubject($request->request->get('documentObject'));
if ($request->request->get('documentNotes')) $invoice->setNote($request->request->get('documentNotes'));
if ($request->request->get('leftToPay')) {
if ($request->request->get('paiementIsRegistered') && $request->request->get('paiementAmount')) {
$invoice->setLeftToPay((float)$request->request->get('leftToPay') == 0 ? 0 : (float)$request->request->get('leftToPay') - (float)$request->request->get('paiementAmount'));
} else {
$invoice->setLeftToPay($request->request->get('leftToPay'));
}
}
if ($request->request->get('isDeposit')) $invoice->setIsDeposit(!($request->request->get('isDeposit') === "false"));
if ($request->request->get('estimateDetails')) {
try {
foreach (json_decode($request->request->get('estimateDetails')) as $detail) {
if ($detail->ref === "produit") {
$invoice->addProductVariation($productVariationRepository->findOneBy(['id' => $detail->product_id]));
}
$invoiceDetails[] = $detail;
}
$invoice->setDetail($invoiceDetails);
} catch (Exception $exception) {
dd($exception->getMessage());
}
}
if ($invoice->getLeftToPay() === 0.0) {
$invoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'paid']));
} else {
$invoice->setStatus($invoiceStatusRepository->findOneBy(['value' => 'payinprogress']));
}
try {
$entityManager->persist($invoice);
$entityManager->flush();
$this->addFlash('success', 'La facture a été sauvegardé');
return new Response(json_encode(['id' => $invoice->getContact()->getId()]), 200, ["Content-Type" => "application/json"]);
} catch (Exception $exception) {
$this->addFlash('error', 'La facture n\'a pas pu être sauvegardé ' . $exception->getMessage());
//return new Response('error', 403, [ "Content-Type" => "text/plain"]);
dd($exception->getMessage());
}
}
return new Response("", 404, ["Content-Type" => "text/plain"]);
}
/**
* @IsGranted("ROLE_USER")
*/
#[Route('admin/invoice/send/{id}', name: 'adminInvoiceSend')]
public function adminInvoiceSend(Request $request, EntityManagerInterface $entityManager, MailerInterface $mailer, DocumentEmailTemplateRepository $documentEmailTemplateRepository, InvoiceStatusRepository $invoiceStatusRepository, Invoice $invoice = null, InvoiceCompany $invoiceCompany = null): RedirectResponse|Response
{
if ($request->isXmlHttpRequest() && ($invoice !== null || $invoiceCompany !== null) && $request->request->get('emailDisplaySubject')) {
$invoiceSend = $invoiceCompany ?: $invoice;
$email = (new Email())
->from(new Address('contact@lamusee.com', 'LAMUSEE'))
->bcc('contact@lamusee.com') // Ajout de la copie cachée pour le suivi
->subject($request->request->get('emailDisplaySubject'))
->html($request->request->get('emailHtmlContent'));
foreach (json_decode($request->request->get('emailRecipients')) as $emailAdress) {
$email->addTo($emailAdress);
}
try {
$mailer->send($email);
$invoiceSend->setLastUpdate(new DateTime());
$entityManager->persist($invoiceSend);
$entityManager->flush();
$this->addFlash('success', 'Le mail a été envoyé !');
} catch (Exception $exception) {
$this->addFlash('error', 'Une erreur est survenue lors de l\'envoi du mail ! - ' . $exception->getMessage());
}
if($invoiceCompany){
return new Response(json_encode(['id' => $invoiceSend->getCompany()->getId(), 'type' => 'company']), 200, [ "Content-Type" => "application/json"]);
}else{
return new Response(json_encode(['id' => $invoiceSend->getContact()->getId(), 'type' => 'normal']), 200, [ "Content-Type" => "application/json"]);
}
}
if ($invoice !== null || $invoiceCompany !== null) {
$invoiceSend = $invoice ?: $invoiceCompany;
$emailTemplateList = null;
foreach ($documentEmailTemplateRepository->findAll() as $template){
if(!$invoice){
if (str_contains($template->getTemplateName(), 'Multimarques')){
if(str_contains($template->getTemplateName(), 'Devis') && str_contains($_SERVER['REQUEST_URI'], 'estimate')){
$emailTemplateList[] = $template;
}elseif(str_contains($template->getTemplateName(), 'Facture') && str_contains($_SERVER['REQUEST_URI'], 'invoice')){
$emailTemplateList[] = $template;
}
}
}else{
if(!str_contains($template->getTemplateName(), 'Multimarques')){
if(str_contains($template->getTemplateName(), 'Devis') && str_contains($_SERVER['REQUEST_URI'], 'estimate')){
$emailTemplateList[] = $template;
} elseif (str_contains($template->getTemplateName(), 'Facture') && str_contains($_SERVER['REQUEST_URI'], 'invoice')){
if($invoiceSend->getIsDeposit() === true && str_contains($template->getTemplateName(), 'acompte')){
$emailTemplateList[] = $template;
}elseif($invoiceSend->getIsDeposit() === false && str_contains($template->getTemplateName(), 'définitive')){
$emailTemplateList[] = $template;
}
}
}
}
}
return $this->render('admin/invoice/send.html.twig', [
'invoice' => $invoiceSend,
'emailTemplateList' => $emailTemplateList
]);
} else {
$this->addFlash('error', 'Le devis n\'existe pas !');
}
}
#[Route('admin/invoice/email/template/{id}', name: 'adminInvoiceEmailTemplate')]
public function adminInvoiceEmailTemplate(Request $request, InvoiceRepository $invoiceRepository, InvoiceCompanyRepository $invoiceCompanyRepository, DocumentEmailTemplate $documentEmailTemplate = null): Response
{
$response = [];
if ($request->isXmlHttpRequest() && $documentEmailTemplate !== null && $request->query->get('invoice')) {
$invoice = $invoiceRepository->findOneBy(['id' => $request->query->get('invoice')]) ?: $invoiceCompanyRepository->findOneBy(['id' => $request->query->get('invoice')]);
$estimateInvoice = '';
foreach ($invoice->getEstimate() as $estimate) {
$estimateInvoice = $estimate;
}
$collections = [];
foreach ($estimateInvoice->getProductVariation() as $product_variation) {
$collections[] = $product_variation->getProduct()->getCollectionCatalogue()->getName();
}
$appointment_url = in_array('ceremonie', $collections) ? 'https://appt.link/lamusee-20494/rendu-1h' : 'https://appt.link/lamusee-20494/rendu';
return $this->render('/admin/email/templates/' . $documentEmailTemplate->getEmailTemplate(), [
'invoice' => $invoice,
'estimate' => $estimateInvoice,
'appointment_url' => $appointment_url,
'CUSTOMER_SPACE_URL_PREFIX' => $this->getParameter('customer_space_url_prefix'),
'URL_PREFIX' => $this->getParameter('url_prefix')
]);
}
}
/**
* @param InvoiceRepository $invoiceRepository
* @return string [type]
* @throws NonUniqueResultException
*/
protected function generateInvoiceNumber(InvoiceRepository $invoiceRepository): string
{
$todayDate = new DateTime();
$lastInvoice = $invoiceRepository->findLast();
return 'FAC-' . $todayDate->format('dmy-') . (explode('-', $lastInvoice->getNumber())[2] + 1);
}
/**
* @param InvoiceCompanyRepository $invoiceCompanyRepository
* @return string [type]
* @throws NonUniqueResultException
*/
protected function generateInvoiceCompanyNumber(InvoiceCompanyRepository $invoiceCompanyRepository): string
{
$lastInvoice = $invoiceCompanyRepository->findLast();
if($lastInvoice != null){
return 'FAC-M' . (explode('-M', $lastInvoice->getNumber())[1] + 1);
}else{
return 'FAC-M1';
}
}
}