<?php
namespace App\Entity;
use App\Repository\SaleOrderItemRepository;
use App\Traits\DateTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;
use JMS\Serializer\Annotation\Expose;
use JMS\Serializer\Annotation\Groups;
use JMS\Serializer\Annotation\SerializedName;
/**
* @ORM\Table(indexes={
* @ORM\Index(columns={"status"})
* })
* @ORM\Entity(repositoryClass=SaleOrderItemRepository::class)
*
* @Serializer\ExclusionPolicy("ALL")
*/
class SaleOrderItem
{
use DateTrait;
public const STATUS_PROCESSING = 'processing';
public const STATUS_NOT_CONFIRMED = 'not_confirmed';
public const STATUS_CANCELED = 'canceled';
public const STATUS_SHIPPED = 'shipped';
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*
* @Expose
* @Groups({"get:read", "sale_oder_item:list"})
*/
private ?int $id = NULL;
/**
* Identifiant unique
*
* @ORM\Column(type="string", length=16)
*
* @Expose
* @Groups({"sale_order:item", "sale_oder_item:list", "sale_order:post", "get:read"})
*/
private ?string $sku = NULL;
/**
* Anciennement '$order' mais c'est un mot reservé (mysql) on ne peut plus l'utiliser
*
* @ORM\ManyToOne(targetEntity=SaleOrder::class, inversedBy="items")
* @ORM\JoinColumn(nullable=false, name="order_id")
*/
private ?SaleOrder $saleOrder = NULL;
/**
* Quantité
*
* @ORM\Column(type="integer")
*
* @Expose
* @Groups({"sale_order:item", "sale_oder_item:list", "sale_order:post", "get:read","export_order_datatable"})
*/
private ?int $quantity = NULL;
/**
* @ORM\Column(type="integer", nullable=true)
*
* @Expose
* @Groups({"sale_order:item", "sale_oder_item:list","get:read"})
*/
private ?int $quantityNoBatch = NULL;
/**
* @ORM\Column(type="string", length=100, options={"default":self::STATUS_PROCESSING})
*
* @Expose
* @Groups({"get:read", "sale_oder_item:list"})
*/
private string $status = self::STATUS_PROCESSING;
/**
* @ORM\Column(type="string", length=255)
*
* @Expose
* @Groups({"get:read"})
*/
private ?string $reference = NULL;
/**
* @ORM\Column(type="string", length=255)
*
* @Expose
* @Groups({"sale_order:item", "sale_oder_item:list", "get:read","export_order_datatable"})
*/
private ?string $name = NULL;
/**
* @ORM\Column(type="text", nullable=true)
*
* @Expose
* @Groups({"get:read"})
*/
private ?string $description = NULL;
/**
* @ORM\Column(type="string", length=255)
*
* @Expose
* @Groups({"get:read", "sale_oder_item:list"})
*/
private ?string $gamme = NULL;
/**
* @ORM\Column(type="decimal", precision=12, scale=4, nullable=true)
*
* @Expose
* @Groups({"get:read", "sale_oder_item:list"})
* @SerializedName ("price_h_t")
*/
private ?string $priceHT = NULL;
/**
* @ORM\Column(type="decimal", precision=12, scale=4, nullable=true)
*/
private ?string $priceTTC = NULL;
/**
* @ORM\Column(type="decimal", precision=12, scale=4, nullable=true)
*/
private ?string $unitPoint = NULL;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*
* @Expose
* @Groups({"get:read"})
*/
private ?string $imageUrl = NULL;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private ?string $imageThumbnailUrl = NULL;
/**
* @ORM\Column(type="decimal", precision=12, scale=4, nullable=true)
*
* @Expose
* @Groups({"get:read"})
*/
private ?string $taxableAmount = NULL;
/**
* @ORM\OneToMany(targetEntity=SaleOrderParticipant::class, mappedBy="saleOrderItem")
*/
private Collection $participants;
/**
* @ORM\OneToMany(targetEntity=SaleOrderItemOption::class, mappedBy="item")
*/
private Collection $options;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $categoryValues;
public function __construct()
{
$this->participants = new ArrayCollection();
$this->options = new ArrayCollection();
}
public function __clone()
{
if ( $this->id ) {
$this->setId( NULL );
$this->setSaleOrder( NULL );
}
}
public function __toString()
{
return $this->getSku();
}
/*
* ============================================================================================
* =============================== FONCTIONS CUSTOM ===========================================
* ============================================================================================
*/
public function getSku(): ?string
{
return $this->sku;
}
public function setSku( ?string $sku ): self
{
$this->sku = $sku;
return $this;
}
/**
* @Serializer\VirtualProperty()
* @Serializer\SerializedName("array_category_values")
*/
public function getArrayCategoryValues()
{
return json_decode( $this->categoryValues, TRUE ) ?? [];
}
/**
* @param string $slug
* @param int $value
*
* @return $this
*/
public function modifyValueToCategory( string $slug, int $value ): self
{
$newArray = $this->getArrayCategoryValues();
$newArray[ $slug ] = $value;
$this->categoryValues = json_encode( $newArray );
return $this;
}
/**
* @param float $multiplication
*
* @return $this
*/
public function multiplicationCategoryValues( float $multiplication ): self
{
$newArray = $this->getArrayCategoryValues();
foreach ( $newArray as $cat => $val ) {
$newArray[ $cat ] = $val * $multiplication;
}
$this->categoryValues = json_encode( $newArray );
return $this;
}
/*
* ============================================================================================
* ============================== FIN FONCTIONS CUSTOM ========================================
* ============================================================================================
*/
public function getTotalPrice()
{
return $this->getQuantity() * $this->getPriceHT();
}
public function getQuantity(): ?int
{
return $this->quantity;
}
public function setQuantity( int $quantity ): self
{
$this->quantity = $quantity;
return $this;
}
public function getPriceHT(): ?string
{
return $this->priceHT;
}
public function setPriceHT( ?string $priceHT ): self
{
$this->priceHT = $priceHT;
return $this;
}
public function getTotalPoint()
{
return ( $this->unitPoint * $this->quantity );
}
public function setId( $id )
{
$this->id = $id;
}
public function getId(): ?int
{
return $this->id;
}
public function getQuantityNoBatch(): ?int
{
return $this->quantityNoBatch;
}
public function setQuantityNoBatch( ?int $quantityNoBatch ): self
{
$this->quantityNoBatch = $quantityNoBatch;
return $this;
}
public function getStatus(): string
{
return $this->status;
}
public function setStatus( string $status ): self
{
$this->status = $status;
return $this;
}
public function getReference(): ?string
{
return $this->reference;
}
public function setReference( ?string $reference ): self
{
$this->reference = $reference;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName( ?string $name ): self
{
$this->name = $name;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription( ?string $description ): self
{
$this->description = $description;
return $this;
}
public function getGamme(): ?string
{
return $this->gamme;
}
public function setGamme( ?string $gamme ): self
{
$this->gamme = $gamme;
return $this;
}
public function getPriceTTC(): ?string
{
return $this->priceTTC;
}
public function setPriceTTC( ?string $priceTTC ): self
{
$this->priceTTC = $priceTTC;
return $this;
}
public function getUnitPoint(): ?string
{
return $this->unitPoint;
}
public function setUnitPoint( ?string $unitPoint ): self
{
$this->unitPoint = $unitPoint;
return $this;
}
public function getImageUrl(): ?string
{
return $this->imageUrl;
}
public function setImageUrl( ?string $imageUrl ): self
{
$this->imageUrl = $imageUrl;
return $this;
}
public function getImageThumbnailUrl(): ?string
{
return $this->imageThumbnailUrl;
}
public function setImageThumbnailUrl( ?string $imageThumbnailUrl ): self
{
$this->imageThumbnailUrl = $imageThumbnailUrl;
return $this;
}
public function getTaxableAmount(): ?string
{
return $this->taxableAmount;
}
public function setTaxableAmount( ?string $taxableAmount ): self
{
$this->taxableAmount = $taxableAmount;
return $this;
}
public function getSaleOrder(): ?SaleOrder
{
return $this->saleOrder;
}
public function setSaleOrder( ?SaleOrder $saleOrder ): self
{
$this->saleOrder = $saleOrder;
return $this;
}
/**
* @return Collection|SaleOrderParticipant[]
*/
public function getParticipants(): Collection
{
return $this->participants;
}
public function addParticipant( SaleOrderParticipant $participant ): self
{
if ( !$this->participants->contains( $participant ) ) {
$this->participants[] = $participant;
$participant->setSaleOrderItem( $this );
}
return $this;
}
public function removeParticipant( SaleOrderParticipant $participant ): self
{
if ( $this->participants->removeElement( $participant ) ) {
// set the owning side to null (unless already changed)
if ( $participant->getSaleOrderItem() === $this ) {
$participant->setSaleOrderItem( NULL );
}
}
return $this;
}
/**
* @return Collection|SaleOrderItemOption[]
*/
public function getOptions(): Collection
{
return $this->options;
}
public function addOption( SaleOrderItemOption $option ): self
{
if ( !$this->options->contains( $option ) ) {
$this->options[] = $option;
$option->setItem( $this );
}
return $this;
}
public function removeOption( SaleOrderItemOption $option ): self
{
if ( $this->options->removeElement( $option ) ) {
// set the owning side to null (unless already changed)
if ( $option->getItem() === $this ) {
$option->setItem( NULL );
}
}
return $this;
}
public function getCategoryValues(): ?string
{
return $this->categoryValues;
}
public function setCategoryValues( ?string $categoryValues ): self
{
$this->categoryValues = $categoryValues;
return $this;
}
}