<?php
namespace App\Entity;
use App\Classes\Hasher;
use App\Entity\Type\OrderStatusType;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;
use JMS\Serializer\Annotation\MaxDepth;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Class Order
*
* @ORM\Entity(repositoryClass="App\Repository\OrderRepository")
* @ORM\Table(name="malys_order")
* @ORM\HasLifecycleCallbacks()
* @package App\Entity
* @ExclusionPolicy("all")
*/
class Order
{
public const CANCEL_STATUS = 'cancel';
public const CONFIRM_STATUS = 'confirm';
public const MAX_UPDATE_ORDER = 2;
/** ****************ORDER FIELDS******************* */
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Expose
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="status", type="string", length=255, nullable=false)
* @Assert\NotBlank
*/
protected $status = OrderStatusType::ORDER_CONFIRM;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="OrderStatusHistory", mappedBy="order", cascade={"remove"}, orphanRemoval=true)
*/
protected $statusHistory;
/**
* @var float
*
* @ORM\Column(name="price_excluding_tax", type="float", nullable=false)
* @Assert\NotBlank
* @Expose
*/
protected $priceExcludingTax;
/**
* @var float
*
* @ORM\Column(name="amount_excluding_tax_paid", type="float", nullable=true)
* @Assert\NotBlank
* @Expose
*/
protected $amountExcludingTaxPaid;
/**
* @var string
*
* @ORM\Column(name="note", type="text", nullable=true)
*/
protected $note;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="OrderItem", mappedBy="order", cascade={"persist", "remove"})
* @Expose
* @MaxDepth(1)
*
*/
protected $items;
/**
* @var DateTime
*
* @ORM\Column(name="confirmation_date", type="datetime", nullable=true)
*/
protected $confirmationDate;
/**
* @Expose
*/
protected $label;
/** ****************CUSTOMER FIELDS******************* */
/**
* @var Customer
*
* @ORM\ManyToOne(targetEntity="Customer")
* @ORM\JoinColumn(name="customer_id", referencedColumnName="id", nullable=true)
* @Expose
* @MaxDepth(1)
*/
protected $customer;
/**
* @var string
*
* @ORM\Column(name="user_first_name", type="string", length=255, nullable=true)
*/
protected $userFirstName;
/**
* @var string
*
* @ORM\Column(name="user_last_name", type="string", length=255, nullable=true)
*/
protected $userLastName;
/**
* @var string
*
* @ORM\Column(name="user_email", type="string", length=255, nullable=true)
*/
protected $userEmail;
/**
* @var string
*
* @ORM\Column(name="user_phone", type="string", length=255, nullable=true)
*/
protected $userPhone;
/**
* @var string
*
* @ORM\Column(name="user_mobile", type="string", length=255, nullable=true)
*/
protected $userMobile;
/**
* @var string
*
* @ORM\Column(name="customer_brand_name", type="string", length=255, nullable=true)
*/
protected $customerBrandName;
/**
* @var string
*
* @ORM\Column(name="customer_company_name", type="string", length=255, nullable=true)
*/
protected $customerCompanyName;
/**
* @var string
*
* @ORM\Column(name="customer_business_number", type="string", length=255, nullable=true)
*/
protected $customerBusinessNumber;
/**
* @var string
*
* @ORM\Column(name="customer_address", type="string", nullable=true)
*/
protected $customerAddress;
/**
* @var string
*
* @ORM\Column(name="customer_zip_code", type="string", nullable=true)
*/
protected $customerZipCode;
/**
* @var string
*
* @ORM\Column(name="customer_city", type="string", nullable=true)
*/
protected $customerCity;
/**
* @var string
*
* @ORM\Column(name="customer_country", type="string", nullable=true)
*/
protected $customerCountry;
/**
* @var string
*
* @ORM\Column(name="customer_phone", type="string", nullable=true)
*/
protected $customerPhone;
/**
* @var string
*
* @ORM\Column(name="customer_mobile", type="string", nullable=true)
*/
protected $customerMobile;
/**
* @var string
*
* @ORM\Column(name="adherent_number", type="string", length=255, nullable=true)
*/
protected $adherentNumber;
/**
* @var DateTime
*
* @ORM\Column(name="customer_delivery_time_start", type="datetime", nullable=true)
*/
protected $customerDeliveryTimeStart;
/**
* @var DateTime
*
* @ORM\Column(name="customer_delivery_time_end", type="datetime", nullable=true)
*/
protected $customerDeliveryTimeEnd;
/**
* @var string
*
* @ORM\Column(name="customer_delivery_comment", type="text", nullable=true)
*/
protected $customerDeliveryComment;
/** ****************SUPPLIER FIELDS******************* */
/**
* @var Supplier
*
* @ORM\ManyToOne(targetEntity="Supplier")
* @ORM\JoinColumn(name="supplier_id", referencedColumnName="id", onDelete="SET NULL", nullable=true)
* @Expose
* @MaxDepth(1)
*/
protected $supplier;
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="SET NULL", nullable=true)
* @Expose
* @MaxDepth(1)
*/
protected $user;
/**
* @var string
*
* @ORM\Column(name="supplier_company_name", type="string", length=255, nullable=false)
*/
protected $supplierCompanyName;
/**
* @var string
*
* @ORM\Column(name="supplier_email", type="string", length=255, nullable=false)
*/
protected $supplierEmail;
/**
* @var string
*
* @ORM\Column(name="supplier_address", type="string", nullable=true)
*/
protected $supplierAddress;
/**
* @var string
*
* @ORM\Column(name="supplier_zip_code", type="string", nullable=true)
*/
protected $supplierZipCode;
/**
* @var string
*
* @ORM\Column(name="supplier_city", type="string", nullable=true)
*/
protected $supplierCity;
/**
* @var string
*
* @ORM\Column(name="supplier_country", type="string", nullable=true)
*/
protected $supplierCountry;
/**
* @var float
*
* @ORM\Column(name="supplier_minimum_tax_excluded", type="float", nullable=true)
*/
protected $supplierMinimumTaxExcluded;
/**
* @var boolean
*
* @ORM\Column(name="supplier_primeur", type="boolean", nullable=true)
*/
protected $supplierPrimeur;
/**
* @var boolean
*
* @ORM\Column(name="supplier_partner", type="boolean", nullable=true)
*/
protected $supplierPartner;
/**
* @var string
*
* @ORM\Column(name="supplier_website", type="string", nullable=true)
*/
protected $supplierWebsite;
/**
* @var DeliveryModel
*
* @ORM\ManyToOne(targetEntity="DeliveryModel")
* @ORM\JoinColumn(name="delivery_model_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
protected $deliveryModel;
/**
* @var string
*
* @ORM\Column(name="delivery_label", type="string", length=255, nullable=true)
* @Assert\NotBlank
*/
protected $deliveryLabel;
/**
* @var string
*
* @ORM\Column(name="delivery_area", type="string", length=255, nullable=true)
* @Assert\NotBlank
*/
protected $deliveryArea;
/**
* @var integer
*
* @ORM\Column(name="delivery_time", type="integer", nullable=true)
* @Assert\NotBlank
*/
protected $deliveryTime;
/**
* @var array
*
* @ORM\Column(name="delivery_days", type="array", nullable=true)
* @Assert\NotBlank
*/
protected $deliveryDays;
/**
* @var integer
*
* @ORM\Column(name="delivery_deadline", type="integer", nullable=true)
* @Assert\NotBlank
*/
protected $deliveryDeadline;
/**
* @var DateTime
*
* @ORM\Column(name="delivery_date", type="datetime", nullable=false)
* @Assert\NotBlank
* @Expose
*/
protected $deliveryDate;
/**
* @var DateTime
*
* @ORM\Column(name="created_at", type="datetime", nullable=false)
* @Expose
*/
protected $createdAt;
/**
* @var DateTime
*
* @ORM\Column(name="updated_at", type="datetime", nullable=true)
* @Expose
*/
protected $updatedAt;
/**
* Order is word reserved in mysql
* @ORM\OneToOne(targetEntity="App\Entity\Order")
* @ORM\JoinColumn(name="previous_order", referencedColumnName="id", nullable=true)
*/
protected $previousOrder;
/**
* @var boolean
* @ORM\Column(type="boolean", name="visible", nullable=false, options={"default": true})
* @Expose
*/
protected $visible = true;
/**
* @var integer
* @ORM\Column(name="level", type="integer", nullable=false, options={"default": 0})
*/
protected $level = 0;
/**
* @var string
* @ORM\Column(name="original_id", type="string", nullable=true)
*/
protected $originalId;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User")
* @ORM\JoinColumn(name="saleperson_id", referencedColumnName="id", nullable=true)
* @Expose
*/
protected $salePerson;
/**
* @var string
*
* @ORM\Column(name="hashed_id", type="string", nullable=false)
*/
protected $hashedId;
public function __construct()
{
$this->items = new ArrayCollection();
$this->statusHistory = new ArrayCollection();
$this->buildLabel();
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @return string
*/
public function getStatus()
{
return $this->status;
}
/**
* @param string $status
*/
public function setStatus($status)
{
$this->status = $status;
}
/**
* @return ArrayCollection
*/
public function getStatusHistory()
{
return $this->statusHistory;
}
/**
* @param ArrayCollection $statusHistory
*/
public function setStatusHistory($statusHistory)
{
$this->statusHistory = $statusHistory;
}
/**
* @return float
*/
public function getPriceExcludingTax()
{
return $this->priceExcludingTax;
}
/**
* @param float $priceExcludingTax
*/
public function setPriceExcludingTax($priceExcludingTax)
{
$this->priceExcludingTax = $priceExcludingTax;
}
/**
* @return float
*/
public function getAmountExcludingTaxPaid()
{
return $this->amountExcludingTaxPaid;
}
/**
* @param float $amountExcludingTaxPaid
*/
public function setAmountExcludingTaxPaid($amountExcludingTaxPaid)
{
$this->amountExcludingTaxPaid = $amountExcludingTaxPaid;
}
/**
* @return string
*/
public function getNote()
{
return $this->note;
}
/**
* @param string $note
*/
public function setNote($note)
{
$this->note = $note;
}
/**
* @return ArrayCollection
*/
public function getItems()
{
return $this->items;
}
/**
* @return ArrayCollection|Collection
*/
public function getActiveItems()
{
return $this->items;
// return $this->items->filter(function($entry) {
// /** @var $entry OrderItem */
// if($entry->getProduct() instanceof Product) {
// if ($entry->getProduct()->isEnabled()) {
// return true;
// }
// }
// return false;
// });
}
/**
* @param ArrayCollection $items
*/
public function setItems($items)
{
$this->items = $items;
}
/**
* @param OrderItem $item
*/
public function addItem($item)
{
$this->items->add($item);
}
/**
* @param OrderItem $item
*/
public function removeItem($item)
{
if ($this->items->contains($item)) {
$this->items->removeElement($item);
}
}
/**
* @return DateTime
*/
public function getConfirmationDate()
{
return $this->confirmationDate;
}
/**
* @param DateTime $confirmationDate
*/
public function setConfirmationDate($confirmationDate)
{
$this->confirmationDate = $confirmationDate;
}
/**
* @return string
*/
public function getUserFirstName()
{
return $this->userFirstName;
}
/**
* @param string $userFirstName
*/
public function setUserFirstName($userFirstName)
{
$this->userFirstName = $userFirstName;
}
/**
* @return string
*/
public function getUserLastName()
{
return $this->userLastName;
}
/**
* @param string $userLastName
*/
public function setUserLastName($userLastName)
{
$this->userLastName = $userLastName;
}
/**
* @return string
*/
public function getUserEmail()
{
return $this->userEmail;
}
/**
* @param string $userEmail
*/
public function setUserEmail($userEmail)
{
$this->userEmail = $userEmail;
}
/**
* @return string
*/
public function getUserPhone()
{
return $this->userPhone;
}
/**
* @param string $userPhone
*/
public function setUserPhone($userPhone)
{
$this->userPhone = $userPhone;
}
/**
* @return string
*/
public function getUserMobile()
{
return $this->userMobile;
}
/**
* @param string $userMobile
*/
public function setUserMobile($userMobile)
{
$this->userMobile = $userMobile;
}
/**
* @return string
*/
public function getCustomerBrandName()
{
return $this->customerBrandName;
}
/**
* @param string $customerBrandName
*/
public function setCustomerBrandName($customerBrandName)
{
$this->customerBrandName = $customerBrandName;
}
/**
* @return string
*/
public function getCustomerCompanyName()
{
return $this->customerCompanyName;
}
/**
* @param string $customerCompanyName
*/
public function setCustomerCompanyName($customerCompanyName)
{
$this->customerCompanyName = $customerCompanyName;
}
/**
* @return string
*/
public function getCustomerBusinessNumber()
{
return $this->customerBusinessNumber;
}
/**
* @param string $customerBusinessNumber
*/
public function setCustomerBusinessNumber($customerBusinessNumber)
{
$this->customerBusinessNumber = $customerBusinessNumber;
}
/**
* @return string
*/
public function getCustomerAddress()
{
return $this->customerAddress;
}
/**
* @param string $customerAddress
*/
public function setCustomerAddress($customerAddress)
{
$this->customerAddress = $customerAddress;
}
/**
* @return string
*/
public function getCustomerZipCode()
{
return $this->customerZipCode;
}
/**
* @param string $customerZipCode
*/
public function setCustomerZipCode($customerZipCode)
{
$this->customerZipCode = $customerZipCode;
}
/**
* @return string
*/
public function getCustomerCity()
{
return $this->customerCity;
}
/**
* @param string $customerCity
*/
public function setCustomerCity($customerCity)
{
$this->customerCity = $customerCity;
}
/**
* @return string
*/
public function getCustomerCountry()
{
return $this->customerCountry;
}
/**
* @param string $customerCountry
*/
public function setCustomerCountry($customerCountry)
{
$this->customerCountry = $customerCountry;
}
/**
* @return string
*/
public function getCustomerPhone()
{
return $this->customerPhone;
}
/**
* @param string $customerPhone
*/
public function setCustomerPhone($customerPhone)
{
$this->customerPhone = $customerPhone;
}
/**
* @return string
*/
public function getCustomerMobile()
{
return $this->customerMobile;
}
/**
* @param string $customerMobile
*/
public function setCustomerMobile($customerMobile)
{
$this->customerMobile = $customerMobile;
}
/**
* @return DateTime
*/
public function getCustomerDeliveryTimeStart()
{
return $this->customerDeliveryTimeStart;
}
/**
* @param DateTime $customerDeliveryTimeStart
*/
public function setCustomerDeliveryTimeStart($customerDeliveryTimeStart)
{
$this->customerDeliveryTimeStart = $customerDeliveryTimeStart;
}
/**
* @return DateTime
*/
public function getCustomerDeliveryTimeEnd()
{
return $this->customerDeliveryTimeEnd;
}
/**
* @param DateTime $customerDeliveryTimeEnd
*/
public function setCustomerDeliveryTimeEnd($customerDeliveryTimeEnd)
{
$this->customerDeliveryTimeEnd = $customerDeliveryTimeEnd;
}
/**
* @return string
*/
public function getCustomerDeliveryComment()
{
return $this->customerDeliveryComment;
}
/**
* @param string $customerDeliveryComment
*/
public function setCustomerDeliveryComment($customerDeliveryComment)
{
$this->customerDeliveryComment = $customerDeliveryComment;
}
/**
* @return string
*/
public function getAdherentNumber()
{
return $this->adherentNumber;
}
/**
* @param string $adherentNumber
*/
public function setAdherentNumber($adherentNumber)
{
$this->adherentNumber = $adherentNumber;
}
/**
* @return string
*/
public function getSupplierCompanyName()
{
return $this->supplierCompanyName;
}
/**
* @param string $supplierCompanyName
*/
public function setSupplierCompanyName($supplierCompanyName)
{
$this->supplierCompanyName = $supplierCompanyName;
}
/**
* @return string
*/
public function getSupplierEmail()
{
return $this->supplierEmail;
}
/**
* @param string $supplierEmail
*/
public function setSupplierEmail($supplierEmail)
{
$this->supplierEmail = $supplierEmail;
}
/**
* @return string
*/
public function getSupplierAddress()
{
return $this->supplierAddress;
}
/**
* @param string $supplierAddress
*/
public function setSupplierAddress($supplierAddress)
{
$this->supplierAddress = $supplierAddress;
}
/**
* @return string
*/
public function getSupplierZipCode()
{
return $this->supplierZipCode;
}
/**
* @param string $supplierZipCode
*/
public function setSupplierZipCode($supplierZipCode)
{
$this->supplierZipCode = $supplierZipCode;
}
/**
* @return string
*/
public function getSupplierCity()
{
return $this->supplierCity;
}
/**
* @param string $supplierCity
*/
public function setSupplierCity($supplierCity)
{
$this->supplierCity = $supplierCity;
}
/**
* @return string
*/
public function getSupplierCountry()
{
return $this->supplierCountry;
}
/**
* @param string $supplierCountry
*/
public function setSupplierCountry($supplierCountry)
{
$this->supplierCountry = $supplierCountry;
}
/**
* @return float
*/
public function getSupplierMinimumTaxExcluded()
{
return $this->supplierMinimumTaxExcluded;
}
/**
* @param float $supplierMinimumTaxExcluded
*/
public function setSupplierMinimumTaxExcluded($supplierMinimumTaxExcluded)
{
$this->supplierMinimumTaxExcluded = $supplierMinimumTaxExcluded;
}
/**
* @return bool
*/
public function isSupplierPrimeur()
{
return $this->supplierPrimeur;
}
/**
* @param bool $supplierPrimeur
*/
public function setSupplierPrimeur($supplierPrimeur)
{
$this->supplierPrimeur = $supplierPrimeur;
}
/**
* @return string
*/
public function getSupplierWebsite()
{
return $this->supplierWebsite;
}
/**
* @param string $supplierWebsite
*/
public function setSupplierWebsite($supplierWebsite)
{
$this->supplierWebsite = $supplierWebsite;
}
/**
* @param DeliveryModel $deliveryModel
*/
public function setDeliveryModel($deliveryModel)
{
$this->deliveryModel = $deliveryModel;
}
/**
* @param User $user
*/
public function setUser(User $user)
{
$this->user = $user;
}
/**
* @return string
*/
public function getDeliveryLabel()
{
return $this->deliveryLabel;
}
/**
* @param string $deliveryLabel
*/
public function setDeliveryLabel($deliveryLabel)
{
$this->deliveryLabel = $deliveryLabel;
}
/**
* @return string
*/
public function getDeliveryArea()
{
return $this->deliveryArea;
}
/**
* @param string $deliveryArea
*/
public function setDeliveryArea($deliveryArea)
{
$this->deliveryArea = $deliveryArea;
}
/**
* @return integer
*/
public function getDeliveryTime()
{
return $this->deliveryTime;
}
/**
* @param integer $deliveryTime
*/
public function setDeliveryTime($deliveryTime)
{
$this->deliveryTime = $deliveryTime;
}
/**
* @return array
*/
public function getDeliveryDays()
{
return $this->deliveryDays;
}
/**
* @param array $deliveryDays
*/
public function setDeliveryDays($deliveryDays)
{
$this->deliveryDays = $deliveryDays;
}
/**
* @return integer
*/
public function getDeliveryDeadline()
{
return $this->deliveryDeadline;
}
/**
* @param integer $deliveryDeadline
*/
public function setDeliveryDeadline($deliveryDeadline)
{
$this->deliveryDeadline = $deliveryDeadline;
}
/**
* @return DateTime
*/
public function getDeliveryDate()
{
return $this->deliveryDate;
}
/**
* @param DateTime $deliveryDate
*/
public function setDeliveryDate($deliveryDate)
{
$this->deliveryDate = $deliveryDate;
}
/**
* @param Customer $customer
*/
public function setCustomer($customer)
{
$this->customer = $customer;
}
/**
* @param Supplier $supplier
*/
public function setSupplier($supplier)
{
$this->supplier = $supplier;
}
/**
* @return Customer
*/
public function getCustomer()
{
return $this->customer;
}
/**
* @return Supplier
*/
public function getSupplier()
{
return $this->supplier;
}
/**
* @return DeliveryModel
*/
public function getDeliveryModel()
{
return $this->deliveryModel;
}
public function getUser()
{
return $this->user;
}
/**
* @return DateTime
*/
public function getCreatedAt()
{
return $this->createdAt;
}
/**
* @param $date
*/
public function setCreatedAt($date = null)
{
if ($date != null) {
$this->createdAt = $date;
} else {
$this->createdAt = new DateTime();
}
$this->updatedAt = new DateTime();
}
/**
* @return DateTime
*/
public function getUpdatedAt()
{
return $this->updatedAt;
}
/**
* Set updatedAt
*
* @return Order
* @ORM\PreUpdate
*/
public function setUpdatedAt()
{
$this->updatedAt = new DateTime();
return $this;
}
/**
* @return mixed
*/
public function getPreviousOrder()
{
return $this->previousOrder;
}
/**
* @param mixed $previousOrder
*/
public function setPreviousOrder($previousOrder)
{
$this->previousOrder = $previousOrder;
}
/**
* @return bool
*/
public function isVisible()
{
return $this->visible;
}
/**
* @param bool $visible
*/
public function setVisible($visible)
{
$this->visible = $visible;
}
/**
* @return int
*/
public function getLevel()
{
return $this->level;
}
/**
* @param int $level
*/
public function setLevel($level)
{
$this->level = $level;
}
/**
* @return string
*/
public function getOriginalId()
{
return ($this->originalId > 0) ? $this->originalId : $this->id;
}
/**
* @param string $originalId
*/
public function setOriginalId($originalId)
{
$this->originalId = $originalId;
}
/**
* @return bool
*/
public function canBeUpdated()
{
return ($this->level < self::MAX_UPDATE_ORDER && $this->visible && $this->status != OrderStatusType::ORDER_CANCEL);
}
/**
* @return int|string
*/
public function buildLabel()
{
$label = null;
if (! empty($this->getId())) {
if ($this->level == 0) {
$label = $this->getId();
} else {
$label = $this->originalId . '/' . $this->level;
}
}
$this->label = $label;
}
public function getLabel()
{
$this->buildLabel();
return $this->label;
}
public function getDashLabel()
{
$label = $this->getLabel();
$label = str_replace('/', '-', $label);
return $label;
}
/**
* @return bool
*/
public function isSupplierPartner()
{
return $this->supplierPartner;
}
/**
* @param bool $supplierPartner
*/
public function setSupplierPartner($supplierPartner)
{
$this->supplierPartner = $supplierPartner;
}
/**
* @return mixed
*/
public function getSalePerson()
{
return $this->salePerson;
}
/**
* @param mixed $salePerson
*/
public function setSalePerson($salePerson)
{
$this->salePerson = $salePerson;
}
/**
* @return string
*/
public function getHashedId()
{
return $this->hashedId;
}
/**
* @ORM\PrePersist
*/
public function installHashedId()
{
if (is_null($this->hashedId)) {
$this->hashedId = self::generateOrderHash();
}
}
public static function generateOrderHash()
{
return Hasher::generateHash(self::class);
}
}