feat(Product.php): Ajoute la relation avec ProductReserve.

 feat(DevisSubscriber.php): Crée un subscriber pour l'envoi de devis.

 feat(Devis.php): Ajoute la relation avec ProductReserve.

 feat: Crée le template de mail pour la notification de signature.

 feat(DevisSend.php): Crée l'événement DevisSend.

 feat(Customer.php): Ajoute la relation avec ProductReserve.

🐛 fix(SignatureController.php): Corrige la gestion de la signature complétée.

 feat(DevisController.php): Ajoute la relance de signature et pagination.

 feat: Crée le template de mail pour l'envoi du devis à signer.

 feat: Crée le template de mail pour la confirmation de signature.

 feat(Client.php): Gère la création et le suivi de la signature DocuSeal.

 feat(DevisPdfService.php): Intègre les champs Docuseal.

 feat(list.twig): Affiche la liste des devis avec actions et statuts.

 feat: Crée la page de succès de signature.

 feat(StripeExtension.php): Ajoute le filtre totalQuoto pour calculer le total HT.
```
This commit is contained in:
Serreau Jovann
2026-01-19 19:40:27 +01:00
parent 0afc9e3396
commit cd45a37d73
19 changed files with 879 additions and 55 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Controller\Dashboard;
use App\Entity\CustomerAddress;
use App\Entity\Devis;
use App\Entity\DevisLine;
use App\Event\Signature\DevisSend;
use App\Form\NewDevisType;
use App\Logger\AppLogger;
use App\Repository\AccountRepository;
@@ -18,6 +19,7 @@ use Doctrine\ORM\EntityManagerInterface;
use Knp\Bundle\PaginatorBundle\KnpPaginatorBundle;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
@@ -30,16 +32,52 @@ class DevisController extends AbstractController
/**
* Liste des administrateurs
*/
#[Route(path: '/crm/devis', name: 'app_crm_devis', options: ['sitemap' => false], methods: ['GET'])]
public function devis(Client $client,EntityManagerInterface $entityManager,KernelInterface $kernel,DevisRepository $devisRepository,AppLogger $appLogger,PaginatorInterface $paginator,Request $request): Response
{
#[Route(path: '/crm/devis', name: 'app_crm_devis', options: ['sitemap' => false], methods: ['GET', 'POST'])]
public function devis(
EventDispatcherInterface $eventDispatcher,
EntityManagerInterface $entityManager,
DevisRepository $devisRepository,
AppLogger $appLogger,
PaginatorInterface $paginator,
Request $request,
): Response {
// Gestion du renvoi de la signature
if ($request->query->has('resend')) {
$quoteId = $request->query->get('resend');
$quote = $devisRepository->find($quoteId);
if ($quote instanceof Devis) {
// Déclenchement de l'événement de renvoi
$event = new DevisSend($quote);
$eventDispatcher->dispatch($event);
// Journalisation et notification
$appLogger->record('RESEND', 'Relance signature pour le devis ' . $quote->getNum());
$this->addFlash("success", "Le lien de signature pour le devis " . $quote->getNum() . " a été renvoyé au client.");
return $this->redirectToRoute('app_crm_devis');
}
$this->addFlash("error", "Devis introuvable.");
}
$appLogger->record('VIEW', 'Consultation de la liste des devis');
return $this->render('dashboard/devis/list.twig',[
'quotes' => $paginator->paginate($devisRepository->findBy([],['createA'=>'asc']),$request->get('page', 1),20),
// Pagination (Tri décroissant sur la date de création pour voir les plus récents en premier)
$pagination = $paginator->paginate(
$devisRepository->findBy([], ['createA' => 'DESC']),
$request->query->getInt('page', 1),
20
);
return $this->render('dashboard/devis/list.twig', [
'quotes' => $pagination,
]);
}
#[Route(path: '/crm/devis/add', name: 'app_crm_devis_add', options: ['sitemap' => false], methods: ['GET','POST'])]
public function devisAdd(Client $client,KernelInterface $kernel,CustomerAddressRepository $customerAddress,ProductRepository $productRepository,EntityManagerInterface $entityManager,CustomerRepository $customerRepository,DevisRepository $devisRepository, AppLogger $appLogger,Request $request): Response
public function devisAdd(Client $client,EventDispatcherInterface $eventDispatcher,KernelInterface $kernel,CustomerAddressRepository $customerAddress,ProductRepository $productRepository,EntityManagerInterface $entityManager,CustomerRepository $customerRepository,DevisRepository $devisRepository, AppLogger $appLogger,Request $request): Response
{
$devisNumber ="DEVIS-".sprintf('%05d',$devisRepository->count()+1);
$appLogger->record('VIEW', 'Consultation de la création d\'un devis');
@@ -94,6 +132,9 @@ class DevisController extends AbstractController
$devis->setUpdateAt(new \DateTimeImmutable());
$entityManager->flush();
$client->createSubmissionDevis($devis);
$event = new DevisSend($devis);
$eventDispatcher->dispatch($event);
return $this->redirectToRoute('app_crm_devis');
}
return $this->render('dashboard/devis/add.twig',[