<?php
namespace App\Entity;
use App\Repository\ProjectOrderExpensesRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\MaxDepth;
/**
* TODO Replace Entity Name with Expenses (Too Props)
* ORM\Entity(repositoryClass=ProjectOrderExpensesRepository::class)
* @UniqueEntity(
* fields={"supplier", "invoice_nr"},
* message="This invoice already created, please try another one|This invoice with combination %s %s already created, please try another one"
* )
* FULL TEXT SEARCH INDEX SUPPORT
* @ORM\Entity(repositoryClass=ProjectOrderExpensesRepository::class)
* @ORM\Table(
* name="project_order_expenses",
* indexes={
* @ORM\Index(name="search_indx", columns={"invoice_nr", "expense_nr"}, flags={"fulltext"})
* },
* options={"comment": "Replace this table name to expenses"}
* )
*
*/
// README annotation info
//
class ProjectOrderExpenses
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* 👉project.orders.expense.minify.base.for.position Expense Position Project ordar'a related oldugu icin bu Positionnun bagli oldugu expense mini bilgileri veriyori, yoksa circular reference olusuyor
* @Groups({
* "project.orders.expense.base",
* "project.orders.expense.minify.version",
*
* "expense.core",
* "expense:core",
*
* "expense@base",
* "expense@core"
* })
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Suppliers::class, inversedBy="projectOrderExpenses")
* @ORM\JoinColumn(nullable=false)
* @Groups({
* "supplier.base",
* "project.orders.expense.minify.version",
*
* "expense.supplier",
*
* "expense@supplier"
* })
*/
private $supplier;
// /**
// * ❌❌❌❌❌❌ use in positions
// * @deprecated will remove completelly
// * ORM\ManyToOne(targetEntity=ProjectOrders::class, inversedBy="projectOrderExpenses")
// * Groups({
// * "project.orders.expense.assigned.order",
// *
// * })
// */
// private $project_order;
/**
* Tedarikçinin gönderdiği faturanın üzerindeki numara (dışarıdan gelir).
* supplier + invoice_nr kombinasyonu unique — aynı tedarikçinin aynı faturası sisteme iki kez işlenemez.
* @ORM\Column(type="string", length=64, nullable=true, unique=true )
* @ORM\JoinColumn(nullable=true)
* @Groups({
* "project.orders.expense.base",
* "expense.core",
* "expense:core",
*
* "expense@base",
* "expense@core"
* })
*/
private $invoice_nr;
/**
* @ORM\Column(type="datetime_immutable")
* @Groups({
* "project.orders.expense.base",
* "expense.core",
* "expense:core",
*
* "expense@base",
* "expense@core"
* })
*/
private $created_at;
/**
* @MaxDepth(1)
* "project.orders.expense.minify.version" for count
* @ORM\OneToMany(targetEntity=ProjectOrderExpensePositions::class, mappedBy="project_order_expense", cascade={"persist", "remove"})
* @Groups({
* "@deprecated_.project.orders.expense.positions",
* "expense.positions",
* "project.orders.expense.minify.version",
* "expense.positions",
*
* "expense@positions"
* })
* @ORM\OrderBy({"id": "DESC"})
*/
private $project_order_expense_positions;
/**
* @deprecated ❌❌❌❌❌❌❌ Amount use for older vers. with new use positions amount
*
* @ORM\Column(type="decimal", precision=10, scale=2, nullable=true)
* @Groups({
* "project.orders.expense.base"
* })
*/
private $amount;
/**
* Persisted canonical total of all positions, written on every upsert
* (ExpenseService::computeExpenseTotal). The list reads this directly —
* no client-side math. Formula mirrors FE calcPositionLineTotal:
* per position buying_price>0 ? (unit / PE) * buying_price : amount, plus delivery_amount.
*
* @ORM\Column(type="decimal", precision=10, scale=2, nullable=true)
* @Groups({
* "expense@core"
* })
*/
private $total;
/**
* @ORM\Column(type="datetime_immutable", nullable=true)
* @Groups({
* "project.orders.expense.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.position.expense",
*
* "expense.core", "expense:core",
*
*
* "expense@base",
* "expense@core"
* })
*/
private $expensed_at;
/**
* @ORM\Column(type="string", length=64, nullable=true, unique=true, options={"comment": "Bu bir siparis numarasi bir Proje>Orderlar icin yapilan siparislerin geneli"})
* @Groups({
* "project.orders.expense.base",
* "project.orders.expense.minify.version",
* "expense.core", "expense:core",
* "expense@base",
* "expense@core"
* })
*/
private $expense_nr;
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({"expense@core"})
*/
private $offer_nr;
/**
* @ORM\Column(type="datetime_immutable", nullable=true)
* @Groups({"expense@core"})
*/
private $offer_at;
/**
* @ORM\Column(type="datetime_immutable", nullable=true)
* @Groups({"expense@core"})
*/
private $delivery_due_at;
/**
* @ORM\ManyToOne(targetEntity=Locations::class)
* @ORM\JoinColumn(nullable=true)
* @Groups({"expense@deliver_location"})
*/
private $deliver_location;
/**
* @ORM\Column(type="text", nullable=true)
* @Groups({
* "project.orders.expense.base",
*
* "expense.core", "expense:core",
*
* "expense@base",
* "expense@core"
* })
*/
private $comment;
/**
* @deprecated use documents as json
* TODO Replace with json and the name Documents!!!
* @ORM\Column(type="text", nullable=true)
* @Groups({
* "project.orders.expense.base",
* "project.orders.expense.minify.version",
*
* "expense.core", "expense:core",
*
* "expense@core"
* })
*/
private $document;
/**
* TODO Replace with json and the name Documents!!!
* @ORM\Column(type="json", nullable=true)
* @Groups({
* "expense@core"
* })
*/
private $documents;
/**
* ORM\OneToOne(targetEntity=PurchaseRequest::class, mappedBy="expense", cascade={"persist", "remove"})
* @ORM\ManyToOne(targetEntity=PurchaseRequest::class, inversedBy="expense", cascade={"persist", "remove"})
* @ORM\JoinColumn(nullable=true, onDelete="CASCADE")
* @Groups({
* "expense:purchse_request",
*
*
* "expense@purchse_request"
* })
*/
private $purchase_request;
public function __construct()
{
$this->project_order_expense_positions = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getSupplier(): ?Suppliers
{
return $this->supplier;
}
public function setSupplier(?Suppliers $supplier): self
{
$this->supplier = $supplier;
return $this;
}
// public function getProjectOrder(): ?ProjectOrders
// {
// return $this->project_order;
// }
//
// public function setProjectOrder(?ProjectOrders $project_order): self
// {
// $this->project_order = $project_order;
//
// return $this;
// }
public function getInvoiceNr(): ?string
{
return $this->invoice_nr;
}
public function setInvoiceNr(?string $invoice_nr): self
{
$this->invoice_nr = $invoice_nr;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->created_at;
}
public function setCreatedAt(\DateTimeImmutable $created_at): self
{
$this->created_at = $created_at;
return $this;
}
/**
* @return Collection<int, ProjectOrderExpensePositions>
*/
public function getProjectOrderExpensePositions(): Collection
{
return $this->project_order_expense_positions;
}
public function addProjectOrderExpensePosition(ProjectOrderExpensePositions $projectOrderExpensePosition): self
{
if (!$this->project_order_expense_positions->contains($projectOrderExpensePosition)) {
$this->project_order_expense_positions[] = $projectOrderExpensePosition;
$projectOrderExpensePosition->setProjectOrderExpense($this);
}
return $this;
}
public function removeProjectOrderExpensePosition(ProjectOrderExpensePositions $projectOrderExpensePosition): self
{
if ($this->project_order_expense_positions->removeElement($projectOrderExpensePosition)) {
// set the owning side to null (unless already changed)
if ($projectOrderExpensePosition->getProjectOrderExpense() === $this) {
$projectOrderExpensePosition->setProjectOrderExpense(null);
}
}
return $this;
}
public function getAmount(): ?string
{
return $this->amount;
}
public function setAmount(?string $amount): self
{
$this->amount = $amount;
return $this;
}
public function getTotal(): ?string
{
return $this->total;
}
public function setTotal(?string $total): self
{
$this->total = $total;
return $this;
}
public function getExpensedAt(): ?\DateTimeImmutable
{
return $this->expensed_at;
}
public function setExpensedAt(?\DateTimeImmutable $expensed_at): self
{
$this->expensed_at = $expensed_at;
return $this;
}
public function getExpenseNr(): ?string
{
return $this->expense_nr;
}
public function setExpenseNr(?string $expense_nr): self
{
$this->expense_nr = $expense_nr;
return $this;
}
public function getOfferNr(): ?string
{
return $this->offer_nr;
}
public function setOfferNr(?string $offer_nr): self
{
$this->offer_nr = $offer_nr;
return $this;
}
public function getOfferAt(): ?\DateTimeImmutable
{
return $this->offer_at;
}
public function setOfferAt(?\DateTimeImmutable $offer_at): self
{
$this->offer_at = $offer_at;
return $this;
}
public function getComment(): ?string
{
return $this->comment;
}
public function setComment(?string $comment): self
{
$this->comment = $comment;
return $this;
}
/**
* TODO remove this forever
* @deprecated use documents as json
*/
public function getDocument(): ?string
{
return $this->document;
}
/**
* TODO remove this forever
* @deprecated use documents as json
*/
public function setDocument(?string $document): self
{
$this->document = $document;
return $this;
}
public function getDocuments(): ?array { return $this->documents; }
public function setDocuments(?array $documents): self { $this->documents = $documents; return $this;}
public function getDeliveryDueAt(): ?\DateTimeImmutable
{
return $this->delivery_due_at;
}
public function setDeliveryDueAt(?\DateTimeImmutable $delivery_due_at): self
{
$this->delivery_due_at = $delivery_due_at;
return $this;
}
public function getDeliverLocation(): ?Locations
{
return $this->deliver_location;
}
public function setDeliverLocation(?Locations $deliver_location): self
{
$this->deliver_location = $deliver_location;
return $this;
}
public function getPurchaseRequest(): ?PurchaseRequest
{
return $this->purchase_request;
}
public function setPurchaseRequest(?PurchaseRequest $purchase_request): self
{
$this->purchase_request = $purchase_request;
return $this;
}
}