<?php
namespace App\Entity;
use App\Repository\BookingConstraintRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface;
use Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait;
#[ORM\Entity(repositoryClass: BookingConstraintRepository::class)]
#[ORM\HasLifecycleCallbacks]
class BookingConstraint implements TranslatableInterface
{
use TranslatableTrait;
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: "integer")]
private $id;
#[ORM\Column(type: "boolean")]
private $status;
#[ORM\Column(type: "integer")]
private $maxNumber;
#[ORM\Column(type: "integer")]
private $minDuration;
#[ORM\Column(type: "integer")]
private $maxDuration;
#[ORM\OneToMany(targetEntity: BookingConstraintPeriod::class, mappedBy: "bookingConstraint", orphanRemoval: true, cascade: ["persist", "remove"])]
private $unavailablePeriods;
#[ORM\OneToMany(targetEntity: Booking::class, mappedBy: "bookingConstraint")]
private $bookings;
#[ORM\Column(type: "float", nullable: true)]
private $advancePayment;
#[ORM\Column(type: "integer")]
private $deposit;
#[ORM\OneToMany(targetEntity: BookingPaymentMethod::class, mappedBy: "bookingConstraint", cascade: ["persist", "remove"])]
private $paymentMethods;
#[ORM\Column(type: "float")]
private $longStayDiscount;
#[ORM\OneToMany(targetEntity: BookingConstraintSaison::class, mappedBy: "bookingConstraint", orphanRemoval: true, cascade: ["persist", "remove"])]
private $saisons;
#[ORM\Column(type: "integer")]
private $balancePaymentDeadline;
#[ORM\Column(type: "integer")]
private $advancePaymentDeadline;
#[ORM\Column(type: "integer")]
private $offDuration;
#[ORM\Column(type: "integer")]
private $blockedDaysAfterNow;
#[ORM\Column(type: "integer")]
private $soonBookingPaymentDelay;
#[ORM\Column(type: "time")]
private $startHour;
#[ORM\Column(type: "time")]
private $endHour;
#[ORM\Column(type: "integer")]
private $surface;
#[ORM\Column(type: "integer", nullable: true)]
private $housework;
#[ORM\Column(type: "integer")]
private $cautionPaymentDelay;
#[ORM\Column(type: "float")]
private $stayTax;
/**
* Permet d'obtenir un tableau des jours qui ne sont pas disponibles pour annonce
*
* @return array un tableau d'objets DateTime representant les jours d'occupation
*/
public function getNotAvailableDays()
{
$notAvailableDays = [];
foreach ($this->bookings as $booking) {
$startDate = clone $booking->getStartDate();
$endDate = clone $booking->getEndDate();
//Calculer les jours qui se trouvent entre la date d'arriver et de départ
$resultat = range(
$startDate->modify('-' . $this->offDuration . ' day')->getTimestamp(),
$endDate->modify('+' . $this->offDuration . ' day')->getTimestamp(),
24 * 60 * 60
);
$days = array_map(function ($dayTimestamp) {
return new \DateTime(date('Y-m-d', $dayTimestamp));
}, $resultat);
$notAvailableDays = array_merge($notAvailableDays, $days);
}
foreach ($this->unavailablePeriods as $period) {
//Calculer les jours qui se trouvent entre le debut et la fin de chaque periode
$resultat = range(
$period->getStartDate()->getTimestamp(),
$period->getEndDate()->getTimestamp(),
24 * 60 * 60
);
$days = array_map(function ($dayTimestamp) {
return new \DateTime(date('Y-m-d', $dayTimestamp));
}, $resultat);
$notAvailableDays = array_merge($notAvailableDays, $days);
}
return $notAvailableDays;
}
public function __construct()
{
$this->unavailablePeriods = new ArrayCollection();
$this->bookings = new ArrayCollection();
$this->paymentMethods = new ArrayCollection();
$this->saisons = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getStatus(): ?bool
{
return $this->status;
}
public function setStatus(bool $status): self
{
$this->status = $status;
return $this;
}
public function getMaxNumber(): ?int
{
return $this->maxNumber;
}
public function setMaxNumber(int $maxNumber): self
{
$this->maxNumber = $maxNumber;
return $this;
}
public function getMinDuration(): ?int
{
return $this->minDuration;
}
public function setMinDuration(int $minDuration): self
{
$this->minDuration = $minDuration;
return $this;
}
public function getMaxDuration(): ?int
{
return $this->maxDuration;
}
public function setMaxDuration(int $maxDuration): self
{
$this->maxDuration = $maxDuration;
return $this;
}
/**
* @return Collection|BookingConstraintPeriod[]
*/
public function getUnavailablePeriods(): Collection
{
return $this->unavailablePeriods;
}
public function addUnavailablePeriod(BookingConstraintPeriod $unavailablePeriod): self
{
if (!$this->unavailablePeriods->contains($unavailablePeriod)) {
$this->unavailablePeriods[] = $unavailablePeriod;
$unavailablePeriod->setBookingConstraint($this);
}
return $this;
}
public function removeUnavailablePeriod(BookingConstraintPeriod $unavailablePeriod): self
{
if ($this->unavailablePeriods->removeElement($unavailablePeriod)) {
// set the owning side to null (unless already changed)
if ($unavailablePeriod->getBookingConstraint() === $this) {
$unavailablePeriod->setBookingConstraint(null);
}
}
return $this;
}
/**
* @return Collection|Booking[]
*/
public function getBookings(): Collection
{
return $this->bookings;
}
public function addBooking(Booking $booking): self
{
if (!$this->bookings->contains($booking)) {
$this->bookings[] = $booking;
$booking->setBookingConstraint($this);
}
return $this;
}
public function removeBooking(Booking $booking): self
{
if ($this->bookings->removeElement($booking)) {
// set the owning side to null (unless already changed)
if ($booking->getBookingConstraint() === $this) {
$booking->setBookingConstraint(null);
}
}
return $this;
}
public function getAdvancePayment(): ?float
{
return $this->advancePayment;
}
public function setAdvancePayment(?float $advancePayment): self
{
$this->advancePayment = $advancePayment;
return $this;
}
public function getDeposit(): ?int
{
return $this->deposit;
}
public function setDeposit(int $deposit): self
{
$this->deposit = $deposit;
return $this;
}
/**
* @return Collection|BookingPaymentMethod[]
*/
public function getPaymentMethods(): Collection
{
return $this->paymentMethods;
}
public function addPaymentMethod(BookingPaymentMethod $paymentMethod): self
{
if (!$this->paymentMethods->contains($paymentMethod)) {
$this->paymentMethods[] = $paymentMethod;
$paymentMethod->setBookingConstraint($this);
}
return $this;
}
public function removePaymentMethod(BookingPaymentMethod $paymentMethod): self
{
if ($this->paymentMethods->removeElement($paymentMethod)) {
// set the owning side to null (unless already changed)
if ($paymentMethod->getBookingConstraint() === $this) {
$paymentMethod->setBookingConstraint(null);
}
}
return $this;
}
public function getLongStayDiscount(): ?float
{
return $this->longStayDiscount;
}
public function setLongStayDiscount(?float $longStayDiscount): self
{
$this->longStayDiscount = $longStayDiscount;
return $this;
}
/**
* @return Collection|BookingConstraintSaison[]
*/
public function getSaisons(): Collection
{
return $this->saisons;
}
public function addSaison(BookingConstraintSaison $saison): self
{
if (!$this->saisons->contains($saison)) {
$this->saisons[] = $saison;
$saison->setBookingConstraint($this);
}
return $this;
}
public function removeSaison(BookingConstraintSaison $saison): self
{
if ($this->saisons->removeElement($saison)) {
// set the owning side to null (unless already changed)
if ($saison->getBookingConstraint() === $this) {
$saison->setBookingConstraint(null);
}
}
return $this;
}
public function getBalancePaymentDeadline(): ?int
{
return $this->balancePaymentDeadline;
}
public function setBalancePaymentDeadline(int $balancePaymentDeadline): self
{
$this->balancePaymentDeadline = $balancePaymentDeadline;
return $this;
}
public function getAdvancePaymentDeadline(): ?int
{
return $this->advancePaymentDeadline;
}
public function setAdvancePaymentDeadline(int $advancePaymentDeadline): self
{
$this->advancePaymentDeadline = $advancePaymentDeadline;
return $this;
}
public function getOffDuration(): ?int
{
return $this->offDuration;
}
public function setOffDuration(int $offDuration): self
{
$this->offDuration = $offDuration;
return $this;
}
public function getBlockedDaysAfterNow(): ?int
{
return $this->blockedDaysAfterNow;
}
public function setBlockedDaysAfterNow(int $blockedDaysAfterNow): self
{
$this->blockedDaysAfterNow = $blockedDaysAfterNow;
return $this;
}
public function getSoonBookingPaymentDelay(): ?int
{
return $this->soonBookingPaymentDelay;
}
public function setSoonBookingPaymentDelay(int $soonBookingPaymentDelay): self
{
$this->soonBookingPaymentDelay = $soonBookingPaymentDelay;
return $this;
}
public function getStartHour(): ?\DateTimeInterface
{
return $this->startHour;
}
public function setStartHour(\DateTimeInterface $startHour): self
{
$this->startHour = $startHour;
return $this;
}
public function getEndHour(): ?\DateTimeInterface
{
return $this->endHour;
}
public function setEndHour(\DateTimeInterface $endHour): self
{
$this->endHour = $endHour;
return $this;
}
public function getSurface(): ?int
{
return $this->surface;
}
public function setSurface(int $surface): self
{
$this->surface = $surface;
return $this;
}
public function getHousework(): ?int
{
return $this->housework;
}
public function setHousework(?int $housework): self
{
$this->housework = $housework;
return $this;
}
public function getCautionPaymentDelay(): ?int
{
return $this->cautionPaymentDelay;
}
public function setCautionPaymentDelay(int $cautionPaymentDelay): self
{
$this->cautionPaymentDelay = $cautionPaymentDelay;
return $this;
}
public function getStayTax(): ?float
{
return $this->stayTax;
}
public function setStayTax(float $stayTax): self
{
$this->stayTax = $stayTax;
return $this;
}
}