diff --git a/migrations/Version20260213134522.php b/migrations/Version20260213134522.php new file mode 100644 index 0000000..1e4b9c5 --- /dev/null +++ b/migrations/Version20260213134522.php @@ -0,0 +1,31 @@ +addSql('CREATE TABLE category (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY (id))'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP TABLE category'); + } +} diff --git a/src/Controller/Dashboard/CategoryController.php b/src/Controller/Dashboard/CategoryController.php new file mode 100644 index 0000000..6597ffe --- /dev/null +++ b/src/Controller/Dashboard/CategoryController.php @@ -0,0 +1,92 @@ + false], methods: ['GET'])] + public function index( + CategoryRepository $categoryRepository, + PaginatorInterface $paginator, + Request $request + ): Response { + $this->appLogger->record('VIEW', 'Consultation de la page de catégorie'); + + foreach (['2-7 Ans','3-15 Ans','3-99 Ans','Barnums','Alimentaire','Options'] as $catName) { + $cat = $categoryRepository->findOneBy(['name'=>$catName]); + if(!$cat instanceof Category) { + $cat = new Category(); + $cat->setName($catName); + $this->em->persist($cat); + } + $this->em->flush(); + } + + return $this->render('dashboard/category/list.twig', [ + 'categorys' => $categoryRepository->findAll(), + ]); + } + + #[Route('/add', name: 'app_crm_category_add', options: ['sitemap' => false], methods: ['GET', 'POST'])] + public function add(Request $request, CategoryRepository $categoryRepository): Response + { + $this->appLogger->record('VIEW', 'Consultation de la page de création catégorie'); + + $category = new Category(); + $form = $this->createForm(CategoryType::class, $category); + $form->handleRequest($request); + if($form->isSubmitted() && $form->isValid()) { + $this->appLogger->record('VIEW', 'Création d\'une catégorie'); + $this->em->persist($category); + $this->em->flush(); + return $this->redirectToRoute('app_crm_category'); + } + return $this->render('dashboard/category/add.twig', [ + 'form' => $form->createView(), + ]); + } + + #[Route('/delete/{id}', name: 'app_crm_category_delete', options: ['sitemap' => false], methods: ['GET'])] + public function delete( + ?Category $category, + PaginatorInterface $paginator, + Request $request + ): Response { + $this->appLogger->record('VIEW', 'Suppression de la catégorie '.$category->getName()); + + $this->em->remove($category); + $this->em->flush(); + return $this->redirectToRoute('app_crm_category'); + } +} diff --git a/src/Controller/ReserverController.php b/src/Controller/ReserverController.php index 4497373..e6fab23 100644 --- a/src/Controller/ReserverController.php +++ b/src/Controller/ReserverController.php @@ -9,6 +9,7 @@ use App\Entity\Product; use App\Entity\ProductReserve; use App\Entity\Promotion; use App\Entity\SitePerformance; +use App\Repository\CategoryRepository; use App\Repository\CustomerRepository; use App\Repository\CustomerTrackingRepository; use App\Repository\FormulesRepository; @@ -848,10 +849,11 @@ class ReserverController extends AbstractController } #[Route('/catalogue', name: 'reservation_catalogue')] - public function revervationCatalogue(ProductRepository $productRepository): Response + public function revervationCatalogue(CategoryRepository $categoryRepository,ProductRepository $productRepository): Response { return $this->render('revervation/catalogue.twig', [ 'products' => $productRepository->findBy(['isPublish' => true]), + 'categories' => $categoryRepository->findBy([],['id' => 'ASC']), 'tvaEnabled' => $this->isTvaEnabled(), ]); } @@ -883,11 +885,6 @@ class ReserverController extends AbstractController ]); } - #[Route('/comment-reserver', name: 'reservation_workflow')] - public function revervationWorkfkow(): Response - { - return $this->render('revervation/workflow.twig'); - } #[Route('/options/{id}', name: 'reservation_options_show')] public function revervationShowOpitons(string $id, ProductRepository $productRepository): Response diff --git a/src/Entity/Category.php b/src/Entity/Category.php new file mode 100644 index 0000000..088add5 --- /dev/null +++ b/src/Entity/Category.php @@ -0,0 +1,35 @@ +id; + } + + public function getName(): ?string + { + return $this->name; + } + + public function setName(string $name): static + { + $this->name = $name; + + return $this; + } +} diff --git a/src/Form/CategoryType.php b/src/Form/CategoryType.php new file mode 100644 index 0000000..0e96a3d --- /dev/null +++ b/src/Form/CategoryType.php @@ -0,0 +1,33 @@ +add('name', TextType::class, [ + 'label' => 'Nom de la categorie', + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Category::class, + ]); + } +} diff --git a/src/Form/ProductType.php b/src/Form/ProductType.php index 69ad92d..df9d068 100644 --- a/src/Form/ProductType.php +++ b/src/Form/ProductType.php @@ -4,6 +4,7 @@ namespace App\Form; use App\Entity\Customer; use App\Entity\Product; +use App\Repository\CategoryRepository; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\EmailType; @@ -17,8 +18,18 @@ use Symfony\Component\OptionsResolver\OptionsResolver; class ProductType extends AbstractType { + + public function __construct(private readonly CategoryRepository $categoryRepository) + { + + } + public function buildForm(FormBuilderInterface $builder, array $options): void { + $categoryList = []; + foreach ($this->categoryRepository->findAll() as $category) { + $categoryList[$category->getName()] = $category->getName(); + } $builder ->add('name',TextType::class,[ 'label' => 'Nom du produit', @@ -35,14 +46,7 @@ class ProductType extends AbstractType ->add('category',ChoiceType::class,[ 'label' => 'Catégorie du produit', 'required' => true, - 'choices' => [ - '2-7 Ans' =>'2-7 ans', - '3-15 Ans' =>'3-15 ans', - '3-99 Ans' =>'3-99 ans', - 'Barnums' =>'barnums', - 'Alimentaire' =>'alimentaire', - 'Options' =>'options', - ] + 'choices' => $categoryList, ]) ->add('caution',NumberType::class,[ 'label' => 'Caution du produit', diff --git a/src/Repository/CategoryRepository.php b/src/Repository/CategoryRepository.php new file mode 100644 index 0000000..2ea6ad9 --- /dev/null +++ b/src/Repository/CategoryRepository.php @@ -0,0 +1,43 @@ + + */ +class CategoryRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, Category::class); + } + + // /** + // * @return Category[] Returns an array of Category objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('c') + // ->andWhere('c.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('c.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?Category + // { + // return $this->createQueryBuilder('c') + // ->andWhere('c.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Security/RedirecListener.php b/src/Security/RedirecListener.php index b5723e6..3cfd535 100644 --- a/src/Security/RedirecListener.php +++ b/src/Security/RedirecListener.php @@ -52,7 +52,7 @@ class RedirecListener if ($pathInfo === "/") { if ($host === "prestataire.ludikevent.fr") { - $redirect = new RedirectResponse("https://etl.ludikevent.fr/etl"); + $redirect = new RedirectResponse("https://prestataire.ludikevent.fr/etl"); $event->setResponse($redirect); $event->stopPropagation(); return; diff --git a/src/Security/SiteMapListener.php b/src/Security/SiteMapListener.php index 40a4e9e..49e447f 100644 --- a/src/Security/SiteMapListener.php +++ b/src/Security/SiteMapListener.php @@ -103,9 +103,7 @@ class SiteMapListener implements EventSubscriberInterface $catUrl = new UrlConcrete($reservationUrl, $t, UrlConcrete::CHANGEFREQ_DAILY, 0.7); $urlContainer->addUrl($catUrl, 'reservation'); - $reservationUrl = $urlGenerator->generate('reservation_workflow', [], UrlGeneratorInterface::ABSOLUTE_URL); - $workFlow = new UrlConcrete($reservationUrl, $t, UrlConcrete::CHANGEFREQ_MONTHLY, 0.5); - $urlContainer->addUrl($workFlow, 'reservation'); + foreach ($this->formulesRepository->findBy(['isPublish'=>true]) as $formule) { $formulesUrls = $urlGenerator->generate( diff --git a/templates/dashboard/base.twig b/templates/dashboard/base.twig index 4661193..4ebf4f3 100644 --- a/templates/dashboard/base.twig +++ b/templates/dashboard/base.twig @@ -49,6 +49,7 @@ {{ menu.nav_link(path('app_crm_reservation'), 'Planing de réservation', '', 'app_crm_reservation') }} {{ menu.nav_link(path('app_template_point_controle_index'), 'Modèles de contrôle', '', 'app_template_point_controle_index') }} {{ menu.nav_link(path('app_crm_product'), 'Produits', '', 'app_crm_product') }} + {{ menu.nav_link(path('app_crm_category'), 'Categorie', '', 'app_crm_product') }} {{ menu.nav_link(path('app_crm_formules'), 'Formules', '', 'app_crm_formules') }} {{ menu.nav_link(path('app_crm_promotion'), 'Promotions', '', 'app_crm_promotion') }} {{ menu.nav_link(path('app_crm_facture'), 'Facture', '', 'app_crm_facture') }} diff --git a/templates/dashboard/category/add.twig b/templates/dashboard/category/add.twig new file mode 100644 index 0000000..b64e95c --- /dev/null +++ b/templates/dashboard/category/add.twig @@ -0,0 +1,28 @@ +{% extends 'dashboard/base.twig' %} +{% block title %}Nouvelle Catégorie{% endblock %} +{% block title_header %}Nouvelle Catégorie{% endblock %} + + +{% block body %} +
+ + +
+ {{ form_start(form, {'attr': {'class': 'space-y-12'}}) }} + {{ form_row(form.name) }} + {# ACTIONS : Boutons espacés #} +
+
{# Espace large entre les deux boutons #} + + Annuler l'opération + + +
+
+ {{ form_end(form) }} +
+
+{% endblock %} + diff --git a/templates/dashboard/category/list.twig b/templates/dashboard/category/list.twig new file mode 100644 index 0000000..9c66196 --- /dev/null +++ b/templates/dashboard/category/list.twig @@ -0,0 +1,64 @@ +{% extends 'dashboard/base.twig' %} + +{% block title %}Catégorie{% endblock %} +{% block title_header %}Catégorie{% endblock %} + +{% block actions %} + +{% endblock %} +{% block body %} +
+
+ + + + + + + + + {% for category in categorys %} + + + {# CLIENT #} + + + + + {# ACTIONS #} + + + {% else %} + + + + {% endfor %} + +
NomActions
+
+ + {{ category.name }} + +
+
+
+ + + +
+
+

Aucun devis trouvé

+
+
+
+{% endblock %} diff --git a/templates/revervation/base.twig b/templates/revervation/base.twig index cf3fbee..c8b2199 100644 --- a/templates/revervation/base.twig +++ b/templates/revervation/base.twig @@ -133,7 +133,6 @@ {{ macros.nav_link('reservation_catalogue', 'nav.catalogue') }} {{ macros.nav_link('reservation_formules', 'nav.packages') }} {{ macros.nav_link('/images/Catalogue.pdf', 'nav.pdf', true) }} - {{ macros.nav_link('reservation_workflow', 'nav.how_to_book') }} {{ macros.nav_link('reservation_estimate_delivery', 'Estimer la livraison') }} {{ macros.nav_link('reservation_contact', 'nav.contact') }} @@ -190,7 +189,6 @@ {{ macros.mobile_nav_link('reservation_catalogue', 'Nos structures') }} {{ macros.mobile_nav_link('reservation_formules', 'Nos Formules') }} {{ macros.mobile_nav_link('/provider/Catalogue.pdf', 'Catalogue', true) }} - {{ macros.mobile_nav_link('reservation_workflow', 'Comment reserver') }} {{ macros.mobile_nav_link('reservation_estimate_delivery', 'Estimer la livraison') }} {{ macros.mobile_nav_link('reservation_search', 'Rechercher') }} diff --git a/templates/revervation/catalogue.twig b/templates/revervation/catalogue.twig index 1bf22cd..670493d 100644 --- a/templates/revervation/catalogue.twig +++ b/templates/revervation/catalogue.twig @@ -37,19 +37,10 @@ {{ 'catalog.filter.all'|trans }} - {% set categories_list = [ - {'id': '2-7 ans', 'label': 'catalog.filter.cat_2_7'|trans, 'hover': 'hover:border-amber-500 hover:text-amber-600'}, - {'id': '3-15 ans', 'label': 'catalog.filter.cat_3_15'|trans, 'hover': 'hover:border-blue-600 hover:text-blue-600'}, - {'id': '3-99 ans', 'label': 'catalog.filter.cat_3_99'|trans, 'hover': 'hover:border-indigo-600 hover:text-indigo-600'}, - {'id': 'barnums', 'label': 'catalog.filter.cat_barnums'|trans, 'hover': 'hover:border-slate-800 hover:text-slate-800'}, - {'id': 'alimentaire', 'label': 'catalog.filter.cat_food'|trans, 'hover': 'hover:border-rose-500 hover:text-rose-600'}, - {'id': 'options', 'label': 'catalog.filter.cat_options'|trans, 'hover': 'hover:border-emerald-500 hover:text-emerald-600'} - ] %} - - {% for cat in categories_list %} - {% endfor %} diff --git a/templates/revervation/workflow.twig b/templates/revervation/workflow.twig deleted file mode 100644 index 74511ff..0000000 --- a/templates/revervation/workflow.twig +++ /dev/null @@ -1,155 +0,0 @@ -{% extends 'revervation/base.twig' %} - -{% block title %}{{ 'workflow.seo.title'|trans }}{% endblock %} -{% block description %}{{ 'workflow.seo.description'|trans }}{% endblock %} - -{% block breadcrumb_json %} - ,{ - "@type": "ListItem", - "position": 1, - "name": "{{ 'workflow.breadcrumb'|trans }}", - "item": "{{ url('reservation_workflow') }}" - } -{% endblock %} - -{% block body %} - -{% endblock %} \ No newline at end of file