getBehaviorPriceInherited() == 'by-piece') { return $entity->getPriceInherited() ; } elseif($entity->getBehaviorPriceInherited() == 'by-reference-unit') { if($entity->getQuantityInherited() > 0) { return $entity->getPriceByRefUnitInherited() * $entity->getQuantityInherited() ; } } } if($entity instanceof OrderProductInterface) { return $entity->getPrice() ; } return null ; } public function getPriceWithTax($entity) { return $this->applyTax( $this->getPrice($entity), $entity->getTaxRateInherited()->getValue() ) ; } public function getPriceWithTaxAndReduction($entity) { return $this->getPriceWithTaxAndReductionCatalog( $entity, $this->getPrice($entity), $this->getPriceWithTax($entity) ); } public function getPriceByRefUnit($entity) { if($entity instanceof ProductPropertyInterface) { if($entity->getBehaviorPriceInherited() == 'by-piece') { return ($this->getPrice($entity) * $entity->getUnitInherited()->getCoefficient()) / $entity->getQuantityInherited() ; } elseif($entity->getBehaviorPriceInherited() == 'by-reference-unit') { return $entity->getPriceByRefUnitInherited() ; } } if($entity instanceof OrderProductInterface) { return ($this->getPrice($entity) * $entity->getUnitInherited()->getCoefficient()) / $entity->getQuantityProduct() ; } return null ; } public function getPriceByRefUnitWithTax($entity) { return $this->applyTax( $this->getPriceByRefUnit($entity), $entity->getTaxRateInherited()->getValue() ) ; } public function getPriceByRefUnitWithTaxAndReduction($entity) { return $this->getPriceWithTaxAndReductionCatalog( $entity, $this->getPriceByRefUnit($entity), $this->getPriceByRefUnitWithTax($entity) ); } public function getTotal($entity) { if($entity instanceof OrderProductInterface) { return $entity->getQuantityOrder() * $this->getPrice($entity) ; } if($entity instanceof OrderShopInterface) { $total = 0 ; foreach($entity->getOrderProducts() as $orderProduct) { $total += $this->getTotal($orderProduct) ; } return $total ; } return null ; } public function getTotalWithTax($entity) { if($entity instanceof OrderProductInterface) { return $this->applyTax( $this->getTotal($entity), $entity->getTaxRateInherited()->getValue() ) ; } if($entity instanceof OrderShopInterface) { $total = 0 ; foreach($entity->getOrderProducts() as $orderProduct) { $total += $this->getTotalWithTax($orderProduct) ; } return $total ; } if($entity instanceof OrderShopInterface) { return $this->getTotalWithTaxByOrderProducts($entity->getOrderProducts()) ; } return null ; } public function getTotalWithTaxAndReduction($entity) { if($entity instanceof OrderProductInterface) { return $this->getPriceWithTaxAndReductionCatalog( $entity, $this->getTotal($entity), $this->getTotalWithTax($entity) ) ; } if($entity instanceof OrderShopInterface) { return $this->getTotalWithTaxAndReductionByOrderProducts($entity->getOrderProducts()) ; } } public function getTotalWithTaxByOrderProducts($orderProducts) { $totalWithTax = 0; foreach ($orderProducts as $orderProduct) { $totalWithTax += $this->getTotalWithTax($orderProduct); } return $totalWithTax; } public function getTotalWithTaxAndReductionByOrderProducts($orderProducts) { $totalWithTax = 0; foreach ($orderProducts as $orderProduct) { $totalWithTax += $this->getTotalWithTaxAndReduction($orderProduct); } return $totalWithTax; } public function getPriceWithTaxAndReductionCatalog($entity, $price, $priceWithTax, $reductionCatalog = null): ?float { if($reductionCatalog) { $reductionCatalogValue = $reductionCatalog->getValue() ; $reductionCatalogUnit = $reductionCatalog->getUnit() ; $reductionCatalogBehaviorTaxRate = $reductionCatalog->getBehaviorTaxRate() ; } else { if($entity instanceof ProductPropertyInterface) { $reductionCatalog = $entity->getReductionCatalogInherited() ; if($reductionCatalog) { $reductionCatalogValue = $reductionCatalog->getValue() ; $reductionCatalogUnit = $reductionCatalog->getUnit() ; $reductionCatalogBehaviorTaxRate = $reductionCatalog->getBehaviorTaxRate() ; } } if($entity instanceof OrderProductInterface) { $orderProductReductionCatalog = $entity->getOrderProductReductionCatalog() ; if($orderProductReductionCatalog) { $reductionCatalogValue = $orderProductReductionCatalog->getValue() ; $reductionCatalogUnit = $orderProductReductionCatalog->getUnit() ; $reductionCatalogBehaviorTaxRate = $orderProductReductionCatalog->getBehaviorTaxRate() ; } } } if(isset($reductionCatalogValue) && isset($reductionCatalogUnit) && isset($reductionCatalogBehaviorTaxRate)) { if ($reductionCatalogUnit == 'percent') { return $this->applyReductionPercent( $priceWithTax, $reductionCatalogValue ); } elseif ($reductionCatalogUnit == 'amount') { if($reductionCatalogBehaviorTaxRate == 'tax-excluded') { return $this->applyTax( $this->applyReductionAmount( $price, $reductionCatalogValue ), $this->getTaxRateInherited()->getValue() ); } elseif($reductionCatalogBehaviorTaxRate == 'tax-included') { return $this->applyReductionAmount( $priceWithTax, $reductionCatalogValue ); } } } return $priceWithTax ; } public function applyTax($price, $taxRateValue) { return $this->round($this->applyPercent($price, $taxRateValue)) ; } public function applyReductionPercent($price, $percentage) { return $this->applyPercent($price, -$percentage) ; } public function applyReductionAmount($price, $amount) { return $price - $amount ; } public function applyPercent($price, $percentage) { return $price * ($percentage / 100 + 1) ; } public function round($price) { return round((($price * 100)) / 100, 2); } }