src/EventSubscriber/ConfigurateurConfigurationSubscriber.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Event\ConfigurateurConfigurationCreatedEvent;
  4. use App\Service\EmailService;
  5. use App\Service\SogalExpertService;
  6. use App\Service\MovinetService;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Psr\Log\LoggerInterface;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  11. class ConfigurateurConfigurationSubscriber implements EventSubscriberInterface
  12. {
  13.     private $sogalExpertService;
  14.     private $movinetService;
  15.     private $logger;
  16.     private $entityManager;
  17.     private $movinetSession;
  18.     private $movinetUniqcode;
  19.     const LIBELLE_PROMO 'TRACKING_PROJET_FACADE';
  20.     /**
  21.      * @var EmailService
  22.      */
  23.     private $emailService;
  24.     public function __construct(
  25.         SogalExpertService $sogalExpertService,
  26.         MovinetService $movinetService,
  27.         LoggerInterface $logger,
  28.         EntityManagerInterface $entityManager,
  29.         EmailService $emailService
  30.     ) {
  31.         $this->sogalExpertService $sogalExpertService;
  32.         $this->movinetService $movinetService;
  33.         $this->logger $logger;
  34.         $this->entityManager $entityManager;
  35.         $this->emailService $emailService;
  36.     }
  37.     public static function getSubscribedEvents(): array
  38.     {
  39.         return [
  40.             ConfigurateurConfigurationCreatedEvent::NAME => 'onConfigurateurConfigurationCreated',
  41.         ];
  42.     }
  43.     public function onConfigurateurConfigurationCreated(ConfigurateurConfigurationCreatedEvent $event): void
  44.     {
  45.         $dataToSync $event->getDataToSync();
  46.         $projet $event->getProjet();
  47.         if (!isset($dataToSync['noSyncDevis'])) {
  48.             $this->logger->info('[CONFIGURATEUR] START Sync Projet vers Sogal-Experts', [
  49.                 'email' => $dataToSync['email'] ?? null,
  50.                 'projet_id' => $projet $projet->getId():null,
  51.                 'projet_config' => json_encode($projet->getConfiguration())
  52.             ]);
  53.         try {
  54.             // Générer un code promo via Movinet
  55.             $promoData = [
  56.                 'libelle' => $dataToSync['libelle'] ?? self::LIBELLE_PROMO,
  57.                 'client_final' => $dataToSync['prenom'] . ' ' $dataToSync['nom'],
  58.                 'phone' => $dataToSync['telephone'],
  59.                 'email' => $dataToSync['email'],
  60.                 'address' => $dataToSync['adresse'] . ' - ' .  $dataToSync['cp'] . ' - ' $dataToSync['ville'],
  61.                 'observation' => $projet->getProjectReadableDetails()
  62.             ];
  63.                 $codePromo $this->movinetService->generatePromoCode($promoData);
  64.                 // Ajouter le code promo aux données à synchroniser
  65.                 $dataToSync['code_promo'] = $codePromo;
  66.                 $dataToSync['libelle_promo'] = $dataToSync['libelle'] ?? self::LIBELLE_PROMO;
  67.                 $this->logger->info('[CONFIGURATEUR] Code promo généré avec succès', [
  68.                     'code_promo' => $codePromo,
  69.                     'email' => $dataToSync['email'] ?? null
  70.                 ]);
  71.             } catch (\Exception $e) {
  72.                 $this->logger->error('[CONFIGURATEUR] Erreur lors de la génération du code promo', [
  73.                     'error' => $e->getMessage(),
  74.                     'email' => $dataToSync['email'] ?? null
  75.                 ]);
  76.                 // On continue même en cas d'erreur de génération de code promo
  77.                 $dataToSync['code_promo'] = 'MISSING_GENERATE_FACADE_DEVIS_TRACKING';
  78.                 $dataToSync['libelle_promo'] = 'MISSING_GENERATE_FACADE_DEVIS_TRACKING';
  79.             }
  80.             // Envoyer la demande de devis avec les données mises à jour
  81.             try {
  82.                 $result $this->sogalExpertService->sendDevisRequest($dataToSync);
  83.                 if (!$result['success']) {
  84.                     $this->logger->error('[CONFIGURATEUR] Erreur lors de l\'envoi de la demande de devis', [
  85.                         'error' => $result['error'] ?? 'Erreur inconnue',
  86.                         'status_code' => $result['status_code'] ?? null,
  87.                         'email' => $dataToSync['email'] ?? null
  88.                     ]);
  89.                     throw new BadRequestHttpException('Erreur lors de l\'envoi de la demande de devis: ' . ($result['error'] ?? 'Erreur inconnue'));
  90.                 }
  91.                 $this->logger->info('[CONFIGURATEUR] Demande de devis envoyée avec succès', [
  92.                     'email' => $dataToSync['email'] ?? null
  93.                 ]);
  94.                 // Changer le statut du projet si présent
  95.                 if ($projet) {
  96.                     $projet->setState(\App\Entity\Projet\Projet::STATUS_SENT);
  97.                     $this->entityManager->persist($projet);
  98.                     $this->entityManager->flush();
  99.                     $this->logger->info('[CONFIGURATEUR] Statut du projet mis à jour', [
  100.                         'projet_id' => $projet->getId(),
  101.                         'new_state' => \App\Entity\Projet\Projet::STATUS_SENT
  102.                     ]);
  103.                 }
  104.             } catch (\Exception $e) {
  105.                 $this->logger->error('[CONFIGURATEUR] Exception lors de l\'envoi de la demande de devis', [
  106.                     'error' => $e->getMessage(),
  107.                     'email' => $dataToSync['email'] ?? null
  108.                 ]);
  109.                 throw $e;
  110.             }
  111.         } else {
  112.              $this->logger->info('[CONFIGURATEUR] SKIP Sync Projet vers Sogal-Experts (noSyncData)', [
  113.                 'email' => $dataToSync['email'] ?? null,
  114.                 'projet_id' => $projet $projet->getId():null,
  115.                 'projet_config' => json_encode($projet->getConfiguration())
  116.             ]);
  117.         }
  118.         // Envoi de l'email de recap projet
  119.         try {
  120.             $this->emailService->send(
  121.                 [$dataToSync['email']],
  122.                 'email/configRecap.html.twig',
  123.                 'Sogal.com : Votre demande de devis',
  124.                 [
  125.                     'firstname' => $dataToSync['prenom'] ?? '',
  126.                     'lastname' => $dataToSync['nom'] ?? '',
  127.                     'project' => $projet
  128.                 ]
  129.             );
  130.         } catch (\Exception $e) {
  131.             // On log l'erreur mail mais on ne bloque pas le retour
  132.             $this->logger->error('[CONFIGURATEUR] Erreur lors de l\'envoi de l\'email de récapitulatif du devis au client ' $dataToSync['email'] . ' : ' $e->getMessage());
  133.         }
  134.     }
  135. }