RoomAvailability - Initial implementation

This commit is contained in:
2024-04-28 03:19:19 +02:00
parent 7a56158563
commit 8e7bad7771
9 changed files with 258 additions and 9 deletions
+37
View File
@@ -0,0 +1,37 @@
<?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 Version20240427171934 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 room_availability (day DATE NOT NULL, room_category_id INT NOT NULL, num_available INT NOT NULL, PRIMARY KEY(day, room_category_id))');
$this->addSql('CREATE INDEX IDX_89C5BA2C67333DD ON room_availability (room_category_id)');
$this->addSql('ALTER TABLE room_availability ADD CONSTRAINT FK_89C5BA2C67333DD FOREIGN KEY (room_category_id) REFERENCES room_category (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('CREATE UNIQUE INDEX UNIQ_718569538A90ABA9 ON config_variable (key)');
}
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 room_availability DROP CONSTRAINT FK_89C5BA2C67333DD');
$this->addSql('DROP TABLE room_availability');
$this->addSql('DROP INDEX UNIQ_718569538A90ABA9');
}
}
@@ -0,0 +1,57 @@
<?php
namespace App\Controller\Admin;
use App\Repository\RoomAvailabilityRepository;
use App\Repository\RoomCategoryRepository;
use App\Entity\RoomAvailability;
use App\Entity\RoomCategory;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
use EasyCorp\Bundle\EasyAdminBundle\Field\{TextField, DateField, AssociationField, NumberField};
#[IsGranted("ROLE_ADMIN")]
class RoomAvailabilityAdminController extends AbstractController
{
#[Route('/admin/roomAvailability', name: 'admin_roomAvailability')]
public function index(RoomAvailabilityRepository $repo, RoomCategoryRepository $catRepo): Response
{
$categoryList = $catRepo->findAll();
return $this->render('admin/room_availability/index.html.twig', [
'roomCategoryList' => $categoryList,
]);
}
#[Route('/admin/roomAvailability/{categoryId}', name: 'admin_roomAvailability_category')]
public function categoryAvailability(RoomAvailabilityRepository $repo, RoomCategoryRepository $catRepo, string $categoryId): Response
{
$category = $catRepo->find($categoryId);
$availabilityList = $repo->findByRoomCategory($categoryId);
return $this->render('admin/room_availability/category_view.html.twig', [
'categoryData' => $category,
'availabilityList' => $availabilityList,
]);
}
#[Route('/admin/roomAvailabilityTEST/', name: 'admin_roomAvailability_test')]
public function availabilityTest(EntityManagerInterface $entityManager): Response
{
$avl = new RoomAvailability();
$avl->setDay(new \DateTime("2024-04-24"));
$avl->setRoomCategory($entityManager->find(RoomCategory::class, 4));
$avl->setNumAvailable(2);
$entityManager->persist($avl);
$entityManager->flush();
return $this->json($avl);
}
}
@@ -4,8 +4,6 @@ namespace App\Controller\Admin;
use App\Entity\RoomCategoryDetails; use App\Entity\RoomCategoryDetails;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
class RoomCategoryDetailsCrudController extends AbstractCrudController class RoomCategoryDetailsCrudController extends AbstractCrudController
@@ -20,7 +18,7 @@ class RoomCategoryDetailsCrudController extends AbstractCrudController
{ {
return [ return [
TextField::new('detailsSection'), TextField::new('detailsSection'),
TextEditorField::new('detailValue'), TextField::new('detailValue'),
]; ];
} }
} }
@@ -5,10 +5,7 @@ namespace App\Controller\Admin;
use App\Entity\RoomCategoryPhoto; use App\Entity\RoomCategoryPhoto;
use App\Entity\RoomCategoryPhotoKinds; use App\Entity\RoomCategoryPhotoKinds;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField; use EasyCorp\Bundle\EasyAdminBundle\Field\{TextField, ChoiceField};
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
class RoomCategoryPhotoCrudController extends AbstractCrudController class RoomCategoryPhotoCrudController extends AbstractCrudController
{ {
@@ -20,7 +17,7 @@ class RoomCategoryPhotoCrudController extends AbstractCrudController
public function configureFields(string $pageName): iterable public function configureFields(string $pageName): iterable
{ {
yield TextField::new('path'); yield TextField::new('path');
yield TextEditorField::new('altText'); yield TextField::new('altText');
yield ChoiceField::new('kind')->setChoices(['Main' => 'main', 'Bathroom' => 'bathroom', 'Other' => 'other']); yield ChoiceField::new('kind')->setChoices(['Main' => 'main', 'Bathroom' => 'bathroom', 'Other' => 'other']);
} }
@@ -9,6 +9,8 @@ use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Routing\Annotation\Route;
use App\Entity\RoomCategory; use App\Entity\RoomCategory;
use App\Entity\RoomAvailability;
use App\Entity\User; use App\Entity\User;
use App\Entity\ConfigVariable; use App\Entity\ConfigVariable;
@@ -31,7 +33,8 @@ class SomniaDashboardController extends AbstractDashboardController
yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home'); yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
yield MenuItem::Section('Room Management'); yield MenuItem::Section('Room Management');
yield MenuItem::linkToCrud('Category', 'fas fa-list', RoomCategory::class); yield MenuItem::linkToCrud('Category', 'fas fa-door-open', RoomCategory::class);
yield MenuItem::linkToRoute('Room Availability', 'fas fa-calendar-check', 'admin_roomAvailability');
yield MenuItem::Section('App Management'); yield MenuItem::Section('App Management');
yield MenuItem::linkToCrud('Config Vars', 'fas fa-gear', ConfigVariable::class); yield MenuItem::linkToCrud('Config Vars', 'fas fa-gear', ConfigVariable::class);
+60
View File
@@ -0,0 +1,60 @@
<?php
namespace App\Entity;
use App\Repository\RoomAvailabilityRepository;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: RoomAvailabilityRepository::class)]
class RoomAvailability
{
#[ORM\Id]
#[ORM\Column]
private ?string $day = null;
#[ORM\Id]
#[ORM\ManyToOne(targetEntity: RoomCategory::class)]
#[ORM\JoinColumn(nullable: false, onDelete: "CASCADE")]
private ?RoomCategory $roomCategory = null;
#[ORM\Column]
private ?int $numAvailable = null;
public function getDay(): ?\DateTimeInterface
{
return new \DateTime($this->day);
}
public function setDay(\DateTimeInterface $day): static
{
$this->day = $day->format("Ymd");
return $this;
}
public function getRoomCategory(): ?RoomCategory
{
return $this->roomCategory;
}
public function setRoomCategory(?RoomCategory $roomCategory): static
{
$this->roomCategory = $roomCategory;
return $this;
}
public function getNumAvailable(): ?int
{
return $this->numAvailable;
}
public function setNumAvailable(int $numAvailable): static
{
$this->numAvailable = $numAvailable;
return $this;
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Repository;
use App\Entity\RoomAvailability;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<RoomAvailability>
*
* @method RoomAvailability|null find($id, $lockMode = null, $lockVersion = null)
* @method RoomAvailability|null findOneBy(array $criteria, array $orderBy = null)
* @method RoomAvailability[] findAll()
* @method RoomAvailability[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class RoomAvailabilityRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, RoomAvailability::class);
}
/**
* @return RoomAvailability[] Returns an array of RoomAvailability objects
*/
public function findByRoomCategory($categoryId): array
{
return $this->createQueryBuilder('a')
->andWhere('a.roomCategory = :val')
->setParameter('val', $categoryId)
->orderBy('a.day', 'ASC')
->getQuery()
->getResult();
}
// public function findOneBySomeField($value): ?RoomAvailability
// {
// return $this->createQueryBuilder('r')
// ->andWhere('r.exampleField = :val')
// ->setParameter('val', $value)
// ->getQuery()
// ->getOneOrNullResult()
// ;
// }
}
@@ -0,0 +1,25 @@
{# templates/admin/room_availability/index.html.twig #}
{% extends '@EasyAdmin/page/content.html.twig' %}
{% block content_title 'Room Availability' %}
{% block main %}
<div>
<h3>{{categoryData.name}}</h3>
</div>
<table class="datagrid">
<thead>
<tr>
<td>Day</td>
<td>Amount</td>
</tr>
</thead>
<tbody>
{% for availability in availabilityList %}
<tr>
<td>{{availability.day |date('d-m-Y')}}</td>
<td>{{availability.numAvailable}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
@@ -0,0 +1,26 @@
{# templates/admin/room_availability/index.html.twig #}
{% extends '@EasyAdmin/page/content.html.twig' %}
{% block content_title 'Room Availability' %}
{% block main %}
<table class="datagrid">
<thead>
<tr>
<td>Category</td>
<td>Details</td>
</tr>
</thead>
<tbody>
{% for category in roomCategoryList %}
<tr>
<td>{{category.name}}</td>
<td>
<a href="{{ ea_url().setRoute('admin_roomAvailability_category', { categoryId: category.id }) }}">
View Details
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}