@@ -395,13 +397,23 @@ export class FlowReserve extends HTMLAnchorElement {
const total = data.total || {};
const hasTva = total.totalTva > 0;
const promotion = data.promotion;
+ const formuleName = total.formule;
let promoHtml = '';
let originalTotalHT = total.totalHT;
+ if (formuleName) {
+ promoHtml += `
+
+ `;
+ }
+
if (promotion && total.discount > 0) {
originalTotalHT = total.totalHT + total.discount;
- promoHtml = `
+ promoHtml += `
${promotion.name} (-${promotion.percentage}%)
-${this.formatPrice(total.discount)}
@@ -460,7 +472,8 @@ export class FlowReserve extends HTMLAnchorElement {
ids,
options,
start: dates.start,
- end: dates.end
+ end: dates.end,
+ formule: sessionStorage.getItem('active_formule')
})
});
diff --git a/assets/tools/SubmitClearStorage.js b/assets/tools/SubmitClearStorage.js
new file mode 100644
index 0000000..6c58741
--- /dev/null
+++ b/assets/tools/SubmitClearStorage.js
@@ -0,0 +1,12 @@
+export class SubmitClearStorage extends HTMLFormElement {
+ constructor() {
+ super();
+ }
+
+ connectedCallback() {
+ this.addEventListener('submit', () => {
+ localStorage.clear();
+ sessionStorage.clear();
+ });
+ }
+}
diff --git a/assets/tools/UtmEvent.js b/assets/tools/UtmEvent.js
index 06b38a1..5aaf1e1 100644
--- a/assets/tools/UtmEvent.js
+++ b/assets/tools/UtmEvent.js
@@ -38,7 +38,7 @@ export class UtmAccount extends HTMLElement {
// 4. Envoi du sessionId à ton backend Symfony
if (sessionId) {
- await fetch('/reservation/umami', {
+ await fetch('/umami', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ umami_session: sessionId })
diff --git a/config/packages/nelmio_security.yaml b/config/packages/nelmio_security.yaml
index 297bbb7..d34dc83 100644
--- a/config/packages/nelmio_security.yaml
+++ b/config/packages/nelmio_security.yaml
@@ -46,6 +46,7 @@ nelmio_security:
- "https://challenges.cloudflare.com"
- "https://tools-security.esy-web.dev"
- "https://checkout.stripe.com/"
+ - "https://unpkg.com/"
frame-src:
- "'self'"
- "https://chat.esy-web.dev"
diff --git a/migrations/Version20260209123602.php b/migrations/Version20260209123602.php
new file mode 100644
index 0000000..add44e7
--- /dev/null
+++ b/migrations/Version20260209123602.php
@@ -0,0 +1,35 @@
+addSql('ALTER TABLE order_session ADD formule_id INT DEFAULT NULL');
+ $this->addSql('ALTER TABLE order_session ADD CONSTRAINT FK_263E7C9F2A68F4D1 FOREIGN KEY (formule_id) REFERENCES formules (id)');
+ $this->addSql('CREATE INDEX IDX_263E7C9F2A68F4D1 ON order_session (formule_id)');
+ }
+
+ public function down(Schema $schema): void
+ {
+ // this down() migration is auto-generated, please modify it to your needs
+ $this->addSql('ALTER TABLE order_session DROP CONSTRAINT FK_263E7C9F2A68F4D1');
+ $this->addSql('DROP INDEX IDX_263E7C9F2A68F4D1');
+ $this->addSql('ALTER TABLE order_session DROP formule_id');
+ }
+}
diff --git a/src/Controller/Dashboard/FormulesController.php b/src/Controller/Dashboard/FormulesController.php
index 0a85d4e..4f0bfc4 100644
--- a/src/Controller/Dashboard/FormulesController.php
+++ b/src/Controller/Dashboard/FormulesController.php
@@ -139,6 +139,18 @@ class FormulesController extends AbstractController
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
+ if($formule->getType() == "free") {
+ $r = $formule->getFormulesRestriction();
+ if(!$r) {
+ $r = new FormulesRestriction();
+ $r->setNbStructureMax(0);
+ $r->setNbAlimentaireMax(0);
+ $r->setNbBarhumsMax(0);
+ $r->setRestrictionConfig([]);
+ $this->em->persist($r);
+ $formule->setFormulesRestriction($r);
+ }
+ }
$this->em->persist($formule);
$this->em->flush();
@@ -341,6 +353,6 @@ class FormulesController extends AbstractController
if ($restriction && !empty($restriction->getRestrictionConfig())) {
return $restriction->getRestrictionConfig();
}
- return [['type' => 'structure', 'product' => '']];
+ return [['type' => 'structure', 'product' => '','id'=>0]];
}
}
diff --git a/src/Controller/ReserverController.php b/src/Controller/ReserverController.php
index b6951f4..535a111 100644
--- a/src/Controller/ReserverController.php
+++ b/src/Controller/ReserverController.php
@@ -4,6 +4,7 @@ namespace App\Controller;
use App\Entity\Customer;
use App\Entity\CustomerTracking;
+use App\Entity\Formules;
use App\Entity\Product;
use App\Entity\ProductReserve;
use App\Entity\Promotion;
@@ -103,6 +104,29 @@ class ReserverController extends AbstractController
$selectedOptionsMap = $sessionData['options'] ?? [];
$runningTotalHT = 0;
+ $formule = $session->getFormule();
+ $formuleConfig = [];
+ if ($formule) {
+ $restriction = $formule->getFormulesRestriction();
+ if ($restriction) {
+ $formuleConfig = $restriction->getRestrictionConfig() ?? [];
+ }
+
+ $formulaBasePrice = 0;
+ if ($duration <= 1) $formulaBasePrice = $formule->getPrice1j();
+ elseif ($duration <= 2) $formulaBasePrice = $formule->getPrice2j();
+ else $formulaBasePrice = $formule->getPrice5j();
+
+ $line = new DevisLine();
+ $line->setProduct("Formule : " . $formule->getName());
+ $line->setPriceHt($formulaBasePrice);
+ $line->setPriceHtSup(0);
+ $line->setDay(1);
+ $devis->addDevisLine($line);
+
+ $runningTotalHT += $formulaBasePrice;
+ }
+
if (!empty($ids)) {
$products = $productRepository->findBy(['id' => $ids]);
$processedProductIds = [];
@@ -110,15 +134,31 @@ class ReserverController extends AbstractController
foreach ($products as $product) {
$processedProductIds[] = $product->getId();
+ $isInFormule = false;
+ if ($formule) {
+ foreach ($formuleConfig as $c) {
+ if (($c['product'] ?? '') === $product->getName()) {
+ $isInFormule = true;
+ break;
+ }
+ }
+ }
+
$line = new DevisLine();
$line->setProduct($product->getName());
- $line->setPriceHt($product->getPriceDay());
- $line->setPriceHtSup($product->getPriceSup());
+
+ if ($formule && $isInFormule) {
+ $line->setPriceHt(0);
+ $line->setPriceHtSup(0);
+ } else {
+ $line->setPriceHt($product->getPriceDay());
+ $line->setPriceHtSup($product->getPriceSup());
+ $runningTotalHT += $product->getPriceDay() + ($product->getPriceSup() * max(0, $duration - 1));
+ }
+
$line->setDay($duration);
$devis->addDevisLine($line);
- $runningTotalHT += $product->getPriceDay() + ($product->getPriceSup() * max(0, $duration - 1));
-
if (isset($selectedOptionsMap[$product->getId()])) {
$optionIds = $selectedOptionsMap[$product->getId()];
if (!empty($optionIds)) {
@@ -377,7 +417,8 @@ class ReserverController extends AbstractController
ProductRepository $productRepository,
OptionsRepository $optionsRepository,
UploaderHelper $uploaderHelper,
- PromotionRepository $promotionRepository
+ PromotionRepository $promotionRepository,
+ FormulesRepository $formulesRepository
): Response {
$data = json_decode($request->getContent(), true);
$ids = $data['ids'] ?? [];
@@ -398,7 +439,13 @@ class ReserverController extends AbstractController
$promotions = $promotionRepository->findActivePromotions(new \DateTime());
$promotion = $promotions[0] ?? null;
- $cartData = $this->buildCartData($products, $selectedOptionsMap, $duration, $optionsRepository, $uploaderHelper, $promotion);
+ $formuleId = $data['formule'] ?? null;
+ $formule = null;
+ if ($formuleId) {
+ $formule = $formulesRepository->find($formuleId);
+ }
+
+ $cartData = $this->buildCartData($products, $selectedOptionsMap, $duration, $optionsRepository, $uploaderHelper, $promotion, $formule);
return new JsonResponse([
'start_date' => $startStr,
@@ -407,12 +454,13 @@ class ReserverController extends AbstractController
'options' => $cartData['rootOptions'],
'unavailable_products_ids' => $removedIds,
'total' => $cartData['total'],
- 'promotion' => $promotion ? ['name' => $promotion->getName(), 'percentage' => $promotion->getPercentage()] : null
+ 'promotion' => $promotion ? ['name' => $promotion->getName(), 'percentage' => $promotion->getPercentage()] : null,
+ 'formule' => $formule ? ['name' => $formule->getName()] : null
]);
}
#[Route('/session', name: 'reservation_session_create', methods: ['POST'])]
- public function createSession(Request $request, EntityManagerInterface $em, OrderSessionRepository $sessionRepository, PromotionRepository $promotionRepository): Response
+ public function createSession(Request $request, EntityManagerInterface $em, OrderSessionRepository $sessionRepository, PromotionRepository $promotionRepository, FormulesRepository $formulesRepository, ProductRepository $productRepository): Response
{
$data = json_decode($request->getContent(), true);
$existingUuid = $request->getSession()->get('order_session_uuid');
@@ -442,6 +490,65 @@ class ReserverController extends AbstractController
$session->setPromotion(null);
}
+ $formuleId = $data['formule'] ?? null;
+ if ($formuleId) {
+ $formule = $formulesRepository->find($formuleId);
+ if ($formule) {
+ // --- DURATION CHECK ---
+ $startStr = $data['start'] ?? null;
+ $endStr = $data['end'] ?? null;
+ $duration = $this->calculateDuration($startStr, $endStr);
+
+ if ($duration > 5) {
+ return new JsonResponse(['error' => "Impossible d'ajouter cette formule : la durée de réservation excède 5 jours."], Response::HTTP_BAD_REQUEST);
+ }
+
+ // --- SECURITY CHECK ---
+ $restriction = $formule->getFormulesRestriction();
+ if ($restriction) {
+ $ids = $data['ids'] ?? [];
+ if (!empty($ids)) {
+ $products = $productRepository->findBy(['id' => $ids]);
+ $config = $restriction->getRestrictionConfig() ?? [];
+
+ $counts = ['structure' => 0, 'alimentaire' => 0, 'barhnums' => 0];
+
+ foreach ($products as $product) {
+ $pName = $product->getName();
+ $type = null;
+ foreach ($config as $c) {
+ if (($c['product'] ?? '') === $pName) {
+ $type = $c['type'] ?? null;
+ break;
+ }
+ }
+
+ if ($type === 'structure') {
+ $counts['structure']++;
+ } elseif ($type === 'alimentaire') {
+ $counts['alimentaire']++;
+ } elseif ($type) {
+ // Only count if type is defined in config (meaning it's part of the formula)
+ $counts['barhnums']++;
+ }
+ // Products not in the formula config are considered "extras" and allowed.
+ }
+
+ if ($counts['structure'] > $restriction->getNbStructureMax()) {
+ return new JsonResponse(['error' => "Le nombre maximum de structures est dépassé ({$restriction->getNbStructureMax()})."], Response::HTTP_BAD_REQUEST);
+ }
+ if ($counts['alimentaire'] > $restriction->getNbAlimentaireMax()) {
+ return new JsonResponse(['error' => "Le nombre maximum d'éléments alimentaires est dépassé ({$restriction->getNbAlimentaireMax()})."], Response::HTTP_BAD_REQUEST);
+ }
+ if ($counts['barhnums'] > $restriction->getNbBarhumsMax()) {
+ return new JsonResponse(['error' => "Le nombre maximum de barnums/mobilier est dépassé ({$restriction->getNbBarhumsMax()})."], Response::HTTP_BAD_REQUEST);
+ }
+ }
+ }
+ $session->setFormule($formule);
+ }
+ }
+
$user = $this->getUser();
if ($user instanceof Customer) {
$session->setCustomer($user);
@@ -531,7 +638,9 @@ class ReserverController extends AbstractController
$promotion->setPercentage($promoData['percentage']);
}
- $cartData = $this->buildCartData($products, $selectedOptionsMap, $duration, $optionsRepository, $uploaderHelper, $promotion);
+ $formule = $session->getFormule();
+
+ $cartData = $this->buildCartData($products, $selectedOptionsMap, $duration, $optionsRepository, $uploaderHelper, $promotion, $formule);
// --- Calcul Frais de Livraison ---
$deliveryData = $this->calculateDelivery(
@@ -554,6 +663,7 @@ class ReserverController extends AbstractController
'totalTTC' => $cartData['total']['totalTTC'],
'discount' => $cartData['total']['discount'],
'promotion' => $cartData['total']['promotion'],
+ 'formule' => $cartData['total']['formule'],
'tvaEnabled' => $cartData['tvaEnabled'],
],
'delivery' => $deliveryData
@@ -633,7 +743,9 @@ class ReserverController extends AbstractController
$promotion->setPercentage($promoData['percentage']);
}
- $cartData = $this->buildCartData($products, $selectedOptionsMap, $duration, $optionsRepository, $uploaderHelper, $promotion);
+ $formule = $session->getFormule();
+
+ $cartData = $this->buildCartData($products, $selectedOptionsMap, $duration, $optionsRepository, $uploaderHelper, $promotion, $formule);
return $this->render('revervation/flow.twig', [
'session' => $session,
@@ -650,6 +762,7 @@ class ReserverController extends AbstractController
'totalTTC' => $cartData['total']['totalTTC'],
'discount' => $cartData['total']['discount'],
'promotion' => $cartData['total']['promotion'],
+ 'formule' => $cartData['total']['formule'],
'tvaEnabled' => $cartData['tvaEnabled'],
]
]);
@@ -1209,15 +1322,24 @@ class ReserverController extends AbstractController
return $result;
}
- private function buildCartData(array $products, array $selectedOptionsMap, int $duration, OptionsRepository $optionsRepository, UploaderHelper $uploaderHelper, ?Promotion $promotion = null): array
+ private function buildCartData(array $products, array $selectedOptionsMap, int $duration, OptionsRepository $optionsRepository, UploaderHelper $uploaderHelper, ?Promotion $promotion = null, ?Formules $formule = null): array
{
$items = [];
$rootOptions = [];
$totalHT = 0;
+ $formulaExtras = 0;
$tvaEnabled = $this->isTvaEnabled();
$tvaRate = $tvaEnabled ? 0.20 : 0;
$processedProductIds = [];
+ $formuleConfig = [];
+ if ($formule) {
+ $restriction = $formule->getFormulesRestriction();
+ if ($restriction) {
+ $formuleConfig = $restriction->getRestrictionConfig() ?? [];
+ }
+ }
+
foreach ($products as $product) {
$processedProductIds[] = $product->getId();
$price1Day = $product->getPriceDay();
@@ -1247,7 +1369,11 @@ class ReserverController extends AbstractController
$optionsTotalHT += $optPrice;
} else {
$rootOptions[] = $optData;
- $totalHT += $optPrice;
+ if ($formule) {
+ $formulaExtras += $optPrice;
+ } else {
+ $totalHT += $optPrice;
+ }
}
}
}
@@ -1256,22 +1382,41 @@ class ReserverController extends AbstractController
$productTotalHT += $optionsTotalHT;
$productTotalTTC = $productTotalHT * (1 + $tvaRate);
+ $isInFormule = false;
+ if ($formule) {
+ foreach ($formuleConfig as $c) {
+ if (($c['product'] ?? '') === $product->getName()) {
+ $isInFormule = true;
+ break;
+ }
+ }
+ }
+
+ if ($formule) {
+ if ($isInFormule) {
+ $formulaExtras += $optionsTotalHT;
+ } else {
+ $formulaExtras += $productTotalHT;
+ }
+ } else {
+ $totalHT += $productTotalHT;
+ }
+
$items[] = [
- 'id' => $product->getId(), // Ensure ID is present for basketJson
+ 'id' => $product->getId(),
'name' => $product->getName(),
- 'product' => $product, // Kept for twig compatibility if needed
+ 'product' => $product,
'image' => $uploaderHelper->asset($product, 'imageFile'),
- 'priceHt1Day' => $price1Day, // For basketJson
- 'priceHTSupDay' => $priceSup, // For basketJson
+ 'priceHt1Day' => $price1Day,
+ 'priceHTSupDay' => $priceSup,
'priceTTC1Day' => $price1Day * (1 + $tvaRate),
- 'price1Day' => $price1Day, // For flow template
- 'priceSup' => $priceSup, // For flow template
+ 'price1Day' => $price1Day,
+ 'priceSup' => $priceSup,
'totalPriceHT' => $productTotalHT,
'totalPriceTTC' => $productTotalTTC,
- 'options' => $productOptions
+ 'options' => $productOptions,
+ 'in_formule' => $isInFormule
];
-
- $totalHT += $productTotalHT;
}
// Traiter les options orphelines
@@ -1286,11 +1431,28 @@ class ReserverController extends AbstractController
'price' => $optPrice,
'orphan_product_id' => $prodId
];
- $totalHT += $optPrice;
+ if ($formule) {
+ $formulaExtras += $optPrice;
+ } else {
+ $totalHT += $optPrice;
+ }
}
}
}
+ if ($formule) {
+ $formulaBasePrice = 0;
+ if ($duration <= 1) {
+ $formulaBasePrice = $formule->getPrice1j();
+ } elseif ($duration <= 2) {
+ $formulaBasePrice = $formule->getPrice2j();
+ } else {
+ $formulaBasePrice = $formule->getPrice5j();
+ }
+
+ $totalHT = $formulaBasePrice + $formulaExtras;
+ }
+
$discountAmount = 0;
if ($promotion) {
$discountAmount = $totalHT * ($promotion->getPercentage() / 100);
@@ -1308,7 +1470,8 @@ class ReserverController extends AbstractController
'totalTva' => $totalTva,
'totalTTC' => $totalTTC,
'discount' => $discountAmount,
- 'promotion' => $promotion ? $promotion->getName() : null
+ 'promotion' => $promotion ? $promotion->getName() : null,
+ 'formule' => $formule ? $formule->getName() : null
],
'tvaEnabled' => $tvaEnabled
];
diff --git a/src/Controller/Webhooks.php b/src/Controller/Webhooks.php
index 262e0a8..1820704 100644
--- a/src/Controller/Webhooks.php
+++ b/src/Controller/Webhooks.php
@@ -76,6 +76,26 @@ class Webhooks extends AbstractController
if ($pl->getType() === 'accompte' && $contrat->isSigned()) {
$contrat->setReservationState('ready');
$entityManager->persist($contrat);
+
+ // Send email to Prestataire
+ $prestataire = $contrat->getPrestataire();
+ if ($prestataire) {
+ $dateStart = $contrat->getDateAt()->format('d/m/Y');
+ $dateEnd = $contrat->getEndAt()->format('d/m/Y');
+
+ $mailer->send(
+ $prestataire->getEmail(),
+ $prestataire->getSurname() . ' ' . $prestataire->getName(),
+ "Nouveau contrat attribué - " . $contrat->getNumReservation(),
+ "mails/prestataire/new_contrat.twig",
+ [
+ 'contrat' => $contrat,
+ 'prestataire' => $prestataire,
+ 'dateStart' => $dateStart,
+ 'dateEnd' => $dateEnd
+ ]
+ );
+ }
}
$entityManager->flush();
diff --git a/src/Entity/Formules.php b/src/Entity/Formules.php
index a67b724..248ec25 100644
--- a/src/Entity/Formules.php
+++ b/src/Entity/Formules.php
@@ -134,9 +134,11 @@ class Formules
/**
* @param \DateTimeImmutable|null $updatedAt
*/
- public function setUpdatedAt(?\DateTimeImmutable $updatedAt): void
+ public function setUpdatedAt(?\DateTimeImmutable $updatedAt): static
{
$this->updatedAt = $updatedAt;
+
+ return $this;
}
/**
diff --git a/src/Entity/OrderSession.php b/src/Entity/OrderSession.php
index f09f335..b6a12b4 100644
--- a/src/Entity/OrderSession.php
+++ b/src/Entity/OrderSession.php
@@ -93,6 +93,9 @@ class OrderSession
#[ORM\Column(type: Types::JSON, nullable: true)]
private ?array $promotion = null;
+ #[ORM\ManyToOne(targetEntity: Formules::class)]
+ private ?Formules $formule = null;
+
#[ORM\OneToOne(mappedBy: 'orderSession', cascade: ['persist', 'remove'])]
private ?Devis $devis = null;
@@ -469,4 +472,16 @@ class OrderSession
return $this;
}
+
+ public function getFormule(): ?Formules
+ {
+ return $this->formule;
+ }
+
+ public function setFormule(?Formules $formule): static
+ {
+ $this->formule = $formule;
+
+ return $this;
+ }
}
diff --git a/src/Service/Pdf/DevisPdfService.php b/src/Service/Pdf/DevisPdfService.php
index 50638b7..1ead686 100644
--- a/src/Service/Pdf/DevisPdfService.php
+++ b/src/Service/Pdf/DevisPdfService.php
@@ -173,10 +173,10 @@ class DevisPdfService extends Fpdf
$this->SetXY(80, $currentY);
$this->SetFont('Arial', '', 8);
$this->Cell(15, 10, $nbDays, 'LRB', 0, 'C');
- $this->Cell(25, 10, number_format($price1Day, 2, ',', ' ') . $this->euro(), 'RB', 0, 'R');
- $this->Cell(25, 10, number_format($priceSupHT, 2, ',', ' ') . $this->euro(), 'RB', 0, 'R');
+ $this->Cell(25, 10, ($price1Day == 0 ? "Inclus" : number_format($price1Day, 2, ',', ' ') . $this->euro()), 'RB', 0, 'R');
+ $this->Cell(25, 10, ($price1Day == 0 ? "-" : number_format($priceSupHT, 2, ',', ' ') . $this->euro()), 'RB', 0, 'R');
$this->Cell(15, 10, $tvaLabel, 'RB', 0, 'C');
- $this->Cell(40, 10, number_format($lineTotalHT, 2, ',', ' ') . $this->euro(), 'RB', 1, 'R');
+ $this->Cell(40, 10, ($lineTotalHT == 0 && $price1Day == 0 ? "Inclus" : number_format($lineTotalHT, 2, ',', ' ') . $this->euro()), 'RB', 1, 'R');
$this->Line(10, $currentY, 10, $currentY + 10);
$this->Line(10, $currentY + 10, 80, $currentY + 10);
diff --git a/src/Twig/StripeExtension.php b/src/Twig/StripeExtension.php
index 663c777..9890070 100644
--- a/src/Twig/StripeExtension.php
+++ b/src/Twig/StripeExtension.php
@@ -48,6 +48,7 @@ class StripeExtension extends AbstractExtension
$p = $this->em->getRepository(Product::class)->findOneBy(['name' => $name]);
return [
+ 'id' => $p->getId(),
'name' => $p->getName(),
'image' => $this->uploaderHelper->asset($p,'imageFile'),
];
@@ -276,7 +277,7 @@ class StripeExtension extends AbstractExtension
$sessionData = $session->getProducts();
$ids = $sessionData['ids'] ?? [];
$selectedOptionsMap = $sessionData['options'] ?? [];
-
+
$startStr = $sessionData['start'] ?? null;
$endStr = $sessionData['end'] ?? null;
@@ -294,15 +295,39 @@ class StripeExtension extends AbstractExtension
}
$totalHT = 0;
+ $formulaExtras = 0;
$productRepo = $this->em->getRepository(Product::class);
$optionsRepo = $this->em->getRepository(Options::class);
+ $formule = $session->getFormule();
+ $config = [];
+ if ($formule && ($restrict = $formule->getFormulesRestriction())) {
+ $config = $restrict->getRestrictionConfig() ?? [];
+ }
+
// Products
foreach ($ids as $id) {
$product = $productRepo->find($id);
if ($product) {
$price = $product->getPriceDay() + ($product->getPriceSup() * max(0, $duration - 1));
- $totalHT += $price;
+
+ $isInFormule = false;
+ if ($formule) {
+ foreach ($config as $c) {
+ if (($c['product'] ?? '') === $product->getName()) {
+ $isInFormule = true;
+ break;
+ }
+ }
+ }
+
+ if ($formule) {
+ if (!$isInFormule) {
+ $formulaExtras += $price;
+ }
+ } else {
+ $totalHT += $price;
+ }
}
}
@@ -311,15 +336,38 @@ class StripeExtension extends AbstractExtension
foreach ($optIds as $optId) {
$option = $optionsRepo->find($optId);
if ($option) {
- $totalHT += $option->getPriceHt();
+ if ($formule) {
+ $formulaExtras += $option->getPriceHt();
+ } else {
+ $totalHT += $option->getPriceHt();
+ }
}
}
}
+ if ($formule) {
+ $formulaBasePrice = 0;
+ if ($duration <= 1) $formulaBasePrice = $formule->getPrice1j();
+ elseif ($duration <= 2) $formulaBasePrice = $formule->getPrice2j();
+ else $formulaBasePrice = $formule->getPrice5j();
+
+ $totalHT = $formulaBasePrice + $formulaExtras;
+ }
+
+ $originalHT = $totalHT;
+ $discountAmount = 0;
+
+ if ($promo = $session->getPromotion()) {
+ $discountAmount = $totalHT * ($promo['percentage'] / 100);
+ $totalHT -= $discountAmount;
+ }
+
$tvaEnabled = isset($_ENV['TVA_ENABLED']) && $_ENV['TVA_ENABLED'] === "true";
return [
'ht' => $totalHT,
+ 'originalHT' => $originalHT,
+ 'discount' => $discountAmount,
'duration' => $duration,
'tvaEnabled' => $tvaEnabled
];
diff --git a/templates/dashboard/flow/view.twig b/templates/dashboard/flow/view.twig
index c6e0a4d..4c7b9ca 100644
--- a/templates/dashboard/flow/view.twig
+++ b/templates/dashboard/flow/view.twig
@@ -9,7 +9,7 @@
crossorigin=""/>
+ crossorigin="" nonce="{{ csp_nonce('script') }}">
@@ -55,12 +55,12 @@
-
-
@@ -167,7 +167,7 @@
{% if session.deliveryDistance is not null %}
Détails Livraison
-
+
{# Map #}
{% if session.deliveryGeometry %}
@@ -219,6 +219,18 @@
Contenu de la demande
+ {% if session.formule %}
+
+
+
+
Formule appliquée
+
{{ session.formule.name }}
+
+
+ {% endif %}
+
{% if session.products['start'] is defined and session.products['end'] is defined %}
@@ -329,6 +341,16 @@
{% set totalData = totalSession(session) %}
+ {% if session.promotion %}
+
+ Promotion : {{ session.promotion.name }}
+ -{{ session.promotion.percentage }}%
+
+
+ {{ totalData.originalHT|number_format(2, ',', ' ') }} € HT
+
+ {% endif %}
+
Durée : {{ totalData.duration }} jour{{ totalData.duration > 1 ? 's' : '' }}
diff --git a/templates/dashboard/formules/config-free.twig b/templates/dashboard/formules/config-free.twig
index 1b4b491..9f06b3f 100644
--- a/templates/dashboard/formules/config-free.twig
+++ b/templates/dashboard/formules/config-free.twig
@@ -63,7 +63,7 @@