<?php
namespace App\AtechNet\CoreBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping\OrderBy;
use Doctrine\ORM\Mapping\Table as Table;
/**
* Basket
*
* @Table(name="baskets")
* @Entity
* @HasLifecycleCallbacks
*/
class Basket extends AbstractEntity
{
/**
* @var Domain
*
* @ManyToOne(targetEntity="Domain")
* @JoinColumn(name="domain_id", referencedColumnName="id")
*/
private $domain;
/**
* @var Customer
*
* @ManyToOne(targetEntity="Customer", inversedBy="baskets")
* @JoinColumn(name="customer_id", referencedColumnName="id", nullable=true)
*/
private $customer;
/**
* @var CustomerAddress
*
* @ManyToOne(targetEntity="CustomerAddress")
* @JoinColumn(name="billing_address_id", referencedColumnName="id", nullable=true)
*/
private $billingAddress;
/**
* @var CustomerAddress
*
* @ManyToOne(targetEntity="CustomerAddress")
* @JoinColumn(name="shipping_address_id", referencedColumnName="id", nullable=true)
*/
private $shippingAddress;
/**
* @var integer
*
* @Column(name="payment_method", type="integer")
*/
private $paymentMethod;
/**
* @var integer
*
* @Column(name="shipping_method", type="integer")
*/
private $shippingMethod;
/**
* @var bool
*
* @Column(name="useBillingAddressAsShippingAddress", type="boolean")
*/
private $useBillingAddressAsShippingAddress;
/**
* @var string
*
* @Column(name="message", type="text", nullable=true)
*/
private $message;
/**
* @var string
*
* @Column(name="coupon_code", type="string", length=255, nullable=true)
*/
private $couponCode;
/**
* @var bool
*
* @Column(name="active", type="boolean")
*/
private $active = true;
/**
* @var ArrayCollection
*
* @OneToMany(targetEntity="BasketItem", mappedBy="basket", orphanRemoval=true, cascade={"persist", "remove"})
* @OrderBy({"id" = "ASC"})
**/
private $basketItems;
/**
* @var string
*
* @Column(name="abandoned_cart_email", type="string", nullable=true)
*/
private $abandonedEmail;
/**
* @var string
*/
private $email;
public function __construct()
{
parent::__construct();
$this->basketItems = new ArrayCollection();
}
/**
* @return Domain
*/
public function getDomain()
{
return $this->domain;
}
/**
* @param Domain $domain
*/
public function setDomain($domain)
{
$this->domain = $domain;
}
/**
* @return Customer
*/
public function getCustomer()
{
return $this->customer;
}
/**
* @param Customer $customer
*/
public function setCustomer($customer)
{
$this->customer = $customer;
}
/**
* Set billingAddress
*
* @param CustomerAddress $billingAddress
* @return Basket
*/
public function setBillingAddress($billingAddress)
{
$this->billingAddress = $billingAddress;
return $this;
}
/**
* Get billingAddress
*
* @return CustomerAddress
*/
public function getBillingAddress()
{
return $this->billingAddress;
}
/**
* Set paymentMethod
*
* @param integer $paymentMethod
* @return Basket
*/
public function setPaymentMethod($paymentMethod)
{
$this->paymentMethod = $paymentMethod;
return $this;
}
/**
* Get paymentMethod
*
* @return integer
*/
public function getPaymentMethod()
{
return $this->paymentMethod;
}
/**
* @return int
*/
public function getShippingMethod()
{
return $this->shippingMethod;
}
/**
* @param int $shippingMethod
*/
public function setShippingMethod($shippingMethod)
{
$this->shippingMethod = $shippingMethod;
}
/**
* @return CustomerAddress
*/
public function getShippingAddress()
{
return $this->shippingAddress;
}
/**
* @param CustomerAddress $shippingAddress
*/
public function setShippingAddress($shippingAddress)
{
$this->shippingAddress = $shippingAddress;
}
/**
* @return boolean
*/
public function useBillingAddressAsShippingAddress()
{
return $this->useBillingAddressAsShippingAddress;
}
/**
* @param boolean $useBillingAddressAsShippingAddress
*/
public function setUseBillingAddressAsShippingAddress($useBillingAddressAsShippingAddress)
{
$this->useBillingAddressAsShippingAddress = $useBillingAddressAsShippingAddress;
}
/**
* @return string
*/
public function getMessage()
{
return $this->message;
}
/**
* @param string $message
*/
public function setMessage($message)
{
$this->message = $message;
}
/**
* @return string
*/
public function getCouponCode()
{
return $this->couponCode;
}
/**
* @param string $couponCode
*/
public function setCouponCode($couponCode)
{
$this->couponCode = $couponCode;
}
/**
* @return boolean
*/
public function isActive()
{
return $this->active;
}
/**
* @param boolean $active
*/
public function setActive($active)
{
$this->active = $active;
}
/**
* Get BasketItems
* @return ArrayCollection
*/
public function getBasketItems()
{
return $this->basketItems;
}
/**
* @param BasketItem $BasketItem
*/
public function addBasketItem(BasketItem $BasketItem)
{
$this->basketItems->add($BasketItem);
}
/**
* Returns number of all items in basket
*
* @return int
*/
public function getFullItemQuantity()
{
$itemQuantity = 0;
/**
* @var BasketItem $basketItem
*/
foreach ($this->basketItems as $basketItem) {
$itemQuantity = $itemQuantity + $basketItem->getQuantity();
}
return $itemQuantity;
}
/**
* Get basket weight in kg
*
* @return int
*/
public function getFullWeight()
{
$itemsWeight = 0;
/**
* @var BasketItem $basketItem
*/
foreach ($this->basketItems as $basketItem) {
$itemsWeight = $itemsWeight + (($basketItem->getProduct()->getWeight() * $basketItem->getQuantity()) / 1000);
}
return $itemsWeight;
}
/**
* Get BasketItems
* @return integer
*/
public function getSubTotalPrice()
{
$subTotal = 0;
/**
* @var BasketItem $basketItem
*/
foreach ($this->basketItems as $basketItem) {
$subTotal = $subTotal + ($basketItem->getPriceWithAttributesForDomain($this->getDomain()) * $basketItem->getQuantity());
}
return $subTotal;
}
/**
* Get BasketItems
* @return integer
*/
public function getTaxFromSubTotalPrice()
{
// TODO check if VAT ID is SET
$subTotal = $this->getSubTotalPrice();
$domainTaxPercentage = $this->getVat();
$tax = ($subTotal / (100 + $domainTaxPercentage)) * $domainTaxPercentage;
return $tax;
}
/**
* Get BasketItems
* @return integer
*/
public function getTotalPrice()
{
$subTotalPrice = $this->getSubTotalPrice();
$shippingData = $this->getShippingTitleAndPrice();
$paymentData = $this->getPaymentTitleAndPrice();
$totalPrice = $subTotalPrice + $shippingData['price'] + $paymentData['price'];
return $totalPrice;
}
/**
* Check if everything is set for the basket to be converted into order
* THIS CHECK SHOULD BE USED FOR FINAL SAFETY CHECK ONLY, DOESNT RETURN ERRORS, JUST TRUE OR FALSE
*
* @return bool
*/
public function canConvertBasketToOrder()
{
if ($this->getDomain() != null
&& $this->getCustomer() != null
&& $this->getBillingAddress() != null
&& ($this->useBillingAddressAsShippingAddress() || $this->getShippingAddress() != null)
&& $this->getPaymentMethod() != null && $this->getPaymentMethod() != 0
&& $this->getShippingMethod() != null && $this->getShippingMethod() != 0
&& $this->getBasketItems()->count() > 0) {
/**
* Check addresses for required fields
*/
if (!$this->getBillingAddress()->checkRequiredFields()) {
return false;
}
if (!$this->useBillingAddressAsShippingAddress()) {
if (!$this->getShippingAddress()->checkRequiredFields()) {
return false;
}
}
return true;
} else {
return false;
}
}
public function getPaymentTitleAndPrice()
{
$domainPaymentTypes = $this->getDomain()->getDomainPaymentTypes();
$data = null;
/**
* @var DomainPaymentType $paymentType
*/
if ($domainPaymentTypes->count() > 0) {
foreach ($domainPaymentTypes as $paymentType) {
if ($paymentType->getType() == $this->getPaymentMethod()) {
$data = [
'title' => $paymentType->getTitle(),
'price' => $paymentType->getPrice(),
];
}
}
}
return $data;
}
public function getShippingTitleAndPrice()
{
$domainShippingTypes = $this->getDomain()->getDomainShippingTypes();
$data = null;
/**
* @var DomainShippingType $shippingType
*/
if ($domainShippingTypes->count() > 0) {
foreach ($domainShippingTypes as $shippingType) {
if ($shippingType->getType() == $this->getShippingMethod()) {
$data = [
'title' => $shippingType->getTitle(),
'price' => $shippingType->getPrice(),
];
}
}
}
return $data;
}
/**
* @return int
*/
public function getVat() // TODO tz orderVat
{
$dateStr = $this->getCreated()->format('YmdHi');
$vatId = 'not set';
if ($this->customer && $this->customer->getVatId() != null) {
$vatId = $this->customer->getVatId();
}
return $this->customer && $this->customer->useZeroVat($vatId, $dateStr) ? 0 : $this->getDomain()->getVat($dateStr);
}
/**
* Validate Pickup Point availability
*
* @return bool
*/
public function isPickupPointAvailable(): bool
{
/**
* @var BasketItem $basketItem
*/
foreach ($this->basketItems as $basketItem) {
// All In One, Monitor, PC, PC Set
if (in_array($basketItem->getProduct()->getType()->getId(), [ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE, ProductType::PRODUCT_TYPE_ID_MONITOR, ProductType::PRODUCT_TYPE_ID_PC, ProductType::PRODUCT_TYPE_ID_PC_SET])) {
return false;
}
}
return true;
}
/**
* @return string|null
*/
public function getEmail(): ?string
{
return $this->email;
}
/**
* @param string|null $email
*/
public function setEmail(?string $email)
{
$this->email = $email;
}
/**
* @return string
*/
public function getAbandonedEmail()
{
return $this->abandonedEmail;
}
/**
* @param string $abandonedEmail
*/
public function setAbandonedEmail($abandonedEmail)
{
$this->abandonedEmail = $abandonedEmail;
}
}