|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- <?php
-
- namespace Lc\ShopBundle\Services;
-
- use Doctrine\Common\Collections\Collection;
- use Lc\ShopBundle\Context\OrderProductInterface;
- use Lc\ShopBundle\Context\OrderShopInterface;
- use Lc\ShopBundle\Context\ProductFamilyInterface;
- use Lc\ShopBundle\Context\ProductInterface;
- use Lc\ShopBundle\Context\ProductPropertyInterface;
- use Lc\ShopBundle\Context\ReductionCatalogInterface;
-
- class PriceUtils
- {
-
- public function getPrice($entity)
- {
- if ($entity instanceof ProductPropertyInterface) {
- if ($entity->getBehaviorPriceInherited() == 'by-piece') {
- return $entity->getPriceInherited();
- } elseif ($entity->getBehaviorPriceInherited() == 'by-reference-unit') {
- if ($entity->getQuantityInherited() > 0) {
- return $entity->getPriceByRefUnitInherited() * ($entity->getQuantityInherited() / $entity->getUnitInherited()->getCoefficient());
- }
- }
- }
-
- 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;
- }
-
- //C'est bizzare ce truc là
- //if($entity instanceof OrderShopInterface) {
- // return $this->getTotalOrderProducts($entity->getOrderProducts(), true) ;
- //}
- 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->getTotalOrderProductsWithTaxAndReduction($entity->getOrderProducts(), true, true);
- }
- }
-
- public function getTotalWithReduction($entity)
- {
- if ($entity instanceof OrderProductInterface) {
- return $this->getPriceWithReductionCatalog(
- $entity,
- $this->getTotal($entity),
- $this->getTotalWithTax($entity)
- );
- }
-
- if ($entity instanceof OrderShopInterface) {
- return $this->getTotalOrderProductsWithReduction($entity->getOrderProducts(), true, true);
- }
- }
-
- public function getTotalOrderProductsWithReductionCart(OrderShopInterface $order)
- {
- $this->_getTotalOrderProductsWithReductionCartGeneric($order, false);
- }
-
- public function getTotalOrderProductsWithTaxAndReductionCart(OrderShopInterface $order)
- {
- $this->_getTotalOrderProductsWithReductionCartGeneric($order, true);
- }
-
- private function _getTotalOrderProductsWithReductionCartGeneric(OrderShopInterface $order, $withTax = true)
- {
-
- if ($withTax) {
- $priceToReturn = $this->getTotalOrderProductsWithTaxAndReductionCatalog($order);
- }
- else {
- $priceToReturn = $this->getTotalOrderProductsWithReductionCatalog($order);
- }
- foreach ($order->getOrderReductionCarts() as $orderReductionCart) {
- if ($orderReductionCart->getUnit() == 'percent') {
-
- $priceToReturn = $this->applyReductionPercent(
- $priceToReturn,
- $orderReductionCart->getValue
- );
- } else if ($orderReductionCart->getUnit() == 'amount') {
- if ($orderReductionCart->getBehaviorTaxRate() == 'tax-inlcluded') {
- $priceToReturn =
- $this->applyReductionAmount(
- $priceToReturn,
- $orderReductionCart->getValue()
- );
- }
- }
- }
- }
-
-
- public function getTotalOrderProducts($entity)
- {
- return $this->getSumOrderProductsDispatch($entity);
- }
-
- public function getTotalOrderProductsWithTax($entity)
- {
- return $this->getSumOrderProductsDispatch($entity, true);
- }
-
- public function getTotalOrderProductsWithReduction($entity)
- {
- return $this->getTotalOrderProductsWithReductionCatalog($entity);
- }
-
- public function getTotalOrderProductsWithTaxAndReduction($entity)
- {
- return $this->getTotalOrderProductsWithTaxAndReductionCatalog($entity);
- }
-
- public function getTotalOrderProductsWithReductionCatalog($entity)
- {
- return $this->getSumOrderProductsDispatch($entity, false, true);
- }
-
- public function getTotalOrderProductsWithTaxAndReductionCatalog($entity)
- {
- return $this->getSumOrderProductsDispatch($entity, true, true);
- }
-
- public function getSumOrderProductsDispatch($entity, $withTax = false, $withReductionCatalog = false)
- {
- if ($entity instanceof OrderShopInterface) {
- return $this->getSumOrderProducts($entity->getOrderProducts(), $withTax, $withReductionCatalog);
- }
- if ($entity instanceof Collection || is_array($entity)) {
- return $this->getSumOrderProducts($entity, $withTax, $withReductionCatalog);
- }
- }
-
- public function getSumOrderProducts($orderProducts, $withTax = false, $withReductionCatalog = false)
- {
- $total = 0;
- foreach ($orderProducts as $orderProduct) {
- if ($withTax && $withReductionCatalog) {
- $total += $this->getTotalWithTaxAndReduction($orderProduct);
- } elseif ($withTax) {
- $total += $this->getTotalWithTax($orderProduct);
- } elseif ($withReductionCatalog) {
- $total += $this->getTotalWithReduction($orderProduct);
- } else {
- $total += $this->getTotal($orderProduct);
- }
- }
- return $total;
- }
-
- public function getPriceWithTaxAndReductionCatalog($entity, $price, $priceWithTax, $reductionCatalog = null)
- {
- return $this->getPriceWithReductionCatalogGeneric($entity, $price, $priceWithTax, $reductionCatalog, true);
- }
-
- public function getPriceWithReductionCatalog($entity, $price, $priceWithTax, $reductionCatalog = null)
- {
- return $this->getPriceWithReductionCatalogGeneric($entity, $price, $priceWithTax, $reductionCatalog, false);
- }
-
- public function getPriceWithReductionCatalogGeneric($entity, $price, $priceWithTax, $reductionCatalog = null, $withTax = true): ?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') {
- $priceWithTax = $this->applyReductionPercent(
- $priceWithTax,
- $reductionCatalogValue
- );
- } elseif ($reductionCatalogUnit == 'amount') {
- if ($reductionCatalogBehaviorTaxRate == 'tax-excluded') {
- $priceWithTax = $this->applyTax(
- $this->applyReductionAmount(
- $price,
- $reductionCatalogValue
- ),
- $entity->getTaxRateInherited()->getValue()
- );
- } elseif ($reductionCatalogBehaviorTaxRate == 'tax-included') {
- $priceWithTax = $this->applyReductionAmount(
- $priceWithTax,
- $reductionCatalogValue
- );
- }
- }
- }
-
- if ($withTax) {
- $priceReturn = $priceWithTax;
- } else {
- $priceReturn = $this->applyPercentNegative($priceWithTax, $entity->getTaxRateInherited()->getValue());
- }
-
- return $this->round($priceReturn);
- }
-
- public function getTotalTaxes($entity)
- {
- if ($entity instanceof OrderProductInterface) {
- return $this->getTotalWithReduction($entity) * ($entity->getTaxRateInherited()->getValue() / 100);
- }
-
- if ($entity instanceof OrderShopInterface) {
- $totalTaxes = 0;
- foreach ($entity->getOrderProducts() as $orderProduct) {
- $totalTaxes += $this->getTotalTaxes($orderProduct);
- }
- return $totalTaxes;
- }
-
- return 0;
- }
-
- 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 applyPercentNegative($price, $percentage)
- {
- return $price / ($percentage / 100 + 1);
- }
-
- public function round($price)
- {
- return round((($price * 100)) / 100, 2);
- }
-
- }
-
|