diff --git a/.env b/.env index 371ccf0..54e60be 100644 --- a/.env +++ b/.env @@ -85,7 +85,7 @@ STRIPE_WEBHOOKS_SECRET= SIGN_URL=https://00ca-212-114-31-239.ngrok-free.app STRIPE_BASEURL=https://00ca-212-114-31-239.ngrok-free.app -CONTRAT_BASEURL=https://00ca-212-114-31-239.ngrok-free.app +CONTRAT_BASEURL=https://esyweb.local MINIO_S3_URL= MINIO_S3_CLIENT_ID= diff --git a/src/Controller/Webhooks.php b/src/Controller/Webhooks.php index df93ecf..ed432a4 100644 --- a/src/Controller/Webhooks.php +++ b/src/Controller/Webhooks.php @@ -189,6 +189,46 @@ class Webhooks extends AbstractController $metadata = $content->metadata; $status = $content->status ?? ''; + // Email de notification admin (à adapter si besoin) + $adminEmail = 'contact@ludikevent.fr'; + + // --- TRAITEMENT DES CONTRATS --- + if (isset($metadata->type) && $metadata->type === "contrat" && isset($metadata->id)) { + $contrats = $contratsRepository->find($metadata->id); + + if ($contrats instanceof Contrats) { + // Cas 1 : Signature refusée par le client + if ($status === "declined") { + $reason = $content->decline_reason ?? 'Aucune raison spécifiée'; + + $contrats->setRefused(true); + $contrats->setRefusedRaison($reason); + + $entityManager->persist($contrats); + $entityManager->flush(); + + // Notification ADMIN + $customer = $contrats->getCustomer(); + if ($customer) { + $mailer->send( + $adminEmail, + "Intranet Ludikevent", + "[Action Requise] Refus de signature - Contrat n°" . $contrats->getNumReservation(), + "mails/customer/contrat_refuses.twig", + [ + 'contrat' => $contrats, + 'raison' => $reason, + ] + ); + } + + $appLogger->record('WEBHOOK', sprintf("Contrat %s refusé par le client. Raison: %s", $contrats->getNumReservation(), $reason)); + + return new Response("ok-contrat-declined"); + } + } + } + // --- TRAITEMENT DES DEVIS --- if (isset($metadata->type) && $metadata->type === "devis" && isset($metadata->id)) { $devis = $devisRepository->find($metadata->id); @@ -204,13 +244,13 @@ class Webhooks extends AbstractController $entityManager->persist($devis); $entityManager->flush(); - // Notification au client (Confirmation de prise en compte du refus) + // Notification ADMIN $customer = $devis->getCustomer(); if ($customer) { $mailer->send( - $customer->getEmail(), - $customer->getName() . " " . $customer->getSurname(), - "[Intranet Ludikevent] - Le client a refusé la signature du devis n°" . $devis->getNum(), + $adminEmail, + "Intranet Ludikevent", + "[Action Requise] Refus de signature - Devis n°" . $devis->getNum(), "mails/customer/devis_refuses.twig", [ 'devis' => $devis, @@ -224,9 +264,8 @@ class Webhooks extends AbstractController return new Response("ok-devis-declined"); } - // Cas 2 : Signature complétée (Optionnel - à implémenter selon vos besoins) + // Cas 2 : Signature complétée if ($status === "completed") { - // Logique de succès (ex: passage en contrat) $appLogger->record('WEBHOOK', sprintf("Devis %s signé avec succès.", $devis->getNum())); return new Response("ok-devis-completed"); } diff --git a/src/Entity/Contrats.php b/src/Entity/Contrats.php index f7d9664..af2a63d 100644 --- a/src/Entity/Contrats.php +++ b/src/Entity/Contrats.php @@ -152,6 +152,12 @@ class Contrats #[ORM\ManyToOne(inversedBy: 'contrats')] private ?Prestaire $prestataire = null; + #[ORM\Column(nullable: true)] + private ?bool $refused = null; + + #[ORM\Column(type: Types::TEXT, nullable: true)] + private ?string $refusedRaison = null; + public function __construct() { $this->contratsPayments = new ArrayCollection(); @@ -904,4 +910,28 @@ class Contrats })->first() instanceof ContratsPayments; } + public function isRefused(): ?bool + { + return $this->refused; + } + + public function setRefused(?bool $refused): static + { + $this->refused = $refused; + + return $this; + } + + public function getRefusedRaison(): ?string + { + return $this->refusedRaison; + } + + public function setRefusedRaison(?string $refusedRaison): static + { + $this->refusedRaison = $refusedRaison; + + return $this; + } + } diff --git a/templates/dashboard/devis/list.twig b/templates/dashboard/devis/list.twig index bdaa537..b6de74a 100644 --- a/templates/dashboard/devis/list.twig +++ b/templates/dashboard/devis/list.twig @@ -5,7 +5,7 @@ {% block actions %}
- + @@ -31,34 +31,41 @@ {% for quote in quotes %} + {# LOGIQUE STATUT : On sépare le statut de la raison (ex: refused|Trop cher) #} + {% set stateParts = quote.state|split('|') %} + {% set status = stateParts[0] %} + {% set reason = stateParts[1] ?? null %} + {# RÉFÉRENCE #}
- - {{ quote.ref|default('DEV-' ~ quote.id|upper) }} - - ID: #{{ quote.id }} + + {{ quote.ref|default('DEV-' ~ quote.id|upper) }} + + + {{ quote.num }} +
{# CLIENT #}
- - {{ quote.customer.surname|upper }} {{ quote.customer.name }} - + + {{ quote.customer.surname|upper }} {{ quote.customer.name }} + - {{ quote.customer.phone|default(quote.customer.email) }} - + {{ quote.customer.phone|default(quote.customer.email) }} +
{# DATE #} - - {{ quote.createa|date('d/m/Y') }} - + + {{ quote.createa|date('d/m/Y') }} + {# STATUT DYNAMIQUE #} @@ -66,7 +73,8 @@ {% set statusClasses = { 'draft': 'text-slate-400 bg-slate-500/10 border-slate-500/20', 'created_waitsign': 'text-amber-400 bg-amber-500/10 border-amber-500/20', - 'refusée': 'text-rose-400 bg-rose-500/10 border-rose-500/20', + 'wait-send': 'text-amber-400 bg-amber-500/10 border-amber-500/20', + 'refused': 'text-rose-400 bg-rose-500/10 border-rose-500/20', 'signed': 'text-emerald-400 bg-emerald-500/10 border-emerald-500/20', 'signée': 'text-emerald-400 bg-emerald-500/10 border-emerald-500/20' } %} @@ -74,21 +82,34 @@ {% set statusLabels = { 'draft': 'Brouillon', 'created_waitsign': 'Attente Signature', - 'refusée': 'Refusé', + 'wait-send': 'Envoi en cours', + 'refused': 'Refusé', 'signed': 'Signé', 'signée': 'Signé' } %} - {% set currentStatus = quote.state|lower %} - - - {% if currentStatus == 'created_waitsign' %} +
+ + {% if status == 'created_waitsign' or status == 'wait-send' %} - {% elseif currentStatus == 'signed' or currentStatus == 'signée' %} + {% elseif status == 'signed' or status == 'signée' %} + {% elseif status == 'refused' %} + {% endif %} - {{ statusLabels[currentStatus] ?? currentStatus }} - + {{ statusLabels[status] ?? status }} + + + {# AFFICHAGE RAISON REFUS #} + {% if status == 'refused' and reason %} +
+ + + +

{{ reason }}

+
+ {% endif %} +
{# MONTANT #} @@ -109,12 +130,6 @@ {{ (quote|totalQuotoHT)|number_format(2, ',', ' ') }}€
{% endif %} - - {% if quote.formule %} - - {{ quote.formule.name }} - - {% endif %}
@@ -129,9 +144,9 @@
- {# Renvoyer lien de signature #} - {% if quote.state == "created_waitsign" or quote.state == "wait-send" %} - @@ -140,71 +155,65 @@ {% endif %} - {# Modifier : Interdit si signé #} - {% if quote.state != "signed" and quote.state != "signée" %} - + {# Modifier : Interdit uniquement si signé #} + {% if status != "signed" and status != "refused" %} + {% endif %} {# PDF Conditionnel #} - {% if quote.state == "signed" or quote.state == "signée" %} + {% if status == "signed" or status == "signée" %} {# PDF Signé #} - {# Certificat Audit #} - - - + {% if quote.contrats is null %} - {# ÉTAT : AUCUN CONTRAT - BOUTON CRÉATION (BLEU) #} + {# ÉTAT : AUCUN CONTRAT #} - - - - Créer le contrat + + Contrat {% else %} - {# ÉTAT : CONTRAT EXISTANT - BOUTON ACCÈS (VERT) #} + {# ÉTAT : CONTRAT EXISTANT #} - - - - Voir le contrat + + Contrat {% endif %} {% else %} - {# PDF Brouillon #} - + {# PDF Brouillon / Attente #} + {% endif %} {# Delete : Interdit si signé #} - {% if quote.state != "signed" and quote.state != "signée" %} + {% if status != "signed" and status != "signée" %} - {% else %} -
- -
{% endif %}
{% else %} - -

Aucun devis trouvé

+ +
+ +

Aucun devis trouvé

+
{% endfor %} @@ -213,37 +222,6 @@ - {# LÉGENDE #} -
-

Légende des actions

-
-
-
- Renvoyer le lien -
-
-
- Modifier -
-
-
- Télécharger Devis Signé -
-
-
- Télécharger Certificat Audit -
-
-
- Télécharger Devis PDF -
-
-
- Supprimer -
-
-
- {# PAGINATION #} {% if quotes.getTotalItemCount is defined and quotes.getTotalItemCount > quotes.getItemNumberPerPage %}
diff --git a/templates/mails/customer/contrat_refuses.twig b/templates/mails/customer/contrat_refuses.twig new file mode 100644 index 0000000..abafc4f --- /dev/null +++ b/templates/mails/customer/contrat_refuses.twig @@ -0,0 +1,45 @@ +{% extends 'mails/base.twig' %} + +{% block content %} + + + + Le contrat de location n°{{ datas.contrat.numReservation }} a été refusé par le client {{ datas.contrat.customer.name }} {{ datas.contrat.customer.surname }}. + + + + + + + + + N° Contrat : + {{ datas.contrat.numReservation }} + + + Client : + {{ datas.contrat.customer.name }} {{ datas.contrat.customer.surname }} + + + Raison du refus : + {{ datas.raison }} + + + Date : + {{ "now"|date("d/m/Y à H:i") }} + + + + + + + + + Ce contrat est désormais marqué comme "Refusé". Veuillez vérifier le dossier client. + + + GÉRER LE CONTRAT + + + +{% endblock %}