Author SHA1 Message Date
Daniel-Garmig 72a9f69799 Generate Nightly Build - 202405131822
Publish_on_Tag / Build and Push (push) Failing after 1m17s
2024-05-13 18:22:21 +02:00
Daniel-Garmig faea267b1f Add Gitea Actions Support.
CI / Docker Lint (push) Successful in 17s
2024-05-13 18:14:32 +02:00
Daniel-Garmig e8bfcd9c6b Room Availability - Edit + bulk edit 2024-05-11 00:45:35 +02:00
Daniel-Garmig ed4ba9d82f Booking Creation - Finish initial implement.
- Check and update availability.
- Set prices.
- Generate booking refNumber.
2024-05-10 21:31:24 +02:00
14 changed files with 382 additions and 30 deletions
+23
View File
@@ -0,0 +1,23 @@
name: CI
on:
push:
branches:
- main
pull_request: ~
workflow_dispatch: ~
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
lint:
name: Docker Lint
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Lint Dockerfile
uses: hadolint/[email protected]
+45
View File
@@ -0,0 +1,45 @@
name: Publish_on_Tag
on:
push:
tags:
- devbuild_*
workflow_dispatch: ~
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
build:
name: Build and Push
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to local registry
uses: docker/login-action@v3
with:
registry: ${{vars.REGISTRY_INSTANCE}}
username: ${{gitea.repository_owner}}
password: ${{secrets.REGISTRY_TOKEN}} # It should be a user/org token with package perms.
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{vars.REGISTRY_INSTANCE}}/${{gitea.repository_owner}}/somniarooms:devbuild
target: frankenphp_prod
platforms: linux/amd64,linux/arm64
secrets: |
GIT_AUTH_TOKEN=${{secrets.REGISTRY_TOKEN}}
+15 -1
View File
@@ -22,4 +22,18 @@ docker compose --env-file .\.env.local up -d --wait
Stop containers Stop containers
``` ```
docker compose down --remove-orphans docker compose down --remove-orphans
``` ```
### Prod:
You can use docker compose for prod or build and deploy a prod image.
**Build Prod image**
```
docker build -t somniarooms:prod --target frankenphp_prod .
```
**Deploy prod image**
```
docker run -d -it -p 80:80 -p 443:443 --name somniarooms --env-file ./env.prod.local somniarooms:prod
```
+1
View File
@@ -21,6 +21,7 @@
"symfony/console": "7.0.*", "symfony/console": "7.0.*",
"symfony/dotenv": "7.0.*", "symfony/dotenv": "7.0.*",
"symfony/flex": "^2", "symfony/flex": "^2",
"symfony/form": "7.0.*",
"symfony/framework-bundle": "7.0.*", "symfony/framework-bundle": "7.0.*",
"symfony/property-access": "7.0.*", "symfony/property-access": "7.0.*",
"symfony/property-info": "7.0.*", "symfony/property-info": "7.0.*",
Generated
+7 -7
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "0422b42b049fb3382babd77edbaac205", "content-hash": "f177a4872c4ced09856f94d423de0b21",
"packages": [ "packages": [
{ {
"name": "doctrine/cache", "name": "doctrine/cache",
@@ -3141,16 +3141,16 @@
}, },
{ {
"name": "symfony/form", "name": "symfony/form",
"version": "v7.0.6", "version": "v7.0.7",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/form.git", "url": "https://github.com/symfony/form.git",
"reference": "d5db6599775a563792391d0045decc240e7ebd1e" "reference": "b4df6a399a2b03782a0163807239db342659f54f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/form/zipball/d5db6599775a563792391d0045decc240e7ebd1e", "url": "https://api.github.com/repos/symfony/form/zipball/b4df6a399a2b03782a0163807239db342659f54f",
"reference": "d5db6599775a563792391d0045decc240e7ebd1e", "reference": "b4df6a399a2b03782a0163807239db342659f54f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -3217,7 +3217,7 @@
"description": "Allows to easily create, process and reuse HTML forms", "description": "Allows to easily create, process and reuse HTML forms",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/form/tree/v7.0.6" "source": "https://github.com/symfony/form/tree/v7.0.7"
}, },
"funding": [ "funding": [
{ {
@@ -3233,7 +3233,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-28T09:20:36+00:00" "time": "2024-04-28T11:44:19+00:00"
}, },
{ {
"name": "symfony/framework-bundle", "name": "symfony/framework-bundle",
@@ -2,22 +2,34 @@
namespace App\Controller\Admin; namespace App\Controller\Admin;
use App\Repository\RoomAvailabilityRepository;
use App\Repository\RoomCategoryRepository;
use App\Entity\RoomAvailability; use App\Entity\RoomAvailability;
use App\Entity\RoomCategory; use App\Entity\RoomCategory;
use App\Repository\RoomAvailabilityRepository;
use App\Repository\RoomCategoryRepository;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Component\Security\Http\Attribute\IsGranted;
use EasyCorp\Bundle\EasyAdminBundle\Field\{TextField, DateField, AssociationField, NumberField};
#[IsGranted("ROLE_ADMIN")] #[IsGranted("ROLE_ADMIN")]
class RoomAvailabilityAdminController extends AbstractController class RoomAvailabilityAdminController extends AbstractController
{ {
private $adminUrlGenerator;
private EntityManagerInterface $entityManager;
public function __construct(AdminUrlGenerator $adminUrlGenerator, EntityManagerInterface $em)
{
$this->adminUrlGenerator = $adminUrlGenerator;
$this->entityManager = $em;
}
#[Route('/admin/roomAvailability', name: 'admin_roomAvailability')] #[Route('/admin/roomAvailability', name: 'admin_roomAvailability')]
public function index(RoomAvailabilityRepository $repo, RoomCategoryRepository $catRepo): Response public function index(RoomAvailabilityRepository $repo, RoomCategoryRepository $catRepo): Response
{ {
@@ -28,6 +40,7 @@ class RoomAvailabilityAdminController extends AbstractController
]); ]);
} }
// List RoomAvailability items from category.
#[Route('/admin/roomAvailability/{categoryId}', name: 'admin_roomAvailability_category')] #[Route('/admin/roomAvailability/{categoryId}', name: 'admin_roomAvailability_category')]
public function categoryAvailability(RoomAvailabilityRepository $repo, RoomCategoryRepository $catRepo, string $categoryId): Response public function categoryAvailability(RoomAvailabilityRepository $repo, RoomCategoryRepository $catRepo, string $categoryId): Response
{ {
@@ -40,6 +53,83 @@ class RoomAvailabilityAdminController extends AbstractController
]); ]);
} }
// Edit a RoomAvailability numAvailable.
#[Route('/admin/roomAvailability/edit/{categoryId}/{day}', name: 'admin_roomAvailability_category_update')]
public function updateCategoryAvailability(Request $request, RoomAvailabilityRepository $repo, string $categoryId, string $day): Response
{
$availabilityItem = $repo->find(["day" => $day, "roomCategory" => $categoryId]);
if ($availabilityItem == null) {
//TODOME: Aquí deberíamos llevar a una página de error o algo.
$url = $this->adminUrlGenerator->setRoute('admin_roomAvailability_category', [
'categoryId' => $item->getId(),
])->generateUrl();
return $this->redirect($url);
}
$form = $this->createFormBuilder($availabilityItem)
->add('numAvailable', NumberType::class, ['label' => 'Num Available'])
->add('save', SubmitType::class, ['label' => 'Update value'])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
// but, the original `$availabilityItem` variable has also been updated
$this->entityManager->flush();
$url = $this->adminUrlGenerator->setRoute('admin_roomAvailability_category', [
'categoryId' => $categoryId,
])->generateUrl();
return $this->redirect($url);
}
return $this->render('admin/room_availability/availability_day_edit.html.twig', [
'form' => $form,
'availabilityData' => $availabilityItem,
]);
}
// Bulk edit all roomAvailability of a category on period.
#[Route('/admin/roomAvailability/{categoryId}/bulkedit', name: 'admin_roomAvailability_category_bulkupdate')]
public function bulkUpdateCategoryAvailability(Request $request, RoomAvailabilityRepository $repo, string $categoryId): Response
{
$form = $this->createFormBuilder()
->add('startDate', DateType::class, [
'widget' => 'single_text',
])
->add('endDate', DateType::class, [
'widget' => 'single_text',
])
->add('numAvailable', NumberType::class, [
'label' => 'Num Available',
])
->add('save', SubmitType::class, ['label' => 'Update value'])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
$data = $form->getData();
$categoryItem = $this->entityManager->find(RoomCategory::class, $categoryId);
$repo->bulkEditRoomAvailabilityForCategoryOnPeriod($categoryItem, $data['startDate'], $data['endDate'], $data['numAvailable']);
$url = $this->adminUrlGenerator->setRoute('admin_roomAvailability')->generateUrl();
return $this->redirect($url);
}
return $this->render('admin/room_availability/availability_bulk_edit.html.twig', [
'form' => $form,
'categoryId' => $categoryId,
]);
}
#[Route('/admin/roomAvailabilityTEST/', name: 'admin_roomAvailability_test')] #[Route('/admin/roomAvailabilityTEST/', name: 'admin_roomAvailability_test')]
public function availabilityTest(EntityManagerInterface $entityManager): Response public function availabilityTest(EntityManagerInterface $entityManager): Response
{ {
@@ -33,13 +33,13 @@ class SomniaDashboardController extends AbstractDashboardController
yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home'); yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
yield MenuItem::Section('Booking Management'); yield MenuItem::Section('Booking Management');
yield MenuItem::linkToCrud('Bookings', 'fas fa-door-open', Booking::class); yield MenuItem::linkToCrud('Bookings', 'fas fa-book', Booking::class);
yield MenuItem::Section('Room Management'); yield MenuItem::Section('Room Management');
yield MenuItem::linkToCrud('Category', 'fas fa-door-open', RoomCategory::class); yield MenuItem::linkToCrud('Category', 'fas fa-layer-group', RoomCategory::class);
yield MenuItem::linkToRoute('Room Availability', 'fas fa-calendar-check', 'admin_roomAvailability'); yield MenuItem::linkToRoute('Room Availability', 'fas fa-calendar-check', 'admin_roomAvailability');
yield MenuItem::linkToCrud('Fare Tables', 'fas fa-door-open', FareTable::class); yield MenuItem::linkToCrud('Fare Tables', 'fas fa-table', FareTable::class);
yield MenuItem::linkToCrud('Room Fares', 'fas fa-door-open', RoomFare::class); yield MenuItem::linkToCrud('Room Fares', 'fas fa-tag', RoomFare::class);
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);
+46 -7
View File
@@ -7,6 +7,8 @@ use App\Entity\BookingCustomer;
use App\Entity\BookingRoom; use App\Entity\BookingRoom;
use App\Repository\BookingRepository; use App\Repository\BookingRepository;
use App\Repository\RoomCategoryRepository; use App\Repository\RoomCategoryRepository;
use App\Repository\RoomAvailabilityRepository;
use App\Service\PricesService;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\JsonResponse;
@@ -41,13 +43,16 @@ class BookingController extends AbstractController
} }
#[Route('/api/booking/create', name: 'app_booking_create')] #[Route('/api/booking/create', name: 'app_booking_create')]
public function newBooking(Request $request, BookingRepository $repoBooking, EntityManagerInterface $entityManager, RoomCategoryRepository $repoCat): JsonResponse public function newBooking(Request $request, BookingRepository $repoBooking, EntityManagerInterface $entityManager,
RoomCategoryRepository $repoCat, RoomAvailabilityRepository $repoAvailability,
PricesService $priceSrv): JsonResponse
{ {
$payload = $request->toArray(); $payload = $request->toArray();
if (\is_null($payload)) { if (\is_null($payload)) {
throw new \Exception('Invalid Payload', 400); throw new \Exception('Invalid Payload', 400);
} }
$booking = new Booking(); $booking = new Booking();
try { try {
$reqArrivalDate = $payload["arrivalDate"]; $reqArrivalDate = $payload["arrivalDate"];
@@ -65,11 +70,17 @@ class BookingController extends AbstractController
$currentTime = new \DateTime(); $currentTime = new \DateTime();
// Create booking from request data. // Create booking from request data.
//$booking = new Booking();
$booking->setBookingTime($currentTime); $booking->setBookingTime($currentTime);
$booking->setArrivalDate($arrivalDate); $booking->setArrivalDate($arrivalDate);
$booking->setDepartureDate($departureDate); $booking->setDepartureDate($departureDate);
$booking->setRefNumber($currentTime->format("Y") . "001");
$highest_id = $entityManager->createQueryBuilder()
->select('MAX(e.id)')
->from('App\Entity\Booking', 'e')
->getQuery()
->getSingleScalarResult();
$booking->setRefNumber($currentTime->format("Y") . $highest_id + 1);
$entityManager->persist($booking); $entityManager->persist($booking);
@@ -89,22 +100,50 @@ class BookingController extends AbstractController
throw new HttpException(400, "Se debe indicar al menos una habitación"); throw new HttpException(400, "Se debe indicar al menos una habitación");
} }
// Create each room.
foreach ($reqRoomList as $roomItem) { foreach ($reqRoomList as $roomItem) {
$room = new BookingRoom(); $room = new BookingRoom();
$room->setBooking($booking); $room->setBooking($booking);
//Get Room category. //Get Room category.
$roomCategory = $repoCat->find($roomItem["roomCategory"]); $roomCategory = $repoCat->find($roomItem["roomCategory"]);
if($roomCategory == null) { if ($roomCategory == null) {
throw new HttpException(400, "La RoomCategory no es válida."); throw new HttpException(400, "La RoomCategory no es válida.");
} }
//Check room availability.
$amountAvailable = $repoAvailability->getAvailabilityForCategoryInPeriod($roomCategory, $arrivalDate, $departureDate);
$selectedAmount = $roomItem['amount'];
$selectedGuestAmount = $roomItem["guestNumber"];
if($amountAvailable == null || $selectedAmount > $amountAvailable) {
throw new HttpException(400, "No se pueden reservar más habitaciones de las disponibles.");
}
$room->setRoomCategory($roomCategory); $room->setRoomCategory($roomCategory);
$room->setGuestNumber($roomItem["guestNumber"]); $room->setGuestNumber($selectedGuestAmount);
$room->setAmount($roomItem["amount"]); $room->setAmount($selectedAmount);
$room->setRoomPrice(5000);
//Get Price for period.
$priceList = $priceSrv->getFinalPricesForSearch($roomCategory, $arrivalDate, $departureDate);
$priceFound = false;
foreach ($priceList as $key => $value) {
if($key == $selectedGuestAmount) {
$room->setRoomPrice($value);
$priceFound = true;
break;
}
}
if(!$priceFound) {
throw new HttpException(500,
"No se puedo obtener el precio para la categoría: " . $roommCategory->getId() . " , guests: " . $selecctedGuestAmount);
}
$entityManager->persist($room); $entityManager->persist($room);
//If booking is nice, let's update current availability.
$repoAvailability->updateAvailabilityForRoomCategoryOnPeriod($roomCategory, $arrivalDate, $departureDate, $selectedAmount, true); //Update using "diff" mode.
} }
$entityManager->commit(); $entityManager->commit();
+5 -1
View File
@@ -29,7 +29,7 @@ class RoomAvailability
public function setDay(\DateTimeInterface $day): static public function setDay(\DateTimeInterface $day): static
{ {
$this->day = $day->format("Ymd"); $this->day = $day->format("Y-m-d");
return $this; return $this;
} }
@@ -57,4 +57,8 @@ class RoomAvailability
return $this; return $this;
} }
public function modNumAvailable(int $diffAmount):void {
$this->numAvailable -= $diffAmount;
}
} }
+108 -5
View File
@@ -3,6 +3,7 @@
namespace App\Repository; namespace App\Repository;
use App\Entity\RoomAvailability; use App\Entity\RoomAvailability;
use App\Entity\RoomCategory;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
@@ -34,7 +35,6 @@ class RoomAvailabilityRepository extends ServiceEntityRepository
->getResult(); ->getResult();
} }
/** /**
* @param \DateTimeInterface Period start (included in range). * @param \DateTimeInterface Period start (included in range).
* @param \DateTimeInterface Period end (not included in range). * @param \DateTimeInterface Period end (not included in range).
@@ -53,8 +53,30 @@ class RoomAvailabilityRepository extends ServiceEntityRepository
->setParameter('startDate', $strStartDate) ->setParameter('startDate', $strStartDate)
->setParameter('endDate', $strEndDate) ->setParameter('endDate', $strEndDate)
->getQuery() ->getQuery()
->getArrayResult() ->getArrayResult();
; }
/**
* @param \DateTimeInterface Period start (included in range).
* @param \DateTimeInterface Period end (not included in range).
* @return int Returns number of available room of that category on selected period.
*/
public function getAvailabilityForCategoryInPeriod(RoomCategory $roomCategory, \DateTimeInterface $startDate, \DateTimeInterface $endDate): int | null
{
$strStartDate = $startDate->format('Y-m-d');
$strEndDate = $endDate->format('Y-m-d');
$roomCatId = $roomCategory->getId();
return $this->createQueryBuilder('ra')
->select('MIN(ra.numAvailable) as availability')
->andWhere('ra.day >= :startDate')
->andWhere('ra.day < :endDate')
->andWhere('ra.roomCategory = :roomCategory')
->setParameter('roomCategory', $roomCatId)
->setParameter('startDate', $strStartDate)
->setParameter('endDate', $strEndDate)
->getQuery()
->getSingleScalarResult();
} }
public function getAvailabilityForPeriodDetails(\DateTimeInterface $startDate, \DateTimeInterface $endDate): array public function getAvailabilityForPeriodDetails(\DateTimeInterface $startDate, \DateTimeInterface $endDate): array
@@ -68,7 +90,88 @@ class RoomAvailabilityRepository extends ServiceEntityRepository
->setParameter('startDate', $strStartDate) ->setParameter('startDate', $strStartDate)
->setParameter('endDate', $strEndDate) ->setParameter('endDate', $strEndDate)
->getQuery() ->getQuery()
->getArrayResult() ->getArrayResult();
;
} }
/**
* Updates All Availability of selected roomCategory during period. It can operate in 2 modes, normal and diff mode.
* - Normal mode -> Sets value.
* - Diff mode -> apply value as sum ( currentAvailability += diff )
* NOTE: A Flush is needed after this operation.
*/
public function updateAvailabilityForRoomCategoryOnPeriod(RoomCategory $roomCategory, \DateTimeInterface $startDate, \DateTimeInterface $endDate, int $amount, bool $isDiff = false): void
{
$strStartDate = $startDate->format('Y-m-d');
$strEndDate = $endDate->format('Y-m-d');
$roomCatId = $roomCategory->getId();
$availabilityItemList = $this->createQueryBuilder('ra')
->andWhere('ra.day >= :startDate')
->andWhere('ra.day < :endDate')
->andWhere('ra.roomCategory = :roomCategory')
->setParameter('roomCategory', $roomCatId)
->setParameter('startDate', $strStartDate)
->setParameter('endDate', $strEndDate)
->getQuery()
->getResult();
$em = $this->getEntityManager();
foreach ($availabilityItemList as $item) {
if ($isDiff) {
$item->modNumAvailable($amount);
} else {
$item->setNumAvailable($amount);
}
}
}
/**
* For a given RoomCategory, sets its availability for all days on a period with the given amount.
*/
public function bulkEditRoomAvailabilityForCategoryOnPeriod(RoomCategory $roomCategory, \DateTimeInterface $startDate, \DateTimeInterface $endDate, int $amount): void
{
$strStartDate = $startDate->format('Y-m-d');
$strEndDate = $endDate->format('Y-m-d');
$roomCatId = $roomCategory->getId();
$entityManager = $this->getEntityManager();
$entityManager->beginTransaction();
try {
//First, delete old data.
$this->createQueryBuilder('ra')
->delete()
->andWhere('ra.day >= :startDate')
->andWhere('ra.day < :endDate')
->andWhere('ra.roomCategory = :roomCategory')
->setParameter('roomCategory', $roomCatId)
->setParameter('startDate', $strStartDate)
->setParameter('endDate', $strEndDate)
->getQuery()
->execute();
$entityManager->flush();
//For each day, create item and persist it.
$daterange = new \DatePeriod($startDate, new \DateInterval('P1D'), $endDate);
foreach ($daterange as $date) {
$item = new RoomAvailability();
$item->setRoomCategory($roomCategory);
$item->setDay($date);
$item->setNumAvailable($amount);
$entityManager->persist($item);
}
$entityManager->flush();
$entityManager->commit();
} catch (\Throwable $th) {
$entityManager->rollback();
throw $th;
}
}
} }
@@ -0,0 +1,10 @@
{# templates/admin/room_availability/availability_day_edit.html.twig #}
{% extends '@EasyAdmin/page/content.html.twig' %}
{% block content_title 'Category - Room Availability - Edit' %}
{% block main %}
<div>
<h3>{{categoryId}}</h3>
</div>
{{ form(form) }}
{% endblock %}
@@ -0,0 +1,10 @@
{# templates/admin/room_availability/availability_day_edit.html.twig #}
{% extends '@EasyAdmin/page/content.html.twig' %}
{% block content_title 'Room Availability - Edit' %}
{% block main %}
<div>
<h3>{{availabilityData.day |date('d-m-Y')}}</h3>
</div>
{{ form(form) }}
{% endblock %}
@@ -1,4 +1,4 @@
{# templates/admin/room_availability/index.html.twig #} {# templates/admin/room_availability/category_view.html.twig #}
{% extends '@EasyAdmin/page/content.html.twig' %} {% extends '@EasyAdmin/page/content.html.twig' %}
{% block content_title 'Room Availability' %} {% block content_title 'Room Availability' %}
@@ -18,6 +18,11 @@
<tr> <tr>
<td>{{availability.day |date('d-m-Y')}}</td> <td>{{availability.day |date('d-m-Y')}}</td>
<td>{{availability.numAvailable}}</td> <td>{{availability.numAvailable}}</td>
<td>
<a href="{{ ea_url().setRoute('admin_roomAvailability_category_update', { day: availability.day |date('Y-m-d'), categoryId: categoryData.id }) }}">
Edit
</a>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@@ -6,19 +6,27 @@
<table class="datagrid"> <table class="datagrid">
<thead> <thead>
<tr> <tr>
<td>ID</td>
<td>Category</td> <td>Category</td>
<td>Details</td> <td>Details</td>
<td>Period update</td>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for category in roomCategoryList %} {% for category in roomCategoryList %}
<tr> <tr>
<td>{{category.id}}</td>
<td>{{category.name}}</td> <td>{{category.name}}</td>
<td> <td>
<a href="{{ ea_url().setRoute('admin_roomAvailability_category', { categoryId: category.id }) }}"> <a href="{{ ea_url().setRoute('admin_roomAvailability_category', { categoryId: category.id }) }}">
View Details View Details
</a> </a>
</td> </td>
<td>
<a href="{{ ea_url().setRoute('admin_roomAvailability_category_bulkupdate', { categoryId: category.id }) }}">
Update Period
</a>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>