<?php
namespace App\Entity;
use Knp\DoctrineBehaviors\Contract\Entity\SoftDeletableInterface;
use Knp\DoctrineBehaviors\Model\SoftDeletable\SoftDeletableTrait;
use Knp\DoctrineBehaviors\Model\Blameable\BlameableTrait;
use Knp\DoctrineBehaviors\Contract\Entity\BlameableInterface;
use Knp\DoctrineBehaviors\Model\Timestampable\TimestampableTrait;
use Knp\DoctrineBehaviors\Contract\Entity\TimestampableInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity
* @ORM\Table(name="order_product")
*/
class OrderProduct implements BlameableInterface, TimestampableInterface, SoftDeletableInterface {
use BlameableTrait;
use TimestampableTrait;
use SoftDeletableTrait;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Order", inversedBy="products")
*/
private $order;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Product")
*/
private $product;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\SubProduct", inversedBy="orders")
*/
private $subProduct;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Currency")
*/
private $currency;
/**
* @var integer
*
* @ORM\Column(name="quantity", type="integer", length=6, nullable=true)
*/
private $quantity;
/**
* @var string
*
* @ORM\Column(name="inscription", type="text", nullable=true)
*/
private $inscription;
/**
* @Doctrine\ORM\Mapping\Column(type="decimal", precision=10, scale=2, nullable=true)
*/
protected $price;
/**
* @Doctrine\ORM\Mapping\Column(type="decimal", precision=10, name="price_net", scale=2, nullable=true)
*/
protected $priceNet;
/**
* @var string
*
* @ORM\Column(name="session", type="string", length=40, nullable=true)
*/
private $session;
/**
* @Doctrine\ORM\Mapping\Column(name="price_initial", type="decimal", precision=10, scale=2, nullable=true)
*/
protected $priceInitial;
/**
* @ORM\OneToMany(targetEntity="App\Entity\OrderProductParameterValue", mappedBy="orderProduct", cascade={"all"})
*/
protected $parameterValues;
/**
* @ORM\OneToMany(targetEntity="App\Entity\OrderProductEquipment", mappedBy="orderProduct", cascade={"all"})
* @Doctrine\ORM\Mapping\OrderBy({"id" = "DESC"})
*/
protected $equipments;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ProductPriceVariants")
*/
private $variant;
public function getSubtotal() {
if ($this->getOrder()->getLanguage()->getLocaleShort() == 'ro') {
$params = $this->getProduct()->getLangParams();
foreach ($params as $param) {
if ($param->getLanguage()->getLocaleShort() == 'ro') {
$vat = $param->getVat();
$vatRate = ($vat->getValue()+100)/100;
return $this->getPriceNet() * $this->getQuantity() * $vatRate;
}
}
}
return $this->getPrice() * $this->getQuantity();
}
public function getEquipmentAsString($cut = false, $delimiter = ', ')
{
$data = array();
$equipments = $this->getEquipments();
if ($equipments->count() == 0) {
return '';
}
/** @var $kind OrderProductEquipment */
foreach ($equipments as $kind)
{
$data[] = $kind->getEquipment()->getName().' ('.$kind->getPrice().$kind->getCurrency()->getSign().')';
}
return implode($delimiter, $data);
}
public function __construct()
{
$this->parameterValues = new ArrayCollection();
$this->equipments = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set quantity
*
* @param integer $quantity
*
* @return OrderProduct
*/
public function setQuantity($quantity)
{
$this->quantity = $quantity;
return $this;
}
/**
* Get quantity
*
* @return integer
*/
public function getQuantity()
{
return $this->quantity;
}
/**
* Set inscription
*
* @param string $inscription
*
* @return OrderProduct
*/
public function setInscription($inscription)
{
$this->inscription = $inscription;
return $this;
}
/**
* Get inscription
*
* @return string
*/
public function getInscription()
{
return $this->inscription;
}
/**
* Set price
*
* @param string $price
*
* @return OrderProduct
*/
public function setPrice($price)
{
$this->price = $price;
return $this;
}
public function getPrice() {
return $this->getPriceNetto();
}
public function getPriceNetto() {
return $this->price;
}
public function getGrossPrice() {
return $this->price;
}
public function getPriceBrutto() {
return $this->getPrice();
}
public function getSumNetto() {
$sum = 0;
/** @var $orderProduct OrderProduct */
foreach ($this->getOrder()->getProducts() as $orderProduct) {
$sum = $sum + ($this->getQuantity() * $this->getPriceNetto());
}
return $sum;
}
public function getQuantityOfProducts() {
$c = 0;
/** @var $orderProduct OrderProduct */
foreach ($this->getOrder()->getProducts() as $orderProduct) {
$c = $c+1 + $orderProduct->getQuantity();
}
return $c;
}
/**
* Set session
*
* @param string $session
*
* @return OrderProduct
*/
public function setSession($session)
{
$this->session = $session;
return $this;
}
/**
* Get session
*
* @return string
*/
public function getSession()
{
return $this->session;
}
/**
* Set priceInitial
*
* @param string $priceInitial
*
* @return OrderProduct
*/
public function setPriceInitial($priceInitial)
{
$this->priceInitial = $priceInitial;
return $this;
}
/**
* Get priceInitial
*
* @return string
*/
public function getPriceInitial()
{
return $this->priceInitial;
}
/**
* Set order
*
* @param \App\Entity\Order $order
*
* @return OrderProduct
*/
public function setOrder(\App\Entity\Order $order = null)
{
$this->order = $order;
return $this;
}
/**
* Get order
*
* @return \App\Entity\Order
*/
public function getOrder()
{
return $this->order;
}
/**
* Set product
*
* @param \App\Entity\Product $product
*
* @return OrderProduct
*/
public function setProduct(\App\Entity\Product $product = null)
{
$this->product = $product;
return $this;
}
/**
* Get product
*
* @return \App\Entity\Product
*/
public function getProduct()
{
return $this->product;
}
/**
* Set currency
*
* @param \App\Entity\Currency $currency
*
* @return OrderProduct
*/
public function setCurrency(\App\Entity\Currency $currency = null)
{
$this->currency = $currency;
return $this;
}
/**
* Get currency
*
* @return \App\Entity\Currency
*/
public function getCurrency()
{
return $this->currency;
}
/**
* @return Collection|OrderProductParameterValue[]
*/
public function getParameterValues(): Collection
{
return $this->parameterValues;
}
public function addParameterValue(OrderProductParameterValue $parameterValue): self
{
if (!$this->parameterValues->contains($parameterValue)) {
$this->parameterValues[] = $parameterValue;
$parameterValue->setOrderProduct($this);
}
return $this;
}
public function removeParameterValue(OrderProductParameterValue $parameterValue): self
{
if ($this->parameterValues->contains($parameterValue)) {
$this->parameterValues->removeElement($parameterValue);
// set the owning side to null (unless already changed)
if ($parameterValue->getOrderProduct() === $this) {
$parameterValue->setOrderProduct(null);
}
}
return $this;
}
/**
* @return Collection|OrderProductEquipment[]
*/
public function getEquipments(): Collection
{
return $this->equipments;
}
public function addEquipment(OrderProductEquipment $equipment): self
{
if (!$this->equipments->contains($equipment)) {
$this->equipments[] = $equipment;
$equipment->setOrderProduct($this);
}
return $this;
}
public function removeEquipment(OrderProductEquipment $equipment): self
{
if ($this->equipments->contains($equipment)) {
$this->equipments->removeElement($equipment);
// set the owning side to null (unless already changed)
if ($equipment->getOrderProduct() === $this) {
$equipment->setOrderProduct(null);
}
}
return $this;
}
public function getSubProduct(): ?SubProduct
{
return $this->subProduct;
}
public function setSubProduct(?SubProduct $subProduct): self
{
$this->subProduct = $subProduct;
return $this;
}
public function getProductName() {
if ($this->getSubProduct()) {
return $this->getSubProduct()->getName();
}
return $this->getProduct()->getName();
}
/**
* @return mixed
*/
public function getPriceNet()
{
return $this->priceNet;
}
/**
* @param mixed $priceNet
*/
public function setPriceNet($priceNet): void
{
$this->priceNet = $priceNet;
}
public function getVariant(): ?ProductPriceVariants
{
return $this->variant;
}
public function setVariant(?ProductPriceVariants $variant): self
{
$this->variant = $variant;
return $this;
}
}