<?php
namespace App\Entity;
use App\Repository\ProjectOrderExpensePositionsRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\MaxDepth;
/**
* TODO Replace Entity Name with ExpensePositions (Too Props)
* @ORM\Entity(repositoryClass=ProjectOrderExpensePositionsRepository::class)
*/
class ProjectOrderExpensePositions
{
/**
* 💡💡💡💡
* project.orders.expense.positions.countable.version
* countable sadece exoense list üzerinde expense ait kac tane position oldugunu anlamak icin lazim!!!
* 💡💡💡💡
*/
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.positions.countable.version",
*
* "project.orders.expense.minify.version",
*
* "expense.position.core",
*
* "expense_position@core",
* "expense_position@base"
* })
*/
private $id;
/**
* @Groups({
* "project.orders.expense.position.base",
* })
*/
private $test;
/**
* @return mixed
*/
public function getTest()
{
return $this->test;
}
/**
* "project.orders.expense.position.base",
* @ORM\ManyToOne(targetEntity=ProjectOrderExpenses::class, inversedBy="projectOrderExpensePositions")
* @ORM\JoinColumn(onDelete="CASCADE")
* @Groups({
* "project.orders.expense.minify.version",
*
* "expense.position.expense",
*
* "expense_position@expense"
* })
*/
private $project_order_expense;
/**
* @ORM\ManyToOne(targetEntity=Material::class, inversedBy="projectOrderExpensePositions")
* @ORM\JoinColumn(nullable=true)
* @Groups({
* "material.base",
* "expense.position.material",
*
* "expense_position@material"
* })
*/
private $material;
/**
* Pozisyon miktarı (belgedeki "Menge"). Float — kg gibi kesirli miktarlar için
* (ör. 31.62 KG). PE ile: total = (unit / price_unit) × unit_price.
* @ORM\Column(type="float")
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
* "expense.position.core",
*
* "expense_position@core",
* "expense_position@base"
* })
*/
private $unit;
/**
* @ORM\Column(type="datetime_immutable")
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.core", "expense_position@core"
* })
*/
private $created_at;
/**
* @ORM\Column(type="datetime_immutable", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
*
* "expense.position.core", "expense_position@core"
* })
*/
private $delivered_at;
/**
* TODO not created yet!
* @deprecated use buying price instead
* @ORM\Column(type="decimal", precision=10, scale=2, nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
* "expense.position.core", "expense_position@core",
*
* "expense_position@base"
* })
*/
private $amount;
/**
* @ORM\Column(type="integer", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.core", "expense_position@core"
* })
*/
private $delivered_unit;
/**
* @ORM\Column(type="text", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "expense.position.core", "expense_position@core"
* })
*
*/
private $content;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.core", "expense_position@core"
* })
*/
private $completed;
/**
* @ORM\Column(type="text", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.core", "expense_position@core"
* })
*/
private $comment;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.core", "expense_position@core"
* })
*/
private $delivered_to;
/**
* @MaxDepth(1)
* @ORM\ManyToOne(targetEntity=ProjectOrders::class, inversedBy="projectOrderExpensePositions")
* @ORM\JoinColumn(onDelete="CASCADE")
* @Groups({
* "project.orders.expense.position.base",
* "project.order.expense.position.order",
*
* "expense.position.order",
*
* "expense_position@project_order"
* })
*/
private $project_order;
/**
* A manipulated or simulated column is used to prevent circular references.
* It is used for retrieving the necessary information related to an order in order to generate
* a list of minified expenses for the associated spending
* @Groups({
* "project.orders.expense.minify.version",
* })
*/
private $required_order_details_for_expense_history;
/**
* @return mixed
*/
public function getRequiredOrderDetailsForExpenseHistory(): array
{
if($this->getProjectOrder()){
return [
"id" => $this->getProjectOrder()->getId(),
"order_nr" => $this->getProjectOrder()->getOrderNr()
];
}
return [];
}
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.core", "expense_position@core"
* })
*/
private $an_supplier;
/**
* @ORM\ManyToOne(targetEntity=ProjectOrderExpensePositions::class, inversedBy="decomposed_positions", cascade={"persist"})
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.core", "expense_position@core"
* })
* @ORM\JoinColumn(onDelete="SET NULL")
*/
private $parent_pos;
/**
* @ORM\OneToMany(targetEntity=ProjectOrderExpensePositions::class, mappedBy="parent_pos")
* @Groups({
* "project.orders.expense.position.base",
* "expense.position.decomposed"
* })
*/
private $decomposed_positions;
/**
* TODO remove this forever
* @deprecated use documents as json
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "expense.position.core", "expense_position@core"
* })
*/
private $document;
/**
* @ORM\Column(type="json", nullable=true)
* @Groups({
* "expense_position@core"
* })
*/
private $documents;
/**
* @ORM\ManyToOne(targetEntity=Stocks::class, inversedBy="projectOrderExpensePositions")
* @Groups({
* "project_orders_expense_position@stock"
* })
*/
private $stock;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
* "expense.position.core", "expense_position@core"
* })
*/
private $buying_price;
/**
* Position-level override of supplier_products.price_unit (Preiseinheit / PE).
* NULL means inherit from supplier_product, or default to per single unit.
*
* @ORM\Column(type="float", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
* "expense.position.core", "expense_position@core"
* })
*/
private $price_unit;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
* "expense.position.core", "expense_position@core"
* })
*/
private $sales_price;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
* "expense.position.core", "expense_position@core"
* })
*/
private $sales_margin;
/**
* @ORM\OneToOne(targetEntity=PurchaseRequestPositions::class, inversedBy="expense_position", cascade={"persist", "remove"})
* @ORM\JoinColumn(onDelete="CASCADE")
* @Groups({
* "expense_position@purchse_request_position"
* })
*/
private $purchase_request_position;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({
* "project.orders.expense.position.base",
* "project.orders.expense.minify.version",
* "project.orders.expense.positions.countable.version",
* "expense.position.core", "expense_position@core"
* })
*/
private $delivery_amount;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"expense_position@core", "expense_position@base"})
*/
private $offer_nr;
/**
* @ORM\Column(type="string", nullable=true, columnDefinition="ENUM('item','service','delivery')")
* @Groups({"expense_position@core"})
*/
private $position_type;
/**
* @ORM\Column(type="string", nullable=true, columnDefinition="ENUM('pending','sent','delivered')")
* @Groups({"expense_position@core"})
*/
private $delivery_status;
/**
* @deprecated use supplier_product instead
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"expense_position@core", "expense_position@base"})
*/
private $size;
/**
* @ORM\ManyToOne(targetEntity=SupplierProducts::class, inversedBy="project_order_expense_positions")
* @ORM\JoinColumn(onDelete="CASCADE")
* @Groups({
* "expense_position@supplier_product"
* })
*/
private $supplier_product;
public function __construct()
{
$this->decomposed_positions = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getProjectOrderExpense(): ?ProjectOrderExpenses
{
return $this->project_order_expense;
}
public function setProjectOrderExpense(?ProjectOrderExpenses $project_order_expense): self
{
$this->project_order_expense = $project_order_expense;
return $this;
}
public function getMaterial(): ?Material
{
return $this->material;
}
public function setMaterial(?Material $material): self
{
$this->material = $material;
return $this;
}
public function getUnit(): ?float
{
return $this->unit;
}
public function setUnit(float $unit): self
{
$this->unit = $unit;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->created_at;
}
public function setCreatedAt(\DateTimeImmutable $created_at): self
{
$this->created_at = $created_at;
return $this;
}
public function getDeliveredAt(): ?\DateTimeImmutable
{
return $this->delivered_at;
}
public function setDeliveredAt(?\DateTimeImmutable $delivered_at): self
{
$this->delivered_at = $delivered_at;
return $this;
}
/**
* @deprecated use buying price instead
*/
public function getAmount(): ?string
{
return $this->amount;
}
/**
* @deprecated use buying price instead
*/
public function setAmount(?string $amount): self
{
$this->amount = $amount;
return $this;
}
public function getDeliveredUnit(): ?int
{
return $this->delivered_unit;
}
public function setDeliveredUnit(?int $delivered_unit): self
{
$this->delivered_unit = $delivered_unit;
return $this;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(?string $content): self
{
$this->content = $content;
return $this;
}
public function getCompleted(): ?bool
{
return $this->completed;
}
public function setCompleted(?bool $completed): self
{
$this->completed = $completed;
return $this;
}
public function getComment(): ?string
{
return $this->comment;
}
public function setComment(?string $comment): self
{
$this->comment = $comment;
return $this;
}
public function getDeliveredTo(): ?string
{
return $this->delivered_to;
}
public function setDeliveredTo(?string $delivered_to): self
{
$this->delivered_to = $delivered_to;
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 getAnSupplier(): ?string
{
return $this->an_supplier;
}
public function setAnSupplier(?string $an_supplier): self
{
$this->an_supplier = $an_supplier;
return $this;
}
public function getParentPos():? self
{
return $this->parent_pos;
}
public function setParentPos(?self $parent_pos): self
{
$this->parent_pos = $parent_pos;
return $this;
}
/**
* @return Collection<int, self>
*/
public function getDecomposedPositions(): Collection
{
return $this->decomposed_positions;
}
public function addDecomposedPosition(self $decomposedPosition): self
{
if (!$this->decomposed_positions->contains($decomposedPosition)) {
$this->decomposed_positions[] = $decomposedPosition;
$decomposedPosition->setParentPos($this);
}
return $this;
}
public function removeDecomposedPosition(self $decomposedPosition): self
{
if ($this->decomposed_positions->removeElement($decomposedPosition)) {
// set the owning side to null (unless already changed)
if ($decomposedPosition->getParentPos() === $this) {
$decomposedPosition->setParentPos(null);
}
}
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 getStock(): ?Stocks
{
return $this->stock;
}
public function setStock(?Stocks $stock): self
{
$this->stock = $stock;
return $this;
}
public function getBuyingPrice(): ?float
{
return $this->buying_price;
}
public function setBuyingPrice(?float $buying_price): self
{
$this->buying_price = $buying_price;
return $this;
}
public function getPriceUnit(): ?float
{
return $this->price_unit;
}
public function setPriceUnit(?float $price_unit): self
{
$this->price_unit = $price_unit;
return $this;
}
public function getSalesPrice(): ?float
{
return $this->sales_price;
}
public function setSalesPrice(?float $sales_price): self
{
$this->sales_price = $sales_price;
return $this;
}
public function getSalesMargin(): ?float
{
return $this->sales_margin;
}
public function setSalesMargin(?float $sales_margin): self
{
$this->sales_margin = $sales_margin;
return $this;
}
public function getPurchaseRequestPosition(): ?PurchaseRequestPositions
{
return $this->purchase_request_position;
}
public function setPurchaseRequestPosition(?PurchaseRequestPositions $purchase_request_position): self
{
$this->purchase_request_position = $purchase_request_position;
return $this;
}
public function getDeliveryAmount(): ?float
{
return $this->delivery_amount;
}
public function setDeliveryAmount(?float $delivery_amount): self
{
$this->delivery_amount = $delivery_amount;
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 getPositionType(): ?string { return $this->position_type; }
public function setPositionType(?string $position_type): self { $this->position_type = $position_type; return $this; }
public function getDeliveryStatus(): ?string { return $this->delivery_status; }
public function setDeliveryStatus(?string $delivery_status): self { $this->delivery_status = $delivery_status; return $this; }
public function getSize(): ?string { return $this->size; }
public function setSize(?string $size): self { $this->size = $size; return $this; }
public function getSupplierProduct(): ?SupplierProducts
{
return $this->supplier_product;
}
public function setSupplierProduct(?SupplierProducts $supplier_product): self
{
$this->supplier_product = $supplier_product;
return $this;
}
}