diff --git a/migrations/Version20260127075804.php b/migrations/Version20260127075804.php new file mode 100644 index 0000000..8abc511 --- /dev/null +++ b/migrations/Version20260127075804.php @@ -0,0 +1,36 @@ +addSql('ALTER TABLE product ADD dim_h DOUBLE PRECISION DEFAULT NULL'); + $this->addSql('ALTER TABLE product ADD dim_p DOUBLE PRECISION DEFAULT NULL'); + $this->addSql('ALTER TABLE product RENAME COLUMN installation TO dim_w'); + } + + 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 product DROP dim_h'); + $this->addSql('ALTER TABLE product DROP dim_p'); + $this->addSql('ALTER TABLE product RENAME COLUMN dim_w TO installation'); + } +} diff --git a/src/Entity/Product.php b/src/Entity/Product.php index f13a1be..deb8408 100644 --- a/src/Entity/Product.php +++ b/src/Entity/Product.php @@ -78,6 +78,15 @@ class Product #[ORM\OneToMany(targetEntity: ProductDoc::class, mappedBy: 'product')] private Collection $productDocs; + #[ORM\Column] + private ?float $dimW = null; + + #[ORM\Column(nullable: true)] + private ?float $dimH = null; + + #[ORM\Column(nullable: true)] + private ?float $dimP = null; + public function __construct() { $this->devisLines = new ArrayCollection(); @@ -354,4 +363,40 @@ class Product return $this; } + + public function getDimW(): ?float + { + return $this->dimW; + } + + public function setDimW(float $dimW): static + { + $this->dimW = $dimW; + + return $this; + } + + public function getDimH(): ?float + { + return $this->dimH; + } + + public function setDimH(?float $dimH): static + { + $this->dimH = $dimH; + + return $this; + } + + public function getDimP(): ?float + { + return $this->dimP; + } + + public function setDimP(?float $dimP): static + { + $this->dimP = $dimP; + + return $this; + } } diff --git a/src/Form/ProductType.php b/src/Form/ProductType.php index 50052d2..891adb8 100644 --- a/src/Form/ProductType.php +++ b/src/Form/ProductType.php @@ -59,6 +59,22 @@ class ProductType extends AbstractType 'required' => true, 'html5' => true, ]) + + ->add('dimW',NumberType::class,[ + 'label' => 'Largeur', + 'required' => true, + 'html5' => true, + ]) + ->add('dimP',NumberType::class,[ + 'label' => 'Longeur', + 'required' => true, + 'html5' => true, + ]) + ->add('dimH',NumberType::class,[ + 'label' => 'Hauteur', + 'required' => true, + 'html5' => true, + ]) ->add('imageFile',FileType::class,[ 'label' => 'Image du produit', 'required' => false, diff --git a/templates/dashboard/products/add.twig b/templates/dashboard/products/add.twig index 1da5ca8..98e5ec9 100644 --- a/templates/dashboard/products/add.twig +++ b/templates/dashboard/products/add.twig @@ -108,6 +108,48 @@ {% endif %} + {# 02. DIMENSIONS DU PRODUIT #} +
+

+ 02 + Dimensions de la Structure +

+ +
+ {# Largeur #} +
+ {{ form_label(form.dimW, 'Largeur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }} +
+
+ W +
+ {{ form_widget(form.dimW, {'attr': {'placeholder': '0.00', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 pl-10 pr-5'}}) }} +
+
+ + {# Longueur #} +
+ {{ form_label(form.dimP, 'Longueur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }} +
+
+ L +
+ {{ form_widget(form.dimP, {'attr': {'placeholder': '0.00', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 pl-10 pr-5'}}) }} +
+
+ + {# Hauteur #} +
+ {{ form_label(form.dimH, 'Hauteur (m)', {'label_attr': {'class': 'text-[10px] font-black text-slate-500 uppercase tracking-[0.2em] ml-1 mb-2 block'}}) }} +
+
+ H +
+ {{ form_widget(form.dimH, {'attr': {'placeholder': '0.00', 'class': 'w-full bg-slate-900/50 border-white/5 rounded-2xl text-white font-mono focus:ring-blue-500/20 focus:border-blue-500 transition-all py-3.5 pl-10 pr-5'}}) }} +
+
+
+
{# COLONNE DROITE : TARIFICATION #} diff --git a/templates/revervation/produit.twig b/templates/revervation/produit.twig index cf5c21d..9f461cd 100644 --- a/templates/revervation/produit.twig +++ b/templates/revervation/produit.twig @@ -8,33 +8,30 @@ Tarif : {{ product.priceDay }}€/jour. Installation et livraison dans l'Aisne (02). {{ product.description|striptags|slice(0, 130) }}... Réservez votre date ! {% endblock %} + {% block jsonld %} {% endblock %} + {% block breadcrumb_json %} ,{ "@type": "ListItem", @@ -50,7 +47,6 @@ {% endblock %} {% block body %} - {# --- TRACKING ÉVÉNEMENT --- #}
@@ -81,19 +77,19 @@ {# --- COLONNE GAUCHE : VISUEL --- #}
-
+
{% if product.imageName %} {{ product.name }} + class="w-full h-full object-contain p-4 md:p-8"> {% else %}
- Ludik Event + Ludik Event
{% endif %} -
- +
+ {{ product.category }}
@@ -102,191 +98,182 @@ {# --- COLONNE DROITE : CONTENU --- #}
-
- +
+ Référence : {{ product.ref }} -

+

{{ product.name }}

-
+
{# Prix principal #} -
- {{ product.priceDay }}€ - La première journée +
+ {{ product.priceDay }}€ + La première journée
- {# Prix supplémentaire #} -
- + {{ product.priceSup }}€ - Par journée supplémentaire -
-
- {{ product.caution }}€ - LA CAUTION + {# Grille de badges Tarifs/Caution #} +
+
+ + {{ product.priceSup }}€ + Jour supplémentaire +
+
+ {{ product.caution }}€ + LA CAUTION +
-
+ {# Message Caution Stripe #} +
-

+

Caution - Cette somme sera prélevée et pourra être bloquée pour un maximum de 4 jours selon les politiques de Stripe. -

+ Cette somme sera prélevée sur votre compte bancaire et pourra être bloquée pour un maximum de 4 jours selon les politiques de Stripe.

{# --- DESCRIPTION --- #} -
+
{{ product.description|raw }}
-
-
- {# Badge Âge #} -
- Âge conseillé - {{ product.category }} -
- - {# SÉLECTEUR DE PÉRIODE --- #} -