<?php
namespace App\Entity;
use App\Enum\ReturnStatus;
use App\Enum\ReturnType;
use App\Repository\SalesReturnRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: SalesReturnRepository::class)]
#[ORM\Table(name: 'sales_return')]
#[ORM\HasLifecycleCallbacks]
class SalesReturn extends BaseEntity
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private ?int $id = null;
#[ORM\Column(length: 32, unique: true)]
private ?string $referenceNumber = null;
#[ORM\ManyToOne(targetEntity: Sales::class, inversedBy: 'returns')]
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
private ?Sales $sale = null;
#[ORM\ManyToOne(targetEntity: Customer::class)]
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
private ?Customer $customer = null;
#[ORM\Column(length: 32, enumType: ReturnType::class)]
private ReturnType $type = ReturnType::PARTIAL_RETURN;
#[ORM\Column(length: 32, enumType: ReturnStatus::class)]
private ReturnStatus $status = ReturnStatus::REQUESTED;
#[ORM\Column(type: 'datetime_immutable')]
private \DateTimeImmutable $requestedAt;
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private ?\DateTimeImmutable $processedAt = null;
#[ORM\ManyToOne(targetEntity: User::class)]
#[ORM\JoinColumn(nullable: true, onDelete: 'SET NULL')]
private ?User $processedBy = null;
#[ORM\Column(type: Types::TEXT, nullable: true)]
private ?string $notes = null;
#[ORM\OneToMany(mappedBy: 'salesReturn', targetEntity: SalesReturnItem::class, cascade: ['persist'], orphanRemoval: true)]
private Collection $items;
#[ORM\OneToMany(mappedBy: 'salesReturn', targetEntity: ReturnReplacementItem::class, cascade: ['persist'], orphanRemoval: true)]
private Collection $replacements;
public function __construct()
{
$this->requestedAt = new \DateTimeImmutable('now');
$this->items = new ArrayCollection();
$this->replacements = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getReferenceNumber(): ?string
{
return $this->referenceNumber;
}
public function setReferenceNumber(string $referenceNumber): self
{
$this->referenceNumber = $referenceNumber;
return $this;
}
public function getSale(): ?Sales
{
return $this->sale;
}
public function setSale(Sales $sale): self
{
$this->sale = $sale;
return $this;
}
public function getCustomer(): ?Customer
{
return $this->customer;
}
public function setCustomer(Customer $customer): self
{
$this->customer = $customer;
return $this;
}
public function getType(): ReturnType
{
return $this->type;
}
public function setType(ReturnType $type): self
{
$this->type = $type;
return $this;
}
public function getStatus(): ReturnStatus
{
return $this->status;
}
public function setStatus(ReturnStatus $status): self
{
$this->status = $status;
return $this;
}
public function getRequestedAt(): \DateTimeImmutable
{
return $this->requestedAt;
}
public function setRequestedAt(\DateTimeImmutable $requestedAt): self
{
$this->requestedAt = $requestedAt;
return $this;
}
public function getProcessedAt(): ?\DateTimeImmutable
{
return $this->processedAt;
}
public function setProcessedAt(?\DateTimeImmutable $processedAt): self
{
$this->processedAt = $processedAt;
return $this;
}
public function getProcessedBy(): ?User
{
return $this->processedBy;
}
public function setProcessedBy(?User $processedBy): self
{
$this->processedBy = $processedBy;
return $this;
}
public function getNotes(): ?string
{
return $this->notes;
}
public function setNotes(?string $notes): self
{
$this->notes = $notes;
return $this;
}
/**
* @return Collection<int, SalesReturnItem>
*/
public function getItems(): Collection
{
return $this->items;
}
public function addItem(SalesReturnItem $item): self
{
if (!$this->items->contains($item)) {
$this->items->add($item);
$item->setSalesReturn($this);
}
return $this;
}
public function removeItem(SalesReturnItem $item): self
{
if ($this->items->removeElement($item)) {
if ($item->getSalesReturn() === $this) {
$item->setSalesReturn(null);
}
}
return $this;
}
/**
* @return Collection<int, ReturnReplacementItem>
*/
public function getReplacements(): Collection
{
return $this->replacements;
}
public function addReplacement(ReturnReplacementItem $replacement): self
{
if (!$this->replacements->contains($replacement)) {
$this->replacements->add($replacement);
$replacement->setSalesReturn($this);
}
return $this;
}
public function removeReplacement(ReturnReplacementItem $replacement): self
{
if ($this->replacements->removeElement($replacement)) {
if ($replacement->getSalesReturn() === $this) {
$replacement->setSalesReturn(null);
}
}
return $this;
}
public function markProcessed(?User $user = null): void
{
$this->processedBy = $user;
$this->processedAt = new \DateTimeImmutable('now');
}
public function __toString(): string
{
return sprintf('SalesReturn #%s (%s)', $this->referenceNumber ?? $this->id ?? 'NEW', $this->status?->value ?? 'UNKNOWN');
}
}