diff --git a/migrations/Version20260128085506.php b/migrations/Version20260128085506.php new file mode 100644 index 0000000..ec5fb4b --- /dev/null +++ b/migrations/Version20260128085506.php @@ -0,0 +1,38 @@ +addSql('ALTER TABLE formules ADD price1j DOUBLE PRECISION DEFAULT NULL'); + $this->addSql('ALTER TABLE formules ADD price2j DOUBLE PRECISION DEFAULT NULL'); + $this->addSql('ALTER TABLE formules ADD price5j DOUBLE PRECISION DEFAULT NULL'); + $this->addSql('ALTER TABLE formules ADD caution DOUBLE PRECISION DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE formules DROP price1j'); + $this->addSql('ALTER TABLE formules DROP price2j'); + $this->addSql('ALTER TABLE formules DROP price5j'); + $this->addSql('ALTER TABLE formules DROP caution'); + } +} diff --git a/src/Controller/Dashboard/FormulesController.php b/src/Controller/Dashboard/FormulesController.php index 18fa8ba..b78efe5 100644 --- a/src/Controller/Dashboard/FormulesController.php +++ b/src/Controller/Dashboard/FormulesController.php @@ -98,16 +98,15 @@ class FormulesController extends AbstractController ]); } - #[Route(path: '/crm/formules/{id}', name: 'app_crm_formules_view', methods: ['GET'])] - public function formulesView(?Formules $formules,Request $request,EntityManagerInterface $entityManager, AppLogger $appLogger): Response + #[Route(path: '/crm/formules/{id}', name: 'app_crm_formules_view', methods: ['GET', 'POST'])] + public function formulesView(?Formules $formules, Request $request, EntityManagerInterface $entityManager, AppLogger $appLogger): Response { if (!$formules instanceof Formules) { $this->addFlash('error', 'Formule introuvable.'); return $this->redirectToRoute('app_crm_formules'); } - $appLogger->record('VIEW', 'Consultation page formule ' . $formules->getName()); - + // 1. GESTION DU STATUT (Toggle Publish) if ($request->get('act') === 'togglePublish') { $status = $request->get('status') === 'true'; $formules->setIsPublish($status); @@ -119,15 +118,39 @@ class FormulesController extends AbstractController return $this->redirectToRoute('app_crm_formules_view', ['id' => $formules->getId()]); } - $form = $this->createForm(FormulesType::class,$formules); + // 2. GESTION DES PRIX (Formulaire Manuel price[]) + // On vérifie si le tableau 'price' existe dans la requête POST + if ($request->isMethod('POST') && $request->request->has('price')) { + $prices = $request->request->all('price'); + + // Mapping manuel des champs du tableau HTML vers l'entité + $formules->setPrice1j($prices['1j'] ?? $formules->getPrice1j()); + $formules->setPrice2j($prices['2j'] ?? $formules->getPrice2j()); + $formules->setPrice5j($prices['5j'] ?? $formules->getPrice5j()); + $formules->setCaution($prices['caution'] ?? $formules->getCaution()); + + $entityManager->flush(); + + $appLogger->record('UPDATE', "Mise à jour des tarifs pour : " . $formules->getName()); + $this->addFlash("success", "Les tarifs ont été mis à jour."); + + return $this->redirectToRoute('app_crm_formules_view', ['id' => $formules->getId()]); + } + + // 3. GESTION DU FORMULAIRE CLASSIQUE (Symfony Form) + $form = $this->createForm(FormulesType::class, $formules); $form->handleRequest($request); + if ($form->isSubmitted() && $form->isValid()) { $entityManager->persist($formules); $entityManager->flush(); - $appLogger->record('CREATED', "Modification de la formule : " . $formules->getName()); - $this->addFlash("success", "La formule a été modifié avec succès."); - return $this->redirectToRoute('app_crm_formules_view',['id'=>$formules->getId()]); + + $appLogger->record('UPDATE', "Modification de la formule (infos) : " . $formules->getName()); + $this->addFlash("success", "La formule a été modifiée avec succès."); + + return $this->redirectToRoute('app_crm_formules_view', ['id' => $formules->getId()]); } + return $this->render('dashboard/formules/view.twig', [ 'formule' => $formules, 'form' => $form->createView(), diff --git a/src/Controller/ReserverController.php b/src/Controller/ReserverController.php index 1759def..ac67b8a 100644 --- a/src/Controller/ReserverController.php +++ b/src/Controller/ReserverController.php @@ -13,6 +13,7 @@ use App\Form\RequestPasswordRequestType; use App\Logger\AppLogger; use App\Repository\CustomerRepository; use App\Repository\CustomerTrackingRepository; +use App\Repository\FormulesRepository; use App\Repository\ProductRepository; use App\Service\Mailer\Mailer; use App\Service\ResetPassword\Event\ResetPasswordConfirmEvent; @@ -56,11 +57,13 @@ class ReserverController extends AbstractController ]); } #[Route('/reservation', name: 'reservation')] - public function revervation(ProductRepository $productRepository): Response + public function revervation(FormulesRepository $formulesRepository,ProductRepository $productRepository): Response { $products =$productRepository->findBy([], ['updatedAt' => 'DESC'],3); + $formules =$formulesRepository->findBy(['isPublish'=>true], ['updatedAt' => 'DESC'],3); return $this->render('revervation/home.twig',[ - 'products' => $products + 'products' => $products, + 'formules' => $formules, ]); } #[Route('/reservation/web-vitals', name: 'reservation_web-vitals', methods: ['POST'])] @@ -148,6 +151,13 @@ class ReserverController extends AbstractController return $this->render('revervation/formules.twig',[ ]); } + #[Route('/reservation/formules/{slug}', name: 'reservation_formule_show')] + public function revervationView(): Response + { + + return $this->render('revervation/formules.twig',[ + ]); + } #[Route('/reservation/comment-reserver', name: 'reservation_workflow')] public function revervationWorkfkow(): Response { diff --git a/src/Entity/Formules.php b/src/Entity/Formules.php index aa10289..1f7ff04 100644 --- a/src/Entity/Formules.php +++ b/src/Entity/Formules.php @@ -3,6 +3,7 @@ namespace App\Entity; use App\Repository\FormulesRepository; +use Cocur\Slugify\Slugify; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; @@ -50,6 +51,18 @@ class Formules #[ORM\Column(type: Types::TEXT, nullable: true)] private ?string $description = null; + #[ORM\Column(nullable: true)] + private ?float $price1j = null; + + #[ORM\Column(nullable: true)] + private ?float $price2j = null; + + #[ORM\Column(nullable: true)] + private ?float $price5j = null; + + #[ORM\Column(nullable: true)] + private ?float $caution = null; + public function __construct() { $this->formulesProductIncluses = new ArrayCollection(); @@ -202,4 +215,59 @@ class Formules return $this; } + + public function getPrice1j(): ?float + { + return $this->price1j; + } + + public function setPrice1j(?float $price1j): static + { + $this->price1j = $price1j; + + return $this; + } + + public function getPrice2j(): ?float + { + return $this->price2j; + } + + public function setPrice2j(?float $price2j): static + { + $this->price2j = $price2j; + + return $this; + } + + public function getPrice5j(): ?float + { + return $this->price5j; + } + + public function setPrice5j(?float $price5j): static + { + $this->price5j = $price5j; + + return $this; + } + + public function getCaution(): ?float + { + return $this->caution; + } + + public function setCaution(?float $caution): static + { + $this->caution = $caution; + + return $this; + } + + public function slug() + { + $s = new Slugify(); + return $this->id."-".$s->slugify($this->name); + + } } diff --git a/templates/dashboard/formules.twig b/templates/dashboard/formules.twig index fd39883..919b76f 100644 --- a/templates/dashboard/formules.twig +++ b/templates/dashboard/formules.twig @@ -77,9 +77,25 @@ {# TARIF #} - -
- {{ formule.price|default('0.00') }} € + +
+ {# 1 JOUR #} +
+ 1J + {{ formule.price1j|default('0') }}€ +
+ + {# 2 JOURS #} +
+ 2J + {{ formule.price2j|default('0') }}€ +
+ + {# 5 JOURS #} +
+ 5J + {{ formule.price5j|default('0') }}€ +
diff --git a/templates/dashboard/formules/config-pack.twig b/templates/dashboard/formules/config-pack.twig index ce0297b..81697f5 100644 --- a/templates/dashboard/formules/config-pack.twig +++ b/templates/dashboard/formules/config-pack.twig @@ -1,3 +1,71 @@ -// add line for price + caution -// add line for product include in pack -// add line for options include in pack +{# SECTION 03 : FORMULAIRE TARIFICATION (AUTONOME) #} +
+ + {# Ligne décorative émeraude pour le "Money" #} +
+ +
+

+ 03 + Grille Tarifaire & Caution +

+ + {# Badge de rappel du type #} + + Tarification dégressive + +
+ +
+ {# Prix 1 Jour #} +
+ +
+ + +
+
+ + {# Prix 2 Jours #} +
+ +
+ + +
+
+ + {# Prix 5 Jours #} +
+ +
+ + +
+
+ + {# Caution #} +
+ +
+ + +
+
+
+ + {# Bouton de sauvegarde spécifique aux prix #} +
+ +
+
diff --git a/templates/dashboard/formules/view.twig b/templates/dashboard/formules/view.twig index 8b4bdca..940513f 100644 --- a/templates/dashboard/formules/view.twig +++ b/templates/dashboard/formules/view.twig @@ -128,6 +128,7 @@ {{ form_end(form) }}
+ {% include 'dashboard/formules/config-'~formule.type~".twig" %} + - {% include 'dashboard/formules/config-'~formule.type~".twig" %} {% endblock %} diff --git a/templates/revervation/home.twig b/templates/revervation/home.twig index fbcf491..2f28c51 100644 --- a/templates/revervation/home.twig +++ b/templates/revervation/home.twig @@ -154,7 +154,7 @@ {% if product.category == "barnums" %}

Week-End

{% else %} -

Jour

+

Jour

{% endif %}

Dès {{ product.priceDay|format_currency('EUR') }} @@ -202,11 +202,72 @@ +

- {# Message si aucun produit (Correction contraste) #} -
-

Le formules est en cours de mise à jour...

-
+ {% for formule in formules %} +
+ + {# Conteneur Image #} +
+ + {# Utilisation du champ imageName de la formule #} + {% if formule.imageName and formule.imageName != "" %} + {{ formule.name }} + {% else %} +
+ Image par défaut +
+ {% endif %} + + {# Badge Type de Formule (ex: PACK) #} +
+

+ {{ formule.type|default('Pack') }} +

+
+
+ + {# Infos Formule #} +
+
+

+ {{ formule.name }} +

+
+ + {# Section Tarifs dégressifs #} +
+
+

1 Jour

+

{{ formule.price1j|format_currency('EUR') }}

+
+
+

2 Jours

+

{{ formule.price2j|format_currency('EUR') }}

+
+
+

5 Jours

+

{{ formule.price5j|format_currency('EUR') }}

+
+
+ + +
+
+ {% else %} +
+

Les formules sont en cours de mise à jour...

+
+ {% endfor %}