src/Entity/Auction.php line 20

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Entity\Bid;
  4. use App\Entity\User;
  5. use App\Entity\Vehicle;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7. use Doctrine\Common\Collections\Collection;
  8. use Doctrine\ORM\Mapping as ORM;
  9. use Gedmo\Mapping\Annotation as Gedmo;
  10. /**
  11.  * Single vehicle auction.
  12.  *
  13.  * @ORM\Entity(repositoryClass="App\Repository\AuctionRepository")
  14.  *
  15.  * @ORM\Table(name="auction")
  16.  */
  17. class Auction
  18. {
  19.     /**
  20.      * @ORM\Id
  21.      *
  22.      * @ORM\Column(type="integer")
  23.      *
  24.      * @ORM\GeneratedValue(strategy="AUTO")
  25.      */
  26.     protected $id;
  27.     /**
  28.      * @ORM\OneToOne(targetEntity="App\Entity\Vehicle", inversedBy="auction", fetch="EAGER", cascade={"persist"})
  29.      *
  30.      * @ORM\JoinColumn(name="vehicle_id", referencedColumnName="id", onDelete="CASCADE")
  31.      */
  32.     protected $vehicle;
  33.     /**
  34.      * Users participating in this auction.
  35.      *
  36.      * @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="auctions", cascade={"persist"})
  37.      *
  38.      * @ORM\JoinTable(name="auction_bidders",
  39.      *      joinColumns={@ORM\JoinColumn(name="auction_id", referencedColumnName="id")},
  40.      *      inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
  41.      *      )
  42.      */
  43.     protected $users;
  44.     /**
  45.      * @ORM\OneToMany(targetEntity="App\Entity\Bid", mappedBy="auction", cascade={"persist"})
  46.      *
  47.      * @ORM\OrderBy({"amount" = "DESC", "biddedAt" = "ASC", "timestamp" = "ASC"})
  48.      */
  49.     protected $bids;
  50.     /**
  51.      * @Gedmo\Timestampable(on="create")
  52.      *
  53.      * @ORM\Column(type="datetime", name="created_at")
  54.      */
  55.     protected $createdAt;
  56.     /**
  57.      * @Gedmo\Timestampable(on="update")
  58.      *
  59.      * @ORM\Column(type="datetime", name="updated_at")
  60.      */
  61.     protected $updatedAt;
  62.     /**
  63.      * @ORM\Column(type="datetime", name="opened_At")
  64.      */
  65.     protected $openedAt;
  66.     /**
  67.      * @ORM\Column(type="datetime", name="closes_at")
  68.      */
  69.     protected $closedAt;
  70.     /**
  71.      * @ORM\Column(type="datetime", name="paused_at", nullable=true)
  72.      */
  73.     protected $pausedAt;
  74.     /**
  75.      * @ORM\Column(type="integer", name="paused_Ms")
  76.      */
  77.     protected $pausedMs 0;
  78.     /**
  79.      * @ORM\Column(type="boolean")
  80.      **/
  81.     private $biddedDuringPause false;
  82.     public function __construct(Vehicle $vehicle)
  83.     {
  84.         $this->setVehicle($vehicle);
  85.         $vehicle->setAuction($this);
  86.         $this->setWinningBidAmount(0);
  87.         $this->users = new ArrayCollection();
  88.         $this->bids = new ArrayCollection();
  89.         $this->openedAt $vehicle->getEvent()->getSale()->getStartDate();
  90.         $this->closedAt $vehicle->getEvent()->getSale()->getEndDate();
  91.     }
  92.     public function getId(): ?int
  93.     {
  94.         return $this->id;
  95.     }
  96.     /**
  97.      * Returns the vehicle.
  98.      *
  99.      * @return Vehicle
  100.      */
  101.     public function getVehicle()
  102.     {
  103.         return $this->vehicle;
  104.     }
  105.     /**
  106.      * Sets the vehicle.
  107.      */
  108.     public function setVehicle(Vehicle $vehicle): void
  109.     {
  110.         $this->vehicle $vehicle;
  111.     }
  112.     public function getWinner()
  113.     {
  114.         return $this->getVehicle()->getWinner();
  115.     }
  116.     public function setWinner($winner null): void
  117.     {
  118.         $this->getVehicle()->setWinner($winner);
  119.     }
  120.     public function isWinner(?User $user null)
  121.     {
  122.         if (null !== $this->getWinner()) {
  123.             return $this->getWinner() === $user;
  124.         }
  125.         return false;
  126.     }
  127.     /**
  128.      * Return all users participating in this auction.
  129.      *
  130.      * @return Collection
  131.      */
  132.     public function getUsers()
  133.     {
  134.         return $this->users;
  135.     }
  136.     /**
  137.      * Sets users participating in this auction.
  138.      */
  139.     public function setUsers(Collection $users): void
  140.     {
  141.         $this->users $users;
  142.     }
  143.     /**
  144.      * Adds user to this auction.
  145.      */
  146.     public function addUser(?User $user null): void
  147.     {
  148.         if (null !== $user && !$this->isParticipating($user)) {
  149.             $this->users[] = $user;
  150.         }
  151.     }
  152.     /**
  153.      * Removes user from this auction.
  154.      */
  155.     public function removeUser(User $user): void
  156.     {
  157.         if ($this->isParticipating($user)) {
  158.             $this->users->removeElement($user);
  159.         }
  160.     }
  161.     /**
  162.      * Is user participating?
  163.      *
  164.      * @return bool
  165.      */
  166.     public function isParticipating(User $user)
  167.     {
  168.         return $this->users->contains($user);
  169.     }
  170.     /**
  171.      * Returns all bids made on this auction.
  172.      *
  173.      * @return Collection
  174.      */
  175.     public function getBids()
  176.     {
  177.         return $this->bids;
  178.     }
  179.     /**
  180.      * Sets bids to this auction.
  181.      */
  182.     public function setBids(Collection $bids): void
  183.     {
  184.         $this->bids $bids;
  185.     }
  186.     /**
  187.      * Adds bid.
  188.      */
  189.     public function addBid(Bid $bid): void
  190.     {
  191.         if (!$this->hasBid($bid)) {
  192.             $bid->setAuction($this);
  193.             $this->bids[] = $bid;
  194.         }
  195.     }
  196.     /**
  197.      * Removes bid from this auction.
  198.      */
  199.     public function removeBid(Bid $bid): void
  200.     {
  201.         if ($this->hasBid($bid)) {
  202.             $bid->setAuction(null);
  203.             $this->bids->removeElement($bid);
  204.         }
  205.     }
  206.     /**
  207.      * Checks if auction has bid.
  208.      */
  209.     public function hasBid(Bid $bid)
  210.     {
  211.         return $this->bids->contains($bid);
  212.     }
  213.     /**
  214.      * Checks whether there is any bid on auction or not.
  215.      *
  216.      * @return bool
  217.      */
  218.     public function hasFirstBid()
  219.     {
  220.         return !== $this->getWinningBidAmount();
  221.     }
  222.     public function hasBidded($user)
  223.     {
  224.         foreach ($user->getBids() as $bid) {
  225.             if ($bid->getAuction() === $this) {
  226.                 return true;
  227.             }
  228.         }
  229.         return false;
  230.     }
  231.     public function getWinningBid()
  232.     {
  233.         return $this->bids->first();
  234.     }
  235.     public function getHighestRealBid()
  236.     {
  237.         return $this
  238.             ->bids
  239.             ->filter(fn ($bid) => Bid::ORIGIN_ANIMATION !== $bid->getOrigin())
  240.             ->first()
  241.         ;
  242.     }
  243.     public function getWinningBidAmount()
  244.     {
  245.         if (null === $this->getVehicle()->getFinalAmount()) {
  246.             return 0;
  247.         }
  248.         return $this->getVehicle()->getFinalAmount();
  249.     }
  250.     public function setWinningBidAmount($amount): void
  251.     {
  252.         $this->getVehicle()->setFinalAmount($amount);
  253.     }
  254.     public function getCalculatedWinningBidAmount()
  255.     {
  256.         $vehicle $this->getVehicle();
  257.         if (=== intval($this->getWinningBidAmount())) {
  258.             return $vehicle->getStartingPrice() + $vehicle->getEvent()->getSale()->getBidIncrement();
  259.         }
  260.         return $this->getWinningBidAmount() + $vehicle->getEvent()->getSale()->getBidIncrement();
  261.     }
  262.     /**
  263.      * Returns time of creation.
  264.      *
  265.      * @return \DateTime
  266.      */
  267.     public function getCreatedAt()
  268.     {
  269.         return $this->createdAt;
  270.     }
  271.     /**
  272.      * Sets time of creation.
  273.      */
  274.     public function setCreatedAt(\DateTime $createdAt): void
  275.     {
  276.         $this->createdAt $createdAt;
  277.     }
  278.     /**
  279.      * Returns time of update.
  280.      *
  281.      * @return \DateTime
  282.      */
  283.     public function getUpdatedAt()
  284.     {
  285.         return $this->updatedAt;
  286.     }
  287.     /**
  288.      * Sets time of update.
  289.      */
  290.     public function setUpdatedAt(\DateTime $updatedAt): void
  291.     {
  292.         $this->updatedAt $updatedAt;
  293.     }
  294.     public function isOpen()
  295.     {
  296.         $now = new \DateTime('now');
  297.         return ($now $this->getOpenedAt() && $now $this->getClosedAt()) && Vehicle::SALING_STATE_NONE === $this->getVehicle()->getSalingState();
  298.     }
  299.     public function isClosed()
  300.     {
  301.         $now = new \DateTime('now');
  302.         return $now $this->getClosedAt();
  303.     }
  304.     public function isBefore()
  305.     {
  306.         $now = new \DateTime('now');
  307.         return $now $this->getOpenedAt();
  308.     }
  309.     public function isBiddable()
  310.     {
  311.         return $this->isOpen() || ($this->isBefore() && $this->getVehicle()->getStartingPrice() > 0);
  312.     }
  313.     public function isActive()
  314.     {
  315.         return $this->isOpen();
  316.     }
  317.     /**
  318.      * Returns auction starting date.
  319.      *
  320.      * @return \DateTime
  321.      */
  322.     public function getOpenedAt()
  323.     {
  324.         return $this->openedAt;
  325.     }
  326.     /**
  327.      * Sets auction starting date.
  328.      *
  329.      * @param \DateTime $openedAt
  330.      */
  331.     public function setOpenedAt($openedAt): void
  332.     {
  333.         $this->openedAt $openedAt;
  334.     }
  335.     /**
  336.      * Returns auction closing time.
  337.      *
  338.      * @return \DateTime
  339.      */
  340.     public function getClosedAt()
  341.     {
  342.         return $this->closedAt;
  343.     }
  344.     /**
  345.      * Sets auction closing time.
  346.      *
  347.      * @param \DateTime $closedAt
  348.      */
  349.     public function setClosedAt($closedAt): void
  350.     {
  351.         $this->closedAt $closedAt;
  352.     }
  353.     public function getPausedAt()
  354.     {
  355.         return $this->pausedAt;
  356.     }
  357.     public function getPausedMs()
  358.     {
  359.         return $this->pausedMs;
  360.     }
  361.     public function setPausedMs($ms)
  362.     {
  363.         $this->pausedMs $ms;
  364.         return $this;
  365.     }
  366.     public function isPaused()
  367.     {
  368.         return null !== $this->pausedAt;
  369.     }
  370.     public function setPaused($paused)
  371.     {
  372.         $today = new \DateTime();
  373.         if ($paused) {
  374.             if (!$this->isPaused()) {
  375.                 $this->pausedAt $today;
  376.             }
  377.         } else {
  378.             if ($this->isPaused()) {
  379.                 $this->pausedMs $this->pausedMs + (($today->format('U') - $this->pausedAt->format('U')) * 1000);
  380.                 $this->pausedAt null;
  381.             }
  382.         }
  383.         return $this;
  384.     }
  385.     public function isBiddedDuringPause()
  386.     {
  387.         return $this->biddedDuringPause;
  388.     }
  389.     public function setBiddedDuringPause($bool)
  390.     {
  391.         $this->biddedDuringPause $bool;
  392.         return $this;
  393.     }
  394. }