<?php
namespace App\EventSubscriber;
use App\Event\ConfigurateurConfigurationCreatedEvent;
use App\Service\EmailService;
use App\Service\SogalExpertService;
use App\Service\MovinetService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class ConfigurateurConfigurationSubscriber implements EventSubscriberInterface
{
private $sogalExpertService;
private $movinetService;
private $logger;
private $entityManager;
private $movinetSession;
private $movinetUniqcode;
const LIBELLE_PROMO = 'TRACKING_PROJET_FACADE';
/**
* @var EmailService
*/
private $emailService;
public function __construct(
SogalExpertService $sogalExpertService,
MovinetService $movinetService,
LoggerInterface $logger,
EntityManagerInterface $entityManager,
EmailService $emailService
) {
$this->sogalExpertService = $sogalExpertService;
$this->movinetService = $movinetService;
$this->logger = $logger;
$this->entityManager = $entityManager;
$this->emailService = $emailService;
}
public static function getSubscribedEvents(): array
{
return [
ConfigurateurConfigurationCreatedEvent::NAME => 'onConfigurateurConfigurationCreated',
];
}
public function onConfigurateurConfigurationCreated(ConfigurateurConfigurationCreatedEvent $event): void
{
$dataToSync = $event->getDataToSync();
$projet = $event->getProjet();
if (!isset($dataToSync['noSyncDevis'])) {
$this->logger->info('[CONFIGURATEUR] START Sync Projet vers Sogal-Experts', [
'email' => $dataToSync['email'] ?? null,
'projet_id' => $projet ? $projet->getId():null,
'projet_config' => json_encode($projet->getConfiguration())
]);
try {
// Générer un code promo via Movinet
$promoData = [
'libelle' => $dataToSync['libelle'] ?? self::LIBELLE_PROMO,
'client_final' => $dataToSync['prenom'] . ' ' . $dataToSync['nom'],
'phone' => $dataToSync['telephone'],
'email' => $dataToSync['email'],
'address' => $dataToSync['adresse'] . ' - ' . $dataToSync['cp'] . ' - ' . $dataToSync['ville'],
'observation' => $projet->getProjectReadableDetails()
];
$codePromo = $this->movinetService->generatePromoCode($promoData);
// Ajouter le code promo aux données à synchroniser
$dataToSync['code_promo'] = $codePromo;
$dataToSync['libelle_promo'] = $dataToSync['libelle'] ?? self::LIBELLE_PROMO;
$this->logger->info('[CONFIGURATEUR] Code promo généré avec succès', [
'code_promo' => $codePromo,
'email' => $dataToSync['email'] ?? null
]);
} catch (\Exception $e) {
$this->logger->error('[CONFIGURATEUR] Erreur lors de la génération du code promo', [
'error' => $e->getMessage(),
'email' => $dataToSync['email'] ?? null
]);
// On continue même en cas d'erreur de génération de code promo
$dataToSync['code_promo'] = 'MISSING_GENERATE_FACADE_DEVIS_TRACKING';
$dataToSync['libelle_promo'] = 'MISSING_GENERATE_FACADE_DEVIS_TRACKING';
}
// Envoyer la demande de devis avec les données mises à jour
try {
$result = $this->sogalExpertService->sendDevisRequest($dataToSync);
if (!$result['success']) {
$this->logger->error('[CONFIGURATEUR] Erreur lors de l\'envoi de la demande de devis', [
'error' => $result['error'] ?? 'Erreur inconnue',
'status_code' => $result['status_code'] ?? null,
'email' => $dataToSync['email'] ?? null
]);
throw new BadRequestHttpException('Erreur lors de l\'envoi de la demande de devis: ' . ($result['error'] ?? 'Erreur inconnue'));
}
$this->logger->info('[CONFIGURATEUR] Demande de devis envoyée avec succès', [
'email' => $dataToSync['email'] ?? null
]);
// Changer le statut du projet si présent
if ($projet) {
$projet->setState(\App\Entity\Projet\Projet::STATUS_SENT);
$this->entityManager->persist($projet);
$this->entityManager->flush();
$this->logger->info('[CONFIGURATEUR] Statut du projet mis à jour', [
'projet_id' => $projet->getId(),
'new_state' => \App\Entity\Projet\Projet::STATUS_SENT
]);
}
} catch (\Exception $e) {
$this->logger->error('[CONFIGURATEUR] Exception lors de l\'envoi de la demande de devis', [
'error' => $e->getMessage(),
'email' => $dataToSync['email'] ?? null
]);
throw $e;
}
} else {
$this->logger->info('[CONFIGURATEUR] SKIP Sync Projet vers Sogal-Experts (noSyncData)', [
'email' => $dataToSync['email'] ?? null,
'projet_id' => $projet ? $projet->getId():null,
'projet_config' => json_encode($projet->getConfiguration())
]);
}
// Envoi de l'email de recap projet
try {
$this->emailService->send(
[$dataToSync['email']],
'email/configRecap.html.twig',
'Sogal.com : Votre demande de devis',
[
'firstname' => $dataToSync['prenom'] ?? '',
'lastname' => $dataToSync['nom'] ?? '',
'project' => $projet
]
);
} catch (\Exception $e) {
// On log l'erreur mail mais on ne bloque pas le retour
$this->logger->error('[CONFIGURATEUR] Erreur lors de l\'envoi de l\'email de récapitulatif du devis au client ' . $dataToSync['email'] . ' : ' . $e->getMessage());
}
}
}