productSolver = $productSolver; $this->productFamilySolver = $productFamilySolver; } public function getSolver(ProductPropertyInterface $product) { if($product instanceof ProductFamilyInterface) { return $this->productFamilySolver; } if($product instanceof ProductInterface) { return $this->productSolver; } } public function getPrice(ProductPropertyInterface $product) { $solver = $this->getSolver($product); if ($solver->getBehaviorPriceInherited($product) == 'by-piece') { return $solver->getPriceInherited($product); } elseif ($solver->getBehaviorPriceInherited($product) == 'by-reference-unit') { if ($solver->getQuantityInherited($product) > 0) { return $solver->getPriceByRefUnitInherited($product) * ($solver->getQuantityInherited($product ) / $solver->getUnitInherited($product)->getCoefficient()); } else { return 0; } } } public function getPriceWithTax(ProductPropertyInterface $product) { return $this->applyTax( $this->getPrice($product), $this->productFamilySolver->getTaxRateInherited($product)->getValue() ); } public function getPriceByRefUnit(ProductPropertyInterface $product) { $solver = $this->getSolver($product); if ($solver->getBehaviorPriceInherited($product) == 'by-piece') { return ($this->getPrice($product) * $solver->getUnitInherited($product)->getCoefficient( )) / $solver->getQuantityInherited($product); } elseif ($solver->getBehaviorPriceInherited($product) == 'by-reference-unit') { return $solver->getPriceByRefUnitInherited($product); } } public function getPriceByRefUnitWithTax(ProductPropertyInterface $product) { return $this->applyTax( $this->getPriceByRefUnit($product), $this->productFamilySolver->getTaxRateInherited($product)->getValue() ); } public function getPriceWithTaxAndReduction(ProductPropertyInterface $product) { return $this->applyReductionCatalog( $product, $this->getPrice($product), $this->getPriceWithTax($product) ); } public function getPriceByRefUnitWithTaxAndReduction(ProductPropertyInterface $product) { return ($this->getPriceByRefUnitWithTax($product) * $this->getPriceWithTaxAndReduction($product)) / $this->getPriceWithTax($product); } public function getBuyingPrice(ProductPropertyInterface $product) { $solver = $this->getSolver($product); if ($solver->getBehaviorPriceInherited($product) == 'by-piece') { return $solver->getBuyingPriceInherited($product); } elseif ($solver->getBehaviorPriceInherited($product) == 'by-reference-unit') { if ($solver->getQuantityInherited($product) > 0) { return $solver->getBuyingPriceByRefUnitInherited($product) * ($solver->getQuantityInherited($product ) / $solver->getUnitInherited($product)->getCoefficient()); } else { return 0; } } } public function getBuyingPriceWithTax(ProductPropertyInterface $product) { return $this->applyTax( $this->getBuyingPrice($product), $this->productFamilySolver->getTaxRateInherited($product)->getValue() ); } public function getBuyingPriceByRefUnit(ProductPropertyInterface $product) { return $this->getSolver($product)->getBuyingPriceByRefUnitInherited($product); } public function getBuyingPriceByRefUnitWithTax(ProductPropertyInterface $product) { return $this->applyTax( $this->getBuyingPriceByRefUnit($product), $this->productFamilySolver->getTaxRateInherited($product)->getValue() ); } public function getMultiplyingFactor(ProductPropertyInterface $product) { return $this->round($this->getPriceWithTax($product) / $this->getBuyingPrice($product)); } }