<?php
declare(strict_types=1);
namespace App\Entity\Order;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Setono\SyliusMailchimpPlugin\Model\OrderInterface as SetonoSyliusMailchimpPluginOrderInterface;
use Setono\SyliusMailchimpPlugin\Model\OrderTrait as SetonoSyliusMailchimpPluginOrderTrait;
use Sylius\Component\Core\Model\AdjustmentInterface;
use Sylius\Component\Core\Model\Order as BaseOrder;
use Sylius\Component\Resource\Model\ArchivableTrait;
/**
* @ORM\Entity
* @ORM\Table(name="sylius_order")
*
* @method Collection|OrderItem[] getItems()
*/
class Order extends BaseOrder implements SetonoSyliusMailchimpPluginOrderInterface
{
use ArchivableTrait;
use SetonoSyliusMailchimpPluginOrderTrait;
public const STATE_QUOTATION = 'quotation';
/**
* @var \DateTimeInterface|null
*
* @ORM\Column(name="archived_at", type="datetime", nullable=true)
*/
protected $archivedAt;
/** @ORM\Column(name="shipping_date_estimated", type="datetime", nullable=true) */
protected ?DateTime $shippingDateEstimated;
/** @ORM\Column(name="date_validation_payment", type="datetime", nullable=true) */
protected ?DateTime $dateValidationPayment;
/**
* @ORM\ManyToOne(targetEntity=OrderStatus::class, inversedBy="orders")
* @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
*/
protected $orderStatus;
/** @ORM\Column(type="boolean") */
protected $pickingPrint = false;
/**
* @ORM\Column(name="admin_order_comment", type="string", nullable=true)
*/
protected ?string $adminOrderComment = null;
public function __construct()
{
parent::__construct();
$this->messageHistories = new ArrayCollection();
}
public function getShippingDateEstimated(): ?DateTime
{
return $this->shippingDateEstimated;
}
public function setShippingDateEstimated(?DateTime $shippingDateEstimated): void
{
$this->shippingDateEstimated = $shippingDateEstimated;
}
public function getOrderStatus(): ?OrderStatus
{
return $this->orderStatus;
}
public function setOrderStatus(?OrderStatus $orderStatus): self
{
$this->orderStatus = $orderStatus;
return $this;
}
public function isPickingPrint(): bool
{
return $this->pickingPrint;
}
public function setPickingPrint(bool $pickingPrint): void
{
$this->pickingPrint = $pickingPrint;
}
/* Récupère le subtotal de la commande avec sous taxes */
public function getItemsTotalWithTaxes(?bool $withTaxes = false): int
{
// récupère les taxes de l'order sans prendre la tax du/des shipments
$totalTaxOrder = 0;
foreach ($this->getItems() as $item) {
$totalTaxItem = array_reduce(
$item->getAdjustmentsRecursively(AdjustmentInterface::TAX_ADJUSTMENT)->toArray(),
static fn (int $total, AdjustmentInterface $adjustment) => $withTaxes === $adjustment->isNeutral() ? $total + $adjustment->getAmount() : $total,
0
);
$totalTaxOrder += $totalTaxItem;
}
return $this->itemsTotal - $totalTaxOrder;
}
public function canBeProcessed(): bool
{
return $this->state === self::STATE_CART;
}
public function getDateValidationPayment(): ?DateTime
{
return $this->dateValidationPayment;
}
public function setDateValidationPayment(?DateTime $dateValidationPayment): void
{
$this->dateValidationPayment = $dateValidationPayment;
}
public function getAdminOrderComment(): ?string
{
return $this->adminOrderComment;
}
public function setAdminOrderComment(?string $adminOrderComment): void
{
$this->adminOrderComment = $adminOrderComment;
}
}