<?php
namespace App\Service;
use App\Entity\Booking;
use App\Interfaces\BookingsInterface;
use App\Interfaces\IHotels;
use App\Interfaces\OrderInterface;
use App\Repository\BookingRepository;
use App\Vendor\Helper;
use App\Vendor\Symfony\HAbstractService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class BookingService extends HAbstractService implements BookingsInterface
{
private IHotels $hotelsService;
function __construct(ContainerBagInterface $bag, EntityManagerInterface $em, KernelInterface $kernel, TranslatorInterface $translator, IHotels $hotelsService)
{
parent::__construct($bag, $em, $kernel, $translator);
$this->hotelsService = $hotelsService;
}
public function getBookings($userId, $status = 1)
{
/** @var BookingRepository $repo */
$repo = $this->em->getRepository(Booking::class);
$completedBookingsModels = $repo->getBookingList($userId, 1);
$canceledBookingsModels = $repo->getBookingList($userId, 2);
$completedBookings = [];
foreach ($completedBookingsModels as $completedBooking){
$hotel = $this->hotelsService->getByHotelId($completedBooking['hotelId'], $this->request->getLocale());
$hotelImages = $this->hotelsService->hotelImages($hotel[0]["images"]);
$rate = $repo->getRateByBookingId($completedBooking['id']);
$booking = [
'id' => $completedBooking['id'],
'hotel' => $this->hotelsService->getByHotelId($completedBooking['hotelId'], $this->request->getLocale()),
'images' => $hotelImages,
'rate' => $rate,
'partnerId' => $completedBooking["partnerOrderId"],
'orderId' => $completedBooking["orderId"],
'voucherPath' => $completedBooking["voucher"],
'voucherName' => $completedBooking["voucherName"],
];
$completedBookings[] = $booking;
}
$canceledBookings = [];
foreach ($canceledBookingsModels as $canceledBooking){
$hotel = $this->hotelsService->getByHotelId($canceledBooking['hotelId'], $this->request->getLocale());
$hotelImages = $this->hotelsService->hotelImages($hotel[0]["images"]);
$booking = [
'id' => $canceledBooking['id'],
'hotel' => $this->hotelsService->getByHotelId($canceledBooking['hotelId'], $this->request->getLocale()),
'images' => $hotelImages,
'rate' => $repo->getRateByBookingId($canceledBooking['id'])
];
$canceledBookings[] = $booking;
}
return [
'completedBookings' => $completedBookings,
'canceledBookings' => $canceledBookings,
];
}
public function setVoucher($orderId, $pdfData){
$file = $pdfData["voucherPath"];
$name = $pdfData["voucher"];
/** @var Booking $booking */
$booking = $this->em->getRepository(Booking::class)->findOneBy(["orderId" => $orderId]);
if(!empty($booking)){
$booking->setVoucher($file);
$booking->setVoucherName($name);
$this->em->persist($booking);
$this->em->flush();
}
}
public function setHotelId($orderId, $hotelId){
/** @var Booking $booking */
$booking = $this->em->getRepository(Booking::class)->findOneBy(["orderId" => $orderId]);
if(!empty($booking)){
$booking->setHotelId($hotelId);
$this->em->persist($booking);
$this->em->flush();
}
}
public function setBookingStatus($orderId, $status){
/** @var Booking $booking */
$booking = $this->em->getRepository(Booking::class)->findOneBy(["orderId" => $orderId]);
if(!empty($booking)){
$booking->setBookingStatus($status);
if($status == OrderInterface::STATUS_COMPLETED){
$booking->setCompletedDate(new \DateTime());
}
if($status == OrderInterface::STATUS_CANCELED){
$booking->setCanceledDate(new \DateTime());
}
$this->em->persist($booking);
$this->em->flush();
}
}
public function getBookingByPartnerId($partnerId): Booking{
/** @var Booking $booking */
$booking = $this->em->getRepository(Booking::class)->findOneBy(["partnerOrderId" => $partnerId]);
return $booking;
}
public function getRateBy($hotel,$book_hash){
$currentRate = [];
$room_groups = $hotel["room_groups"];
foreach ($room_groups as $room_group){
$rates = $room_group["rates"];
foreach ($rates as $rate){
if($rate["book_hash"] == $book_hash){
$currentRate = $rate;
break;
}
}
}
return $currentRate;
}
public function hotelStartData(){
$session = $this->request->getSession();
$hotelData = unserialize($session->get('hotel'));
$params = $this->getParams();
$currentRate = $this->getRateBy($hotelData, $params["b_hash"]);
$params["hotel"]["check_in_time"] = $hotelData["check_in_time"];
$params["hotel"]["check_out_time"] = $hotelData["check_out_time"];
$params["hotel"]["name"] = $hotelData["name"];
$params["hotel"]["address"] = $hotelData["address"];
$params["hotel"]["star_rating"] = $hotelData["star_rating"];
$params["hotel"]["image"]= null;
if(!empty($hotelData["images"]) && !empty($hotelData["images"]["crop100"])){
$params["hotel"]["image"] = $hotelData["images"]["crop100"][0];
}
$session->set('rate', json_encode($currentRate));
$roomsCount = 0;
$adultsCount = 0;
$childrenCount = 0;
if(!empty($params["search"]["guests"])){
foreach ($params["search"]["guests"] as &$room){
$roomsCount++;
$adultsCount += (int)$room["adults"];
$c = 0;
foreach ($room["children"] as $ind=>&$child){
if($child == "NaN"){
unset($room["children"][$ind]);
continue;
}
$c++;
}
$childrenCount += $c;
}
$params["roomsCount"] = $roomsCount;
$params["adultsCount"] = $adultsCount;
$params["childrenCount"] = $childrenCount;
$params["days"] = Helper::dateDiffInDays($params["search"]["checkin"], $params["search"]["checkout"]);
}
$params["_locale"] = $this->request->getLocale();
$session->set('all_params', $params);
return $params;
}
}