<?php
namespace App\Entity;
// use App\Repository\MaterialStockRepository; ❌ @deprecated use StockRepository 👇
use App\Repository\StocksRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use phpDocumentor\Reflection\Types\Boolean;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
use App\Entity\Inventory;
use Doctrine\ORM\Mapping\UniqueConstraint;
/**
* ⚠️⚠️⚠️⚠️ REPLACE WITH ⚠️⚠️⚠️⚠️⚠️⚠️
* TODO 👇
* @deprecated MaterialStockRepository replace with StockRepository
*
* ORM\Entity(repositoryClass=MaterialStockRepository::class) ❌ use 👇
* @ORM\Entity(repositoryClass=StocksRepository::class)
* UniqueConstraint(name="unique_stock_item", columns={"location_id", "supplier_id", "stock_item_id"})
* @UniqueEntity(
* fields={"location_id", "supplied_product_id"},
* message="This item already exists in this location"
* )
* @ORM\Table(name="stocks", uniqueConstraints={
* @UniqueConstraint(
* name="unique_stock_item",
* columns={"location_id", "supplied_product_id"}
* )
* })
*/
class Stocks
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({
* "stock.core", "stock@core"
* })
*/
private $id;
/**
* TODO 👇
* @deprecated use this inside StockTransactions ??? use warehouse !!!
* @ORM\ManyToOne(targetEntity=Locations::class, inversedBy="stocks")
* @Groups({
* "stock.location",
* "stock:location",
* "stock@location"
* })
*/
private $location;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({
* "stock.core", "stock@core"
* })
*/
private $description;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({
* "stock.core", "stock@core"
* })
*/
private $notes;
/**
* @ORM\OneToMany(targetEntity=StockTransactions::class, mappedBy="stock", orphanRemoval=true, cascade={"persist", "remove"})
* @Groups({
* "stock.transactions", "stock@transactions"
* })
*/
private $stock_transactions;
/**
* Alboslute need
* deprecated use SupplierProducts deprecated denilmis ama kesin lazim olacak
* @ORM\ManyToOne(targetEntity=Suppliers::class, inversedBy="stocks")
* @Groups({
* "stock@supplier"
* })
*/
private $supplier;
/**
* TODO Ters iliskli olabilir Burayi cok iyi incele
* @see Stocks lar ile StockItem arasindaki iliski !!!
* @ORM\ManyToOne(targetEntity=StockItems::class, inversedBy="stocks")
* @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
* @Groups({
* "stock.item",
* "stock:stock_item",
* "stock@stock_item"
* })
*/
private $stock_item;
/**
* @deprecated use SupplierProducts
* ORM\Column(type="string", length=255, nullable=true)
* Groups({"dept_stock.core"})
*/
private $ean;
/**
* ⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️ READ ME ⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️⚠️️️️
* StockItem genelinde yapılan toplam hesaplamadan farklı olarak,
* bu alan belirli bir Stock (örneğin bir tedarikçiye veya lokasyona bağlı)
* için yapılan mevcut stok miktarını temsil eder.
*
* Örnek: Civata - Hilti 10 adet, Wirth 28 adet gibi.
*
* Bu değer veritabanında fiziksel bir kolon olarak yer almaz.
* Hesaplama, ilgili Doctrine Subscriber içerisinde dinamik olarak yapılır.
*
* @Groups({"stock.core", "stock@core"})
*/
private $available_stock_quantity;
/**
* @deprecated Use "stock@supplier_product" instead.
* @ORM\ManyToOne(targetEntity=SupplierProducts::class, inversedBy="stocks")
* @Groups({
* "stock.supplier.product",
* "stock:suppier_product",
*
* "stock@supplier_product"
* })
* @ORM\JoinColumn(onDelete="CASCADE")
*
*/
private $supplied_product;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({
* "stock.core", "stock@core"
* })
*/
private $min_stock_quantity;
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({"stock.core", "stock@core"})
*/
private $bin_number;
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({"stock.core", "stock@core"})
*/
private $rack;
/**
* @ORM\OneToMany(targetEntity=PurchaseRequestPositions::class, mappedBy="stock")
* @Groups({"stock:purchase.request.position"})
*/
private $purchase_request_positions;
/**
* Veritabanında fiziksel bir kolon değildir.
* Değerinin hesaplanma strategisi
*
* Bu Stock urunu alinabilir mi? yani daha once siparis edilmis ve status u approved yada declined'e gore!!
* @Groups({"stock:purchase_request_not_managed"})
*/
private $purchase_request_not_managed;
/**
* @ORM\ManyToOne(targetEntity=Warehouses::class, inversedBy="stocks")
* @ORM\JoinColumn(nullable=true) // Daha onceden kayit varsa cakismasin degilse bos olabilir
* @Groups({
* "stock@warehouse"
* })
*/
private $warehouse;
/**
* @ORM\OneToMany(targetEntity=ProjectOrderExpensePositions::class, mappedBy="stock")
* @Groups({
* "stock@expense_positions"
* })
*/
private $project_order_expense_positions;
/**
* @ORM\OneToMany(targetEntity=StockIssuePositions::class, mappedBy="stock")
*/
private $stock_issue_positions;
public function getPurchaseRequestNotManaged(): ?PurchaseRequestPositions {
$founded = $this->getPurchaseRequestPositions()->filter(function (PurchaseRequestPositions $position) {
return $position->getApprovedAt() === null && $position->getRejectedAt() === null;
});
#dd($founded);
return $founded->count() ? $founded->first() : null;
}
/**
* Veritabanında fiziksel bir kolon değildir.
* Değeri Doctrine Subscriber tarafından dinamik olarak hesaplanır.
*/
public function getAvailableStockQuantity(): float
{
return $this->available_stock_quantity;
}
/**
* Veritabanında fiziksel bir kolon değildir.
* Değeri Doctrine Subscriber tarafından dinamik olarak hesaplanır.
*/
public function setAvailableStockQuantity(?float $final_quantity )
{
$this->available_stock_quantity = $final_quantity ?? 0;
}
public function __construct()
{
$this->stock_transactions = new ArrayCollection();
$this->purchase_request_positions = new ArrayCollection();
$this->project_order_expense_positions = new ArrayCollection();
$this->stock_issue_positions = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getLocation(): ?Locations
{
return $this->location;
}
public function setLocation(?Locations $location): self
{
$this->location = $location;
return $this;
}
public function getSupplier(): ?Suppliers
{
return $this->supplier;
}
public function setSupplier(?Suppliers $supplier): self
{
$this->supplier = $supplier;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getNotes(): ?string
{
return $this->notes;
}
public function setNotes(?string $notes): self
{
$this->notes = $notes;
return $this;
}
/**
* @return Collection<int, StockTransactions>
*/
public function getStockTransactions(): Collection
{
return $this->stock_transactions;
}
public function addStockTransaction(StockTransactions $stockTransaction): self
{
if (!$this->stock_transactions->contains($stockTransaction)) {
$this->stock_transactions[] = $stockTransaction;
$stockTransaction->setStock($this);
}
return $this;
}
public function removeStockTransaction(StockTransactions $stockTransaction): self
{
if ($this->stock_transactions->removeElement($stockTransaction)) {
// set the owning side to null (unless already changed)
if ($stockTransaction->getStock() === $this) {
$stockTransaction->setStock(null);
}
}
return $this;
}
public function getStockItem(): ?StockItems
{
return $this->stock_item;
}
public function setStockItem(?StockItems $stock_item): self
{
$this->stock_item = $stock_item;
return $this;
}
public function getEan(): ?string
{
return $this->ean;
}
public function setEan(?string $ean): self
{
$this->ean = $ean;
return $this;
}
public function getSuppliedProduct(): ?SupplierProducts
{
return $this->supplied_product;
}
public function setSuppliedProduct(?SupplierProducts $supplied_product): self
{
$this->supplied_product = $supplied_product;
return $this;
}
public function getMinStockQuantity(): ?float
{
return $this->min_stock_quantity;
}
public function setMinStockQuantity(?float $min_stock_quantity): self
{
$this->min_stock_quantity = $min_stock_quantity;
return $this;
}
public function getBinNumber(): ?string
{
return $this->bin_number;
}
public function setBinNumber(?string $bin_number): self
{
$this->bin_number = $bin_number;
return $this;
}
public function getRack(): ?string
{
return $this->rack;
}
public function setRack(?string $rack): self
{
$this->rack = $rack;
return $this;
}
/**
* @return Collection<int, PurchaseRequest>
*/
public function getPurchaseRequestPositions(): Collection
{
return $this->purchase_request_positions;
}
public function addPurchaseRequest(PurchaseRequest $purchaseRequest): self
{
if (!$this->purchase_request_positions->contains($purchaseRequest)) {
$this->purchase_request_positions[] = $purchaseRequest;
$purchaseRequest->setStock($this);
}
return $this;
}
public function removePurchaseRequest(PurchaseRequest $purchaseRequest): self
{
if ($this->purchase_request_positions->removeElement($purchaseRequest)) {
// set the owning side to null (unless already changed)
if ($purchaseRequest->getStock() === $this) {
$purchaseRequest->setStock(null);
}
}
return $this;
}
public function getWarehouse(): ?Warehouses
{
return $this->warehouse;
}
public function setWarehouse(?Warehouses $warehouse): self
{
$this->warehouse = $warehouse;
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->setStock($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->getStock() === $this) {
$projectOrderExpensePosition->setStock(null);
}
}
return $this;
}
/**
* @return Collection<int, StockIssuePositions>
*/
public function getStockIssuePositions(): Collection
{
return $this->stock_issue_positions;
}
public function addStockIssuePosition(StockIssuePositions $stockIssuePosition): self
{
if (!$this->stock_issue_positions->contains($stockIssuePosition)) {
$this->stock_issue_positions[] = $stockIssuePosition;
$stockIssuePosition->setStock($this);
}
return $this;
}
public function removeStockIssuePosition(StockIssuePositions $stockIssuePosition): self
{
if ($this->stock_issue_positions->removeElement($stockIssuePosition)) {
// set the owning side to null (unless already changed)
if ($stockIssuePosition->getStock() === $this) {
$stockIssuePosition->setStock(null);
}
}
return $this;
}
}