Merge remote-tracking branch 'refs/remotes/origin/develop' into feature/Controller

This commit is contained in:
leroyv 2025-04-08 08:27:33 +02:00
commit 6240722de7
35 changed files with 789 additions and 476 deletions

View File

@ -39,7 +39,7 @@
"symfony/string": "7.1.*",
"symfony/translation": "7.1.*",
"symfony/twig-bundle": "7.1.*",
"symfony/ux-icons": "^2.21",
"symfony/ux-icons": "^2.24",
"symfony/ux-turbo": "^2.20",
"symfony/validator": "7.1.*",
"symfony/web-link": "7.1.*",

24
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "7fff997f78db4185bb53c4543a245c74",
"content-hash": "d1751dd70a356412dfadda645c7118ec",
"packages": [
{
"name": "amphp/amp",
@ -8164,16 +8164,16 @@
},
{
"name": "symfony/ux-icons",
"version": "v2.21.0",
"version": "v2.24.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/ux-icons.git",
"reference": "c3b3fd29b3f90e977b267251ef15ea06f3cec553"
"reference": "39f689b41081f7788ee9c4a188817599d546bfb2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/ux-icons/zipball/c3b3fd29b3f90e977b267251ef15ea06f3cec553",
"reference": "c3b3fd29b3f90e977b267251ef15ea06f3cec553",
"url": "https://api.github.com/repos/symfony/ux-icons/zipball/39f689b41081f7788ee9c4a188817599d546bfb2",
"reference": "39f689b41081f7788ee9c4a188817599d546bfb2",
"shasum": ""
},
"require": {
@ -8197,8 +8197,8 @@
"type": "symfony-bundle",
"extra": {
"thanks": {
"name": "symfony/ux",
"url": "https://github.com/symfony/ux"
"url": "https://github.com/symfony/ux",
"name": "symfony/ux"
}
},
"autoload": {
@ -8233,7 +8233,7 @@
"twig"
],
"support": {
"source": "https://github.com/symfony/ux-icons/tree/v2.21.0"
"source": "https://github.com/symfony/ux-icons/tree/v2.24.0"
},
"funding": [
{
@ -8249,7 +8249,7 @@
"type": "tidelift"
}
],
"time": "2024-10-21T19:01:22+00:00"
"time": "2025-04-04T17:32:18+00:00"
},
{
"name": "symfony/ux-turbo",
@ -11242,7 +11242,7 @@
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"stability-flags": {},
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
@ -11250,6 +11250,6 @@
"ext-ctype": "*",
"ext-iconv": "*"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
"platform-dev": {},
"plugin-api-version": "2.6.0"
}

View File

@ -1,52 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241114160014 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE reservations DROP CONSTRAINT fk_4da2394de1870d');
$this->addSql('DROP INDEX idx_4da2394de1870d');
$this->addSql('ALTER TABLE reservations RENAME COLUMN tabl_id TO table_id');
$this->addSql('ALTER TABLE reservations ADD CONSTRAINT FK_4DA239ECFF285C FOREIGN KEY (table_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX IDX_4DA239ECFF285C ON reservations (table_id)');
$this->addSql('ALTER TABLE statut_tables DROP CONSTRAINT fk_33c8a3754de1870d');
$this->addSql('DROP INDEX idx_33c8a3754de1870d');
$this->addSql('ALTER TABLE statut_tables RENAME COLUMN tabl_id TO table_id');
$this->addSql('ALTER TABLE statut_tables ADD CONSTRAINT FK_33C8A375ECFF285C FOREIGN KEY (table_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX IDX_33C8A375ECFF285C ON statut_tables (table_id)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_497B315E5126AC48 ON utilisateurs (mail)');
}
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('DROP INDEX UNIQ_497B315E5126AC48');
$this->addSql('ALTER TABLE statut_tables DROP CONSTRAINT FK_33C8A375ECFF285C');
$this->addSql('DROP INDEX IDX_33C8A375ECFF285C');
$this->addSql('ALTER TABLE statut_tables RENAME COLUMN table_id TO tabl_id');
$this->addSql('ALTER TABLE statut_tables ADD CONSTRAINT fk_33c8a3754de1870d FOREIGN KEY (tabl_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX idx_33c8a3754de1870d ON statut_tables (tabl_id)');
$this->addSql('ALTER TABLE reservations DROP CONSTRAINT FK_4DA239ECFF285C');
$this->addSql('DROP INDEX IDX_4DA239ECFF285C');
$this->addSql('ALTER TABLE reservations RENAME COLUMN table_id TO tabl_id');
$this->addSql('ALTER TABLE reservations ADD CONSTRAINT fk_4da2394de1870d FOREIGN KEY (tabl_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX idx_4da2394de1870d ON reservations (tabl_id)');
}
}

View File

@ -1,50 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241114160729 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE reservations DROP CONSTRAINT fk_4da239ecff285c');
$this->addSql('DROP INDEX idx_4da239ecff285c');
$this->addSql('ALTER TABLE reservations RENAME COLUMN table_id TO tables_id');
$this->addSql('ALTER TABLE reservations ADD CONSTRAINT FK_4DA23985405FD2 FOREIGN KEY (tables_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX IDX_4DA23985405FD2 ON reservations (tables_id)');
$this->addSql('ALTER TABLE statut_tables DROP CONSTRAINT fk_33c8a375ecff285c');
$this->addSql('DROP INDEX idx_33c8a375ecff285c');
$this->addSql('ALTER TABLE statut_tables RENAME COLUMN table_id TO tables_id');
$this->addSql('ALTER TABLE statut_tables ADD CONSTRAINT FK_33C8A37585405FD2 FOREIGN KEY (tables_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX IDX_33C8A37585405FD2 ON statut_tables (tables_id)');
}
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 statut_tables DROP CONSTRAINT FK_33C8A37585405FD2');
$this->addSql('DROP INDEX IDX_33C8A37585405FD2');
$this->addSql('ALTER TABLE statut_tables RENAME COLUMN tables_id TO table_id');
$this->addSql('ALTER TABLE statut_tables ADD CONSTRAINT fk_33c8a375ecff285c FOREIGN KEY (table_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX idx_33c8a375ecff285c ON statut_tables (table_id)');
$this->addSql('ALTER TABLE reservations DROP CONSTRAINT FK_4DA23985405FD2');
$this->addSql('DROP INDEX IDX_4DA23985405FD2');
$this->addSql('ALTER TABLE reservations RENAME COLUMN tables_id TO table_id');
$this->addSql('ALTER TABLE reservations ADD CONSTRAINT fk_4da239ecff285c FOREIGN KEY (table_id) REFERENCES tables (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE INDEX idx_4da239ecff285c ON reservations (table_id)');
}
}

View File

@ -1,46 +0,0 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241114164216 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE tables_clients (tables_id INT NOT NULL, clients_id INT NOT NULL, PRIMARY KEY(tables_id, clients_id))');
$this->addSql('CREATE INDEX IDX_80F8906E85405FD2 ON tables_clients (tables_id)');
$this->addSql('CREATE INDEX IDX_80F8906EAB014612 ON tables_clients (clients_id)');
$this->addSql('ALTER TABLE tables_clients ADD CONSTRAINT FK_80F8906E85405FD2 FOREIGN KEY (tables_id) REFERENCES tables (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE tables_clients ADD CONSTRAINT FK_80F8906EAB014612 FOREIGN KEY (clients_id) REFERENCES clients (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE clients_tables DROP CONSTRAINT fk_8190d6c6ab014612');
$this->addSql('ALTER TABLE clients_tables DROP CONSTRAINT fk_8190d6c685405fd2');
$this->addSql('DROP TABLE clients_tables');
}
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('CREATE TABLE clients_tables (clients_id INT NOT NULL, tables_id INT NOT NULL, PRIMARY KEY(clients_id, tables_id))');
$this->addSql('CREATE INDEX idx_8190d6c685405fd2 ON clients_tables (tables_id)');
$this->addSql('CREATE INDEX idx_8190d6c6ab014612 ON clients_tables (clients_id)');
$this->addSql('ALTER TABLE clients_tables ADD CONSTRAINT fk_8190d6c6ab014612 FOREIGN KEY (clients_id) REFERENCES clients (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE clients_tables ADD CONSTRAINT fk_8190d6c685405fd2 FOREIGN KEY (tables_id) REFERENCES tables (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE tables_clients DROP CONSTRAINT FK_80F8906E85405FD2');
$this->addSql('ALTER TABLE tables_clients DROP CONSTRAINT FK_80F8906EAB014612');
$this->addSql('DROP TABLE tables_clients');
}
}

View File

@ -1,105 +1,107 @@
html{
font-family: "Quicksand Light"; !important;
}
/* Page container */
.page-container {
width: 100%;
max-width: 600px;
margin: 20px auto;
padding: 20px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
border: 2px solid #ff4d4d;
/* Appliquer une police moderne */
html {
font-family: "Quicksand", sans-serif !important;
}
/* Title */
.page-title {
text-align: center;
font-size: 28px;
color: #ff4d4d;
/* Titre du formulaire */
h1 {
font-size: 26px;
color: #db5559;
margin-bottom: 20px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 1px;
letter-spacing: 1.2px;
}
/* Form styles */
/* Formulaire */
form {
display: flex;
flex-direction: column;
gap: 15px;
align-items: center;
}
/* Groupes de champs */
.form-group {
display: flex;
flex-direction: column;
align-items: flex-start;
width: 100%;
}
/* Labels */
label {
font-weight: bold;
color: #ff4d4d;
margin-bottom: 5px;
color: #db5559;
margin-bottom: 6px;
font-size: 14px;
}
/* Champs de saisie */
input[type="text"],
input[type="email"],
input[type="number"],
textarea,
select {
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 14px;
width: 100%;
padding: 12px;
border: 2px solid #ddd;
border-radius: 6px;
font-size: 16px;
color: #333;
transition: border-color 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
background-color: #fff;
}
input[type="text"]:focus,
input[type="email"]:focus,
input[type="number"]:focus,
input:focus,
textarea:focus,
select:focus {
border-color: #ff4d4d;
border-color: #db5559;
outline: none;
box-shadow: 0 0 5px rgba(219, 85, 89, 0.5);
}
/* Submit button */
/* Bouton d'envoi */
button {
background-color: #ff4d4d;
background-color: #db5559;
color: white;
font-weight: bold;
padding: 12px 20px;
padding: 14px;
border: none;
border-radius: 5px;
font-size: 16px;
border-radius: 8px;
font-size: 18px;
cursor: pointer;
text-transform: uppercase;
transition: background-color 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
width: 100%;
}
button:hover {
background-color: #e60000;
background-color: #b52b31;
}
/* Links */
.actions {
/* Bouton de retour */
#container_modal a {
display: inline-block;
margin-top: 20px;
padding: 12px 20px;
background-color: transparent;
color: #db5559;
border: 2px solid #db5559;
border-radius: 6px;
font-size: 16px;
text-align: center;
margin-top: 15px;
}
.actions a {
text-decoration: none;
color: #ff4d4d;
font-weight: bold;
transition: color 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
}
.actions a:hover {
color: #e60000;
#container_modal a:hover {
background-color: #db5559;
color: white;
}
/* Error messages */
/* Messages d'erreur */
.error-message {
color: #d9534f;
font-size: 14px;
@ -107,10 +109,9 @@ button:hover {
font-style: italic;
}
/* Empty space below */
/* Espacement supplémentaire */
body::after {
content: '';
height: 20px;
display: block;
}

View File

@ -43,7 +43,7 @@ ul {
}
li {
padding-bottom: 20px;
padding-bottom: 4%;
}
.btn-custom {

127
public/css/Plats/plats.css Normal file
View File

@ -0,0 +1,127 @@
/* Title */
h1 {
text-align: center;
font-size: 42px;
color: #b03a2e;
margin-bottom: 20px;
}
/* Menu Grid */
.menu-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); /* 3 max par ligne */
gap: 20px;
justify-content: center;
}
/* Menu Card */
.menu-card {
background: white;
padding: 20px;
border-radius: 15px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
/* Plat Name */
.menu-card h2 {
font-size: 28px;
color: #b03a2e;
margin-bottom: 10px;
}
/* Description */
.menu-card p {
font-size: 18px;
color: #555;
margin-bottom: 10px;
}
/* Price */
.menu-card .price {
font-size: 22px;
font-weight: bold;
color: #388E3C;
margin-bottom: 15px;
}
/* Buttons */
.menu-card .actions {
display: flex;
justify-content: center;
gap: 10px;
}
/* Styles des boutons Modifier et Supprimer */
.menu-card .actions a,
.menu-card .actions button {
text-decoration: none;
font-size: 16px;
font-weight: bold;
padding: 10px 15px;
border-radius: 8px;
transition: all 0.3s ease-in-out;
border: none;
cursor: pointer;
display: inline-block; /* Pour que le bouton suppr ait le même comportement qu'un lien */
text-align: center;
}
/* Modifier */
.menu-card .edit {
background-color: #ffb74d;
color: white;
}
.menu-card .edit:hover {
background-color: #ffa726;
}
/* Supprimer */
.menu-card .delete {
background-color: #d32f2f;
color: white;
}
.menu-card .delete:hover {
background-color: #c62828;
}
.menu-card .edit {
background-color: #ffb74d;
color: white;
}
.menu-card .edit:hover {
background-color: #ffa726;
}
.menu-card .delete {
background-color: #d32f2f;
color: white;
}
.menu-card .delete:hover {
background-color: #c62828;
}
/* Button for Adding New Dish */
.add-menu {
display: block;
text-align: center;
background-color: #b03a2e;
color: white;
padding: 15px;
font-size: 20px;
margin-top: 30px;
border-radius: 10px;
width: 300px;
margin-left: auto;
margin-right: auto;
}
.add-menu:hover {
background-color: #922b21;
}

View File

@ -0,0 +1,84 @@
.calendar {
display: flex;
flex-direction: column;
}
.calendar-header {
display: flex;
}
.calendar-day {
flex: 1;
text-align: center;
font-weight: bold;
padding: 10px;
border: 1px solid #ddd;
}
.calendar-body {
display: flex;
}
.calendar-column {
flex: 1;
min-height: 400px;
border: 1px solid #ddd;
padding: 5px;
position: relative;
}
.reservation {
margin: 5px 0;
padding: 5px;
border-radius: 5px;
font-size: 14px;
text-align: center;
}
/* Conteneur pour les boutons de navigation */
.calendar-nav {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
/* Boutons de navigation (Semaine précédente / Semaine suivante) */
.calendar-nav a {
padding: 10px 15px;
text-decoration: none;
font-size: 16px;
font-weight: bold;
color: white;
background-color: #db5559;
border-radius: 5px;
transition: background-color 0.3s ease-in-out;
}
.calendar-nav a:hover {
background-color: #b52b31;
}
/* Conteneur pour le bouton d'ajout */
.add-reservation {
display: flex;
justify-content: center;
margin-top: 20px;
}
/* Bouton pour créer une réservation */
.add-reservation a {
padding: 12px 20px;
text-decoration: none;
font-size: 18px;
font-weight: bold;
color: white;
background-color: #4CAF50;
border-radius: 8px;
transition: background-color 0.3s ease-in-out;
}
.add-reservation a:hover {
background-color: #388E3C;
}

View File

@ -1,19 +1,22 @@
<?php
// src/Controller/ClientsController.php
namespace App\Controller;
use App\Entity\Clients;
use App\Entity\Reductions;
use App\Form\ClientsType;
use App\Repository\ClientsRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/clients')]
final class ClientsController extends AbstractController
{
#[Route(name: 'app_clients_index', methods: ['GET'])]
public function index(ClientsRepository $clientsRepository): Response
{
@ -30,6 +33,12 @@ final class ClientsController extends AbstractController
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$montantTotal = $client->getTotalDepense();
if($montantTotal > 1000){
$this->appliquerReductionEtCreerSiNecessaire($client, $entityManager);
}
$entityManager->persist($client);
$entityManager->flush();
@ -42,7 +51,6 @@ final class ClientsController extends AbstractController
]);
}
#[Route('/{id}/edit', name: 'app_clients_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, Clients $client, EntityManagerInterface $entityManager): Response
{
@ -50,6 +58,13 @@ final class ClientsController extends AbstractController
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$montantTotal = $client->getTotalDepense();
if($montantTotal > 1000){
$this->appliquerReductionEtCreerSiNecessaire($client, $entityManager);
}
$entityManager->flush();
return $this->redirectToRoute('app_clients_index', [], Response::HTTP_SEE_OTHER);
@ -62,13 +77,62 @@ final class ClientsController extends AbstractController
}
#[Route('/{id}', name: 'app_clients_delete', methods: ['POST'])]
public function delete(Request $request, Clients $client, EntityManagerInterface $entityManager, int $id, ): Response
public function delete(Request $request, Clients $client, EntityManagerInterface $entityManager): Response
{
if ($this->isCsrfTokenValid('delete'.$client->getId(), $request->getPayload()->getString('_token'))) {
if ($this->isCsrfTokenValid('delete'.$client->getId(), $request->request->get('_token'))) {
$entityManager->remove($client);
$entityManager->flush();
}
return $this->redirectToRoute('app_clients_index', [], Response::HTTP_SEE_OTHER);
}
// Méthode pour appliquer ou créer une réduction pour un client
// src/Controller/ClientsController.php
private function appliquerReductionEtCreerSiNecessaire(Clients $client, EntityManagerInterface $entityManager)
{
$montantTotal = $client->getTotalDepense();
$entityManager->persist($client);
$reductions = $entityManager->getRepository(Reductions::class)
->createQueryBuilder('r')
->where('r.montant_min <= :montantTotal')
->andWhere('r.actif = :actif')
->andWhere('r.DateDebut <= :currentDate')
->andWhere('r.DateFin >= :currentDate')
->setParameter('montantTotal', $montantTotal)
->setParameter('actif', true)
->setParameter('currentDate', new \DateTime())
->getQuery()
->getResult();
$newReduction = new Reductions();
if ($montantTotal >= 2000) {
$montantMin = 2000;
$pourcentage = 10;
} elseif ($montantTotal >= 1000) {
$montantMin = 1000;
$pourcentage = 5;
}
$newReduction->setPourcentage($pourcentage)
->setMontantMin($montantMin)
->setDateDebut(new \DateTime())
->setDateFin((new \DateTime())->modify('+1 year'))
->setActif(true)
->setClient($client);
$entityManager->persist($newReduction);
$entityManager->flush();
if (!$client->getReductions()->contains($newReduction)) {
$client->addReduction($newReduction);
}
$entityManager->flush();
}
}

View File

@ -72,4 +72,14 @@ final class PlatsController extends AbstractController
return $this->redirectToRoute('app_plats_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/bestplats', name: 'app_plats_best', methods: ['GET'])]
public function getBest(PlatsRepository $platsRepository): Response
{
$bestplats = $platsRepository->findBestPlats();
// dd($bestplats);
return $this->render('plats/best.html.twig', [
'plat' => $bestplats,
]);
}
}

View File

@ -33,7 +33,7 @@ final class ReservationsController extends AbstractController
$entityManager->persist($reservation);
$entityManager->flush();
return $this->redirectToRoute('app_reservations_index', [], Response::HTTP_SEE_OTHER);
return $this->redirectToRoute('calendar_week', [], Response::HTTP_SEE_OTHER);
}
return $this->render('reservations/new.html.twig', [
@ -71,4 +71,29 @@ final class ReservationsController extends AbstractController
return $this->redirectToRoute('app_reservations_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/calendar/{year}/{week}', name: 'calendar_week', requirements: ['year' => '\d+', 'week' => '\d+'])]
public function calendar(ReservationsRepository $reservationsRepository, int $year = null, int $week = null): Response
{
if ($year === null || $week === null) {
$currentDate = new \DateTime();
$year = (int) $currentDate->format('Y');
$week = (int) $currentDate->format('W');
}
setlocale(LC_TIME, 'fr_FR.UTF-8');
$startDate = new \DateTime();
$startDate->setISODate($year, $week);
$endDate = (clone $startDate)->modify('+6 days');
$reservations = $reservationsRepository->findByDateRange($startDate, $endDate);
// dd($reservations);
return $this->render('reservations/index.html.twig', [
'reservations' => $reservations,
'startDate' => $startDate, // Passe startDate
'endDate' => $endDate, // Passe endDate
]);
}
}

View File

@ -72,4 +72,22 @@ final class TablesController extends AbstractController
return $this->redirectToRoute('app_tables_index', [], Response::HTTP_SEE_OTHER);
}
#[Route('/update/statut/{id}', name: 'app_tables_update_statut', methods: ['POST'])]
public function update(Request $request, EntityManagerInterface $entityManager, $id): Response
{
$table = $entityManager->getRepository(Tables::class)->find($id);
if (!$table) {
throw $this->createNotFoundException('Table not found');
}
$libre = $request->request->get('libre') === '1';
$table->setLibre($libre);
$entityManager->persist($table);
$entityManager->flush();
return $this->redirectToRoute('app_tables_index');
}
}

View File

@ -40,10 +40,17 @@ class Clients
#[ORM\ManyToMany(targetEntity: Commandes::class, mappedBy: 'Client')]
private Collection $commandes;
#[ORM\Column]
private ?float $totalDepense = null;
#[ORM\OneToMany(targetEntity: Reductions::class, mappedBy: 'client', cascade: ['persist', 'remove'])]
private Collection $reductions;
public function __construct()
{
$this->tables = new ArrayCollection();
$this->commandes = new ArrayCollection();
$this->reductions = new ArrayCollection();
}
public function getId(): ?int
@ -149,4 +156,60 @@ class Clients
return $this;
}
public function getTotalDepense(): ?float
{
return $this->totalDepense;
}
public function setTotalDepense(float $totalDepense): static
{
$this->totalDepense = $totalDepense;
return $this;
}
// Dans l'entité Clients
public function appliquerReduction(): void
{
$montantTotal = $this->getTotalDepense();
// Vérifie s'il y a des réductions valides disponibles
$reductions = $this->getReductions(); // Récupérer toutes les réductions du client
foreach ($reductions as $reduction) {
// Vérifie si la réduction est valide (date de validité et montant minimum)
if ($reduction->getDateDebut() <= new \DateTime() && $reduction->getDateFin() >= new \DateTime()) {
if ($montantTotal >= $reduction->getMontantMin()) {
// Applique la réduction en pourcentage au total des dépenses
$reductionMontant = ($montantTotal * $reduction->getPourcentage()) / 100;
$nouveauTotal = $montantTotal - $reductionMontant; // Nouveau montant après réduction
$this->setTotalDepense($nouveauTotal); // Mise à jour du total des dépenses du client
// Met à jour l'objet client avec la réduction
break; // Si une réduction a été appliquée, on arrête
}
}
}
}
public function getReductions(): Collection
{
return $this->reductions;
}
public function addReduction(Reductions $reduction): static
{
if (!$this->reductions->contains($reduction)) {
$this->reductions->add($reduction);
}
return $this;
}
public function removeReduction(Reductions $reduction): static
{
$this->reductions->removeElement($reduction);
return $this;
}
}

View File

@ -39,9 +39,6 @@ class Plats
#[ORM\ManyToMany(targetEntity: Commandes::class, inversedBy: 'plats')]
private Collection $Commande;
#[ORM\ManyToOne(inversedBy: 'plats')]
private ?Reductions $Reduction = null;
public function __construct()
{
$this->Commande = new ArrayCollection();
@ -147,16 +144,4 @@ class Plats
return $this;
}
public function getReduction(): ?Reductions
{
return $this->Reduction;
}
public function setReduction(?Reductions $Reduction): static
{
$this->Reduction = $Reduction;
return $this;
}
}

View File

@ -16,88 +16,30 @@ class Reductions
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $Description = null;
#[ORM\Column]
private ?int $pourcentage = null;
#[ORM\Column]
private ?float $Prix = null;
private ?int $montant_min = null;
#[ORM\Column]
private ?int $Pourcentage = null;
#[ORM\Column(length: 255)]
private ?string $MontantFixe = null;
private ?bool $actif = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $DateDebut = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE)]
private ?\DateTimeInterface $DateFin = null;
/**
* @var Collection<int, Plats>
*/
#[ORM\OneToMany(targetEntity: Plats::class, mappedBy: 'Reduction')]
private Collection $plats;
public function __construct()
{
$this->plats = new ArrayCollection();
}
#[ORM\ManyToOne(targetEntity: Clients::class, inversedBy: 'reductions')]
#[ORM\JoinColumn(nullable: false)]
private ?Clients $client = null;
public function getId(): ?int
{
return $this->id;
}
public function getDescription(): ?string
{
return $this->Description;
}
public function setDescription(string $Description): static
{
$this->Description = $Description;
return $this;
}
public function getPrix(): ?float
{
return $this->Prix;
}
public function setPrix(float $Prix): static
{
$this->Prix = $Prix;
return $this;
}
public function getPourcentage(): ?int
{
return $this->Pourcentage;
}
public function setPourcentage(int $Pourcentage): static
{
$this->Pourcentage = $Pourcentage;
return $this;
}
public function getMontantFixe(): ?string
{
return $this->MontantFixe;
}
public function setMontantFixe(string $MontantFixe): static
{
$this->MontantFixe = $MontantFixe;
return $this;
}
public function getDateDebut(): ?\DateTimeInterface
{
return $this->DateDebut;
@ -122,33 +64,50 @@ class Reductions
return $this;
}
/**
* @return Collection<int, Plats>
*/
public function getPlats(): Collection
public function getPourcentage(): ?int
{
return $this->plats;
return $this->pourcentage;
}
public function addPlat(Plats $plat): static
public function setPourcentage(int $pourcentage): static
{
if (!$this->plats->contains($plat)) {
$this->plats->add($plat);
$plat->setReduction($this);
}
$this->pourcentage = $pourcentage;
return $this;
}
public function removePlat(Plats $plat): static
public function getMontantMin(): ?int
{
if ($this->plats->removeElement($plat)) {
// set the owning side to null (unless already changed)
if ($plat->getReduction() === $this) {
$plat->setReduction(null);
}
}
return $this->montant_min;
}
public function setMontantMin(int $montant_min): static
{
$this->montant_min = $montant_min;
return $this;
}
public function isActif(): ?bool
{
return $this->actif;
}
public function setActif(bool $actif): static
{
$this->actif = $actif;
return $this;
}
public function getClient(): ?Clients
{
return $this->client;
}
public function setClient(?Clients $client): static
{
$this->client = $client;
return $this;
}
}

View File

@ -70,7 +70,7 @@ class Reservations
return $this->tables;
}
public function setTable(?Tables $tables): static
public function setTables(?Tables $tables): static
{
$this->tables = $tables;

View File

@ -36,9 +36,12 @@ class Tables
/**
* @var Collection<int, Utilisateurs>
*/
#[ORM\ManyToMany(targetEntity: Utilisateurs::class, mappedBy: 'tables')]
#[ORM\ManyToMany(targetEntity: Utilisateurs::class, inversedBy: 'tables')]
private Collection $utilisateurs;
#[ORM\Column(type: 'boolean', options: ['default' => true])]
private ?bool $libre = null;
public function __construct()
{
$this->Clients = new ArrayCollection();
@ -91,7 +94,7 @@ class Tables
{
if (!$this->reservations->contains($reservation)) {
$this->reservations->add($reservation);
$reservation->setTable($this);
$reservation->setTables($this);
}
return $this;
@ -102,7 +105,7 @@ class Tables
if ($this->reservations->removeElement($reservation)) {
// set the owning side to null (unless already changed)
if ($reservation->getTables() === $this) {
$reservation->setTable(null);
$reservation->setTables(null);
}
}
@ -165,4 +168,16 @@ class Tables
return $this;
}
public function isLibre(): ?bool
{
return $this->libre;
}
public function setLibre(bool $libre): static
{
$this->libre = $libre;
return $this;
}
}

View File

@ -41,7 +41,7 @@ class Utilisateurs implements UserInterface, PasswordAuthenticatedUserInterface
/**
* @var Collection<int, Tables>
*/
#[ORM\ManyToMany(targetEntity: Tables::class, inversedBy: 'utilisateurs')]
#[ORM\ManyToMany(targetEntity: Tables::class, mappedBy: 'utilisateurs')]
private Collection $tables;
public function __construct()

View File

@ -17,6 +17,7 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use function Sodium\add;
class AddUserFormType extends AbstractType
{
@ -48,6 +49,12 @@ class AddUserFormType extends AbstractType
'expanded' => true,
'multiple' => true,
])
->add('Tables', EntityType::class, [
'class' => Tables::class,
'choice_label' => 'id',
'multiple' => true,
'expanded' => true,
])
->add('Enregistrer', SubmitType::class);
}

View File

@ -4,6 +4,7 @@ namespace App\Form;
use App\Entity\Clients;
use App\Entity\Commandes;
use App\Entity\Reductions;
use App\Entity\Tables;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
@ -25,7 +26,7 @@ class ClientsType extends AbstractType
'multiple' => true,
'expanded' => true,
])
->add('totalDepense')
;
}

View File

@ -27,10 +27,6 @@ class PlatsType extends AbstractType
'multiple' => true,
'expanded' => true,
])
->add('Reduction', EntityType::class, [
'class' => Reductions::class,
'choice_label' => 'description',
])
;
}

View File

@ -2,7 +2,10 @@
namespace App\Form;
use App\Entity\Clients;
use App\Entity\Reductions;
use http\Client;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
@ -12,16 +15,19 @@ class ReductionsType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('Description')
->add('Prix')
->add('Pourcentage')
->add('MontantFixe')
->add('Taux')
->add('DateDebut', null, [
'widget' => 'single_text',
])
->add('DateFin', null, [
'widget' => 'single_text',
])
->add('client', EntityType::class, [
'class' => Clients::class,
'choice_label' => 'nom',
'multiple' => false,
'expanded' => true,
])
;
}

View File

@ -25,7 +25,7 @@ class ReservationsType extends AbstractType
])
->add('utilisateurs', EntityType::class, [
'class' => Utilisateurs::class,
'choice_label' => 'id',
'choice_label' => 'prenom',
'multiple' => true,
'expanded' => true,
])

View File

@ -3,10 +3,12 @@
namespace App\Form;
use App\Entity\Clients;
use App\Entity\StatutTables;
use App\Entity\Tables;
use App\Entity\Utilisateurs;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
@ -21,12 +23,15 @@ class TablesType extends AbstractType
'multiple' => true,
'expanded' => true,
])
->add('utilisateurs', EntityType::class, [
->add('Utilisateurs', EntityType::class, [
'class' => Utilisateurs::class,
'choice_label' => 'id',
'multiple' => true,
'expanded' => true,
])
->add('libre', HiddenType::class, [
'data' => true,
])
;
}

View File

@ -40,4 +40,14 @@ class PlatsRepository extends ServiceEntityRepository
// ->getOneOrNullResult()
// ;
// }
public function findBestPlats(): ?Plats
{
return $this->createQueryBuilder('p')
->orderBy('p.Nb_de_commande', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
}

View File

@ -40,4 +40,19 @@ class ReservationsRepository extends ServiceEntityRepository
// ->getOneOrNullResult()
// ;
// }
// src/Repository/ReservationRepository.php
public function findByDateRange(\DateTime $startDate, \DateTime $endDate): array
{
return $this->createQueryBuilder('r')
->where('r.DateHeure BETWEEN :start AND :end')
->setParameter('start', $startDate->format('Y-m-d 00:00:00'))
->setParameter('end', $endDate->format('Y-m-d 23:59:59'))
->orderBy('r.DateHeure', 'ASC')
->getQuery()
->getResult();
}
}

View File

@ -12,9 +12,11 @@
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('css/ControllerVues/list.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Plats/plats.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Index/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Compte/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/GestionUtilisateurs/GestionUtilisateurs.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Reservations/reservationCalendar.css') }}"> <!-- Ajout du fichier CSS -->
{% endblock %}
{# {% block javascripts %}#}
@ -88,7 +90,7 @@
</a>
</li>
<li>
<a href="/" class="btn-custom icon-container">
<a href="/plats/bestplats" class="btn-custom icon-container">
<i class="icon-medium"> {{ ux_icon('fluent-emoji-high-contrast:ten-oclock') }}</i>
<span>Voir tendances</span>
</a>
@ -100,7 +102,7 @@
</a>
</li>
<li>
<a href="/reservations" class="btn-custom icon-container">
<a href="/reservations/calendar" class="btn-custom icon-container">
<i class="icon-medium"> {{ ux_icon('fluent-mdl2:reservation-orders') }}</i>
<span>Réservation</span>
</a>

View File

@ -2,60 +2,59 @@
{% block title %}Client index{% endblock %}
{% block head %}
<head>
<meta charset="UTF-8">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>">
<link href="https://fonts.cdnfonts.com/css/brittany-signature" rel="stylesheet">
</head>
{% endblock %}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('css/ControllerVues/list.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Index/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Compte/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/GestionUtilisateurs/GestionUtilisateurs.css') }}"> <!-- Ajout du fichier CSS -->
{% endblock %}
{% block container_modal %}
<div id="container_modal">
<h1>Clients index</h1>
<div id="container_modal">
<h1>Clients index</h1>
<table class="table">
<thead>
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>Prenom</th>
<th>Nom</th>
<th>Email</th>
<th>Telephone</th>
<th>actions</th>
<th>Depense</th>
<th>Réduction Appliquée</th> <!-- Nouvelle colonne -->
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for client in clients %}
<tr>
<td>{{ client.id }}</td>
<td>{{ client.Prenom }}</td>
<td>{{ client.Nom }}</td>
<td>{{ client.Email }}</td>
<td>{{ client.Telephone }}</td>
<td>
<form method="post" action="{{ path('app_clients_delete', {'id': client.id}) }}" onsubmit="return confirm('Es-tu sur de vouloir le supprimer ?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ client.id) }}">
{{ include('clients/_delete_form.html.twig') }}
</form>
<a href="{{ path('app_clients_edit', {'id': client.id}) }}">Modifier</a>
</td>
</tr>
{% else %}
<tr>
<td colspan="6">no records found</td>
</tr>
{% endfor %}
</tbody>
</table>
</thead>
<tbody>
{% for client in clients %}
<tr>
<td>{{ client.id }}</td>
<td>{{ client.Prenom }}</td>
<td>{{ client.Nom }}</td>
<td>{{ client.Email }}</td>
<td>{{ client.Telephone }}</td>
<td>{{ client.totalDepense }}</td>
<a href="{{ path('app_clients_new') }}">Créer un nouveau client</a>
</div>
<td>
{% if client.reductions|length > 0 %}
{% for reduction in client.reductions %}
<span>Réduction de {{ reduction.pourcentage }}% - Valide jusqu'à {{ reduction.DateFin|date('d/m/Y') }}</span><br>
{% endfor %}
{% else %}
Aucune réduction
{% endif %}
</td>
<td>
<form method="post" action="{{ path('app_clients_delete', {'id': client.id}) }}" onsubmit="return confirm('Es-tu sûr de vouloir le supprimer ?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ client.id) }}">
{{ include('clients/_delete_form.html.twig') }}
</form>
<a href="{{ path('app_clients_edit', {'id': client.id}) }}">Modifier</a>
</td>
</tr>
{% else %}
<tr>
<td colspan="8">Aucun client trouvé</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="{{ path('app_clients_new') }}">Créer un nouveau client</a>
</div>
{% endblock %}

View File

@ -0,0 +1,59 @@
{% extends 'base.html.twig' %}
{% block head %}
<head>
<meta charset="UTF-8">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>">
<link href="https://fonts.cdnfonts.com/css/brittany-signature" rel="stylesheet">
</head>
{% endblock %}
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('css/ControllerVues/list.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/ControllerVues/edit.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Index/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Compte/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/GestionUtilisateurs/GestionUtilisateurs.css') }}"> <!-- Ajout du fichier CSS -->
{% endblock %}
{% block container_modal %}
<div id="container_modal">
<h1>Tendance</h1>
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>Nom</th>
<th>Description</th>
<th>Prix</th>
<th>Categorie</th>
<th>Statut</th>
<th>Nb_de_commande</th>
</tr>
</thead>
<tbody>
{% if plat %}
<tr>
<td>{{ plat.id }}</td>
<td>{{ plat.Nom }}</td>
<td>{{ plat.Description }}</td>
<td>{{ plat.Prix }}</td>
<td>{{ plat.Categorie }}</td>
<td>{{ plat.Statut ? 'Yes' : 'No' }}</td>
<td>{{ plat.NbDeCommande }}</td>
</tr>
{% else %}
<tr>
<td colspan="8">Aucun enregistrement trouvé</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
{% endblock %}

View File

@ -13,6 +13,7 @@
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('css/ControllerVues/list.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/ControllerVues/edit.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Plats/plats.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Index/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Compte/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/GestionUtilisateurs/GestionUtilisateurs.css') }}"> <!-- Ajout du fichier CSS -->
@ -21,48 +22,28 @@
{% block container_modal %}
<div id="container_modal">
<h1>Plats index</h1>
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>Nom</th>
<th>Description</th>
<th>Prix</th>
<th>Categorie</th>
<th>Statut</th>
<th>Nb_de_commande</th>
<th>actions</th>
</tr>
</thead>
<tbody>
<div class="menu-container">
{% for plat in plats %}
<tr>
<td>{{ plat.id }}</td>
<td>{{ plat.Nom }}</td>
<td>{{ plat.Description }}</td>
<td>{{ plat.Prix }}</td>
<td>{{ plat.Categorie }}</td>
<td>{{ plat.Statut ? 'Yes' : 'No' }}</td>
<td>{{ plat.NbDeCommande }}</td>
<td>
<form method="post" action="{{ path('app_plats_delete', {'id': plat.id}) }}" onsubmit="return confirm('Es-tu sur de vouloir le supprimer ?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ plat.id) }}">
{{ include('plats/_delete_form.html.twig') }}
</form>
<a href="{{ path('app_plats_edit', {'id': plat.id}) }}">Modifier</a>
</td>
</tr>
{% else %}
<tr>
<td colspan="8">Aucun enregistrement trouvé</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="menu-card">
<h2>{{ plat.Nom }}</h2>
<p>{{ plat.Description }}</p>
<p class="price">{{ plat.Prix }}€</p>
<div class="actions">
<a href="{{ path('app_plats_edit', {'id': plat.id}) }}" class="edit">Modifier</a>
<form method="post" action="{{ path('app_plats_delete', {'id': plat.id}) }}" onsubmit="return confirm('Es-tu sûr de vouloir le supprimer ?');" style="display:inline;">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ plat.id) }}">
<button type="submit" class="delete">Supprimer</button>
</form>
</div>
</div>
{% else %}
<p>Aucun plat disponible.</p>
{% endfor %}
</div>
<a href="{{ path('app_plats_new') }}" class="add-menu">Créer un menu</a>
<a href="{{ path('app_plats_new') }}">Créer un menu</a>
</div>
{% endblock %}

View File

@ -27,12 +27,11 @@
<thead>
<tr>
<th>Id</th>
<th>Description</th>
<th>Prix</th>
<th>Pourcentage</th>
<th>MontantFixe</th>
<th>Montant Minimum</th>
<th>DateDebut</th>
<th>DateFin</th>
<th>Client</th>
<th>actions</th>
</tr>
</thead>
@ -40,18 +39,16 @@
{% for reduction in reductions %}
<tr>
<td>{{ reduction.id }}</td>
<td>{{ reduction.Description }}</td>
<td>{{ reduction.Prix }}</td>
<td>{{ reduction.Pourcentage }}</td>
<td>{{ reduction.MontantFixe }}</td>
<td>{{ reduction.DateDebut ? reduction.DateDebut|date('Y-m-d H:i:s') : '' }}</td>
<td>{{ reduction.DateFin ? reduction.DateFin|date('Y-m-d H:i:s') : '' }}</td>
<td>{{ reduction.pourcentage }}%</td>
<td>{{ reduction.montantMin }} €</td>
<td>{{ reduction.DateDebut ? reduction.DateDebut|date('d/m/Y H:i:s') : 'Non spécifié' }}</td>
<td>{{ reduction.DateFin ? reduction.DateFin|date('d/m/Y H:i:s') : 'Non spécifié' }}</td>
<td>{{ reduction.client.nom }}</td>
<td>
<form method="post" action="{{ path('app_reductions_delete', {'id': reduction.id}) }}" onsubmit="return confirm('Es-tu sur de vouloir le supprimer ?'); ">
<form method="post" action="{{ path('app_reductions_delete', {'id': reduction.id}) }}" onsubmit="return confirm('Êtes-vous sûr de vouloir supprimer cette réduction ?'); ">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ reduction.id) }}">
{{ include('reductions/_delete_form.html.twig') }}
<button type="submit" class="btn btn-danger">Supprimer</button>
</form>
<a href="{{ path('app_reductions_edit', {'id': reduction.id}) }}">Modifier</a>
</td>
</tr>
{% else %}
@ -61,8 +58,6 @@
{% endfor %}
</tbody>
</table>
<a href="{{ path('app_reductions_new') }}">Créer une réduction</a>
</div>
{% endblock %}

View File

@ -13,45 +13,50 @@
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('css/ControllerVues/list.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Index/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Reservations/reservationCalendar.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/Compte/index.css') }}"> <!-- Ajout du fichier CSS -->
<link rel="stylesheet" href="{{ asset('css/GestionUtilisateurs/GestionUtilisateurs.css') }}"> <!-- Ajout du fichier CSS -->
{% endblock %}
{% block container_modal %}
<div id="container_modal">
<h1>Reservations index</h1>
<div class="calendar-nav">
<a href="{{ path('calendar_week', { year: startDate|date('Y'), week: startDate|date('W') - 1 }) }}">← Semaine précédente</a>
<a href="{{ path('calendar_week', { year: startDate|date('Y'), week: startDate|date('W') + 1 }) }}">Semaine suivante →</a>
</div>
<div class="calendar">
<div class="calendar-header">
{% for i in 0..6 %}
<div class="calendar-day">
{{ (startDate|date_modify("+" ~ i ~ " days"))|date('D d/m') }}
</div>
{% endfor %}
</div>
<div class="calendar-body">
{% for i in 0..6 %}
<div class="calendar-column">
{% set currentDate = startDate|date_modify("+" ~ i ~ " days") %}
{% for reservation in reservations %}
{% set res_date = reservation.dateHeure|date('Y-m-d') %}
{% set res_time = reservation.dateHeure|date('H:i') %}
{% if res_date == currentDate|date('Y-m-d') %}
<div class="reservation" style="background-color: lightblue;">
{{ res_time }} - {{ reservation.nbdeprsn }} pers.
</div>
{% endif %}
{% endfor %}
</div>
{% endfor %}
</div>
</div>
<div class="add-reservation">
<a href="{{ path('app_reservations_new') }}">+ Ajouter une réservation</a>
</div>
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>DateHeure</th>
<th>Nb_de_prsn</th>
<th>actions</th>
</tr>
</thead>
<tbody>
{% for reservation in reservations %}
<tr>
<td>{{ reservation.id }}</td>
<td>{{ reservation.DateHeure ? reservation.DateHeure|date('Y-m-d H:i:s') : '' }}</td>
<td>{{ reservation.NbDePrsn }}</td>
<td>
<form method="post" action="{{ path('app_reservations_delete', {'id': reservation.id}) }}" onsubmit="return confirm('Es-tu sur de vouloir le supprimer ?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ reservation.id) }}">
{{ include('reservations/_delete_form.html.twig') }}
</form>
<a href="{{ path('app_reservations_edit', {'id': reservation.id}) }}">Modifier</a>
</td>
</tr>
{% else %}
<tr>
<td colspan="4">Aucun enregistrement trouvé</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="{{ path('app_reservations_new') }}">Créer une réservation</a>
</div>
{% endblock %}

View File

@ -24,6 +24,6 @@
{{ include('reservations/_form.html.twig') }}
<a href="{{ path('app_reservations_index') }}">Retour à la liste</a>
<a href="{{ path('calendar_week') }}">Retour à la liste</a>
</div>
{% endblock %}

View File

@ -22,33 +22,62 @@
<div id="container_modal">
<h1>Tables index</h1>
<table class="table">
<table>
<thead>
<tr>
<th>Id</th>
<th>actions</th>
<th>Numéro de Table</th>
<th>Client Assigné</th>
<th>Utilisateur Assigné</th>
<th>Libre ?</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for table in tables %}
<tr>
<td>{{ table.id }}</td>
<td>
<form method="post" action="{{ path('app_tables_delete', {'id': table.id}) }}" onsubmit="return confirm('Es-tu sur de vouloir le supprimer ?');">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ table.id) }}">
{{ include('tables/_delete_form.html.twig') }}
{% for client in table.Clients %}
{{ client.nom }}{% if not loop.last %}, {% endif %}
{% else %}
Aucun
{% endfor %}
</td>
<td>
{% for utilisateur in table.utilisateurs %}
{{ utilisateur.nom }}{% if not loop.last %}, {% endif %}
{% else %}
Aucun
{% endfor %}
</td>
<td>
<form method="POST" action="{{ path('app_tables_update_statut', {'id': table.id}) }}">
<input type="checkbox" name="libre" value="1" {% if table.libre %}checked{% endif %}>
<button type="submit">Mettre à jour</button>
</form>
</td>
<td>
<a href="{{ path('app_tables_edit', {'id': table.id}) }}">Modifier</a>
<form method="post" action="{{ path('app_tables_delete', {'id': table.id}) }}" onsubmit="return confirm('Es-tu sûr de vouloir le supprimer ?');" style="display:inline;">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ table.id) }}">
<button type="submit">Supprimer</button>
</form>
</td>
</tr>
{% else %}
<tr>
<td colspan="2">Aucun enregistrement trouvé</td>
<td colspan="5">Aucun enregistrement trouvé</td>
</tr>
{% endfor %}
</tbody>
</table>
<a onclick="addTable(this)" href="{{ path('app_tables_new')}}">Créer une tables</a>
</div>