|
- <?php
-
- namespace Lc\ShopBundle\Model ;
-
- use Lc\ShopBundle\Context\ReductionCatalogInterface;
- use Lc\ShopBundle\Context\UnitInterface;
-
- trait PriceTrait
- {
-
-
- protected $price;
-
-
-
- protected $unit;
-
-
-
- protected $taxRate;
-
- public function getPrice(): ?float
- {
- return $this->price;
- }
-
- public function getPriceInherited(): ?float
- {
- return $this->getPrice() ;
- }
-
- public function getUnitInherited(): ?Unit
- {
- return $this->getUnit() ;
- }
-
- public function getTaxRateInherited(): ?TaxRate
- {
- return $this->getTaxRate() ;
- }
-
- public function getPriceWithTax(): ?float
- {
- return $this->calculatePriceWithTax($this->getPriceInherited(), $this->getTaxRateInherited()->getValue()) ;
- }
-
- public function getPriceByUnitRef(): ?float
- {
- return $this->calculatePriceByUnitRef($this->getPriceInherited()) ;
- }
-
- public function getPriceByUnitRefWithTax(): ?float
- {
- return $this->calculatePriceByUnitRef($this->getPriceWithTax()) ;
- }
-
- public function getTheReductionCatalog()
- {
- $reductionCatalog = false;
-
- if($this instanceof ProductFamily) {
- $reductionCatalog = $this->getReductionCatalog() ;
- }
- if($this instanceof Product) {
- $reductionCatalog = $this->getProductFamily()->getReductionCatalog() ;
- }
-
- return $reductionCatalog ;
- }
-
- public function getPriceByUnitRefWithTaxAndReduction(): ?float
- {
- $reductionCatalog = $this->getTheReductionCatalog() ;
-
- if (isset($reductionCatalog) && $reductionCatalog) {
- return $this->calculatePriceByUnitRef($this->getPriceWithTaxAndReductionCatalog($reductionCatalog)) ;
- }
- else {
- return $this->calculatePriceByUnitRef($this->getPriceWithTax());
- }
- }
-
- public function getPriceWithTaxAndReduction(): ?float
- {
- $reductionCatalog = $this->getTheReductionCatalog() ;
-
- if (isset($reductionCatalog) && $reductionCatalog) {
- return $this->getPriceWithTaxAndReductionCatalog($reductionCatalog);
- }
- else {
- return $this->getPriceWithTax();
- }
- }
-
- public function getPriceWithTaxAndReductionCatalog(ReductionCatalogInterface $reductionCatalog): ?float
- {
-
- if ($reductionCatalog->getUnit() == 'percent') {
-
- return $this->calculatePriceWithReductionPercent($this->getPriceWithTax(), $reductionCatalog->getValue());
-
-
- }elseif ($reductionCatalog->getUnit() == 'amount') {
- if ($reductionCatalog->getBehaviorTaxRate() == 'tax-excluded') {
- $priceReductionHT = $this->calculatePriceWithReductionAmount($this->getPriceInherited(), $reductionCatalog->getValue());
- return $this->calculatePriceWithTax($priceReductionHT, $this->getTaxRateInherited()->getValue());
- }else if ($reductionCatalog->getBehaviorTaxRate() == 'tax-included') {
- return $this->calculatePriceWithReductionAmount($this->getPriceWithTax(), $reductionCatalog->getValue());
- }
- }
- }
-
- public function setPrice(float $price): self
- {
- $this->price = $price;
-
- return $this;
- }
-
- public function getUnit(): ?Unit
- {
- return $this->unit;
- }
-
- public function setUnit(Unit $unit): self
- {
- $this->unit = $unit;
-
- return $this;
- }
-
- public function getTaxRate(): ?TaxRate
- {
- return $this->taxRate;
- }
-
- public function setTaxRate(?TaxRate $taxRate): self
- {
- $this->taxRate = $taxRate;
-
- return $this;
- }
-
- private function calculatePriceWithTax($priceWithoutTax, $taxRateValue): ?float
- {
- $price = floatval($priceWithoutTax) * ($taxRateValue / 100 + 1);
- $price = round((($price * 100)) / 100, 2);
- return $price;
- }
-
- public function calculatePriceWithReductionPercent($price, $percentValue): ?float
- {
- $price = floatval($price) * (1 - $percentValue / 100);
- $price = round((($price * 100)) / 100, 2);
- return $price;
- }
- public function calculatePriceWithReductionAmount($price, $amountValue): ?float
- {
- $price = floatval($price) - $amountValue;
- $price = round((($price * 100)) / 100, 2);
- return $price;
- }
-
- private function calculatePriceByUnitRef($price)
- {
- return ($price * $this->getUnitInherited()->getCoefficient()) / $this->getQuantityInherited() ;
- }
- }
|