Skip to content

beta version #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Model/Config/CurrencyRoundingConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@

namespace Opengento\CurrencyPrecision\Model\Config;

use Magento\Store\Model\ScopeInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Model\ScopeInterface;

/**
* System configuration of currencies rounding.
Expand Down
2 changes: 1 addition & 1 deletion Observer/AdjustCurrencyPrecision.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
namespace Opengento\CurrencyPrecision\Observer;

use Magento\Framework\DataObject;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Opengento\CurrencyPrecision\Model\CurrencyRounding;

/**
Expand Down
61 changes: 61 additions & 0 deletions Plugin/CatalogRule/Model/Indexer/ProductPriceCalculatorRound.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php
/**
* Copyright © OpenGento, All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Opengento\CurrencyPrecision\Plugin\CatalogRule\Model\Indexer;

use Magento\CatalogRule\Model\Indexer\ProductPriceCalculator;
use Magento\Directory\Model\PriceCurrency;
use Magento\Store\Model\StoreManager;

/**
* Set currency object for adminhtml side currency rounding.
*/
class ProductPriceCalculatorRound
{
/**
* @var StoreManager
*/
private $storeManager;

/**
* @var PriceCurrency
*/
private $priceCurrency;

/**
* ProductPriceCalculatorRound constructor.
* @param StoreManager $storeManager
* @param PriceCurrency $priceCurrency
*/
public function __construct(
StoreManager $storeManager,
PriceCurrency $priceCurrency
) {
$this->storeManager = $storeManager;
$this->priceCurrency = $priceCurrency;
}

/**
* Extract currency object and pass to CurrencyRoundingForAdmin
*
* @param ProductPriceCalculator $calculator
* @param $ruleData
* @param null $productData
* @return array
* @throws \Magento\Framework\Exception\LocalizedException
* @see \Opengento\CurrencyPrecision\Plugin\Directory\Model\CurrencyRoundingForAdmin
*/
public function beforeCalculate(
ProductPriceCalculator $calculator,
$ruleData,
$productData = null
) {
$website = $this->storeManager->getWebsite($ruleData['website_id']);
$currency = $this->priceCurrency->getCurrency($website->getDefaultStore()->getId());
return [$ruleData, $productData];
}
}
133 changes: 133 additions & 0 deletions Plugin/Directory/Model/CurrencyRoundingForAdmin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
<?php
/**
* Copyright © OpenGento, All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Opengento\CurrencyPrecision\Plugin\Directory\Model;

use Magento\Directory\Model\Currency;
use Magento\Directory\Model\PriceCurrency;
use Magento\Store\Model\StoreManager;
use Opengento\CurrencyPrecision\Model\CurrencyRounding as Model;

/**
* Replace standard rounding method with rounding based on currency precision and with configured rounding method.
*/
class CurrencyRoundingForAdmin
{
/**
* @var CurrencyRounding
*/
private $model;

/**
* @var StoreManager
*/
private $storeManager;

/**
* @var Currency
*/
private $currency;

/**
* @param Model $model
* @param StoreManager $storeManager
*/
public function __construct(
Model $model,
StoreManager $storeManager
) {
$this->model = $model;
$this->storeManager = $storeManager;
}

/**
* Override original method to apply correct rounding logic.
*
* @param PriceCurrency $priceCurrency
* @param \Closure $proceed
* @param float $amount
* @param string $scope
* @param string $currency
* @param int $precision
* @return float
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function aroundConvertAndRound(
PriceCurrency $priceCurrency,
\Closure $proceed,
$amount,
$scope = null,
$currency = null,
$precision = PriceCurrency::DEFAULT_PRECISION
) {
$targetCurrency = $priceCurrency->getCurrency($scope, $currency);
$convertedAmount = $this->storeManager->getStore($scope)->getBaseCurrency()->convert($amount, $targetCurrency);
if ($targetCurrency->getCode() === null) {
return $convertedAmount;
}

$roundedAmount = $this->round($targetCurrency->getCode(), (float)$convertedAmount);
return $roundedAmount;
}

/**
* Override original method to apply correct rounding logic.
*
* @param PriceCurrency $priceCurrency
* @param \Closure $proceed
* @param float $amount
* @return float
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*/
public function aroundRound(
PriceCurrency $priceCurrency,
\Closure $proceed,
$amount
) {
$currency = $this->currency;
$currencyCode = null;
if ($currency !== null) {
$currencyCode = $currency->getCode();
}

if ($currencyCode === null) {
return (float)$amount;
}

return $this->round($currencyCode, (float)$amount);
}

/**
* Set currency object when getCurrency called.
*
* @param \Magento\Directory\Model\PriceCurrency $subject
* @param $result
* @param bool|int|ScopeInterface|string|null $scope
* @param AbstractModel|string|null $currency
*/
public function afterGetCurrency(
PriceCurrency $subject,
$result,
$scope = null,
$currency = null
) {
$this->currency = $result;
return $result;
}



/**
* Round currency using rounding service.
*/
private function round(string $currencyCode, float $amount): float
{
return $this->model->round($currencyCode, $amount);
}

}
39 changes: 39 additions & 0 deletions Plugin/PayPal/Api/RoundAmount.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
namespace Opengento\CurrencyPrecision\Plugin\PayPal\Api;

use Magento\Paypal\Model\Api\Nvp;
use Opengento\CurrencyPrecision\Model\CurrencyRounding;

class RoundAmount
{
/**
* @var CurrencyRounding
*/
private $model;

/**
* RoundAmount constructor.
* @param CurrencyRounding $model
*/
public function __construct(
CurrencyRounding $model
) {
$this->model = $model;
}

/**
* @param Nvp $nvp
* @param \Closure $proceed
* @param $price
* @return string
*/
public function aroundFormatPrice(
Nvp $nvp,
\Closure $proceed,
$price
) {
$currencyCode = $nvp->getCurrencyCode();
$price = $this->model->round($currencyCode, $price);
return sprintf('%.2F', $price);
}
}
48 changes: 48 additions & 0 deletions Plugin/SalesRule/RoundDiscount.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php
namespace Opengento\CurrencyPrecision\Plugin\SalesRule;

use Magento\Quote\Model\Quote\Item\AbstractItem;
use Magento\SalesRule\Model\Rule;
use Magento\SalesRule\Model\Rule\Action\Discount\Data;
use Magento\SalesRule\Model\Rule\Action\Discount\DiscountInterface;
use Opengento\CurrencyPrecision\Model\CurrencyRounding;

class RoundDiscount
{
/**
* @var CurrencyRounding
*/
private $currencyRounding;

/**
* RoundDiscount constructor.
* @param CurrencyRounding $currencyRounding
*/
public function __construct(
CurrencyRounding $currencyRounding
) {
$this->currencyRounding = $currencyRounding;
}

/**
* @param DiscountInterface $subject
* @param Data $result
* @param Rule $rule
* @param AbstractItem $item
* @param float $qty
* @return Data $result
*/
public function afterCalculate(DiscountInterface $subject, $result, $rule, $item, $qty)
{
$quote = $item->getQuote();
$baseCurrency = $quote->getBaseCurrencyCode();
$quoteCurrency = $quote->getQuoteCurrencyCode();

$result->setAmount($this->currencyRounding->round($quoteCurrency, $result->getAmount()));
$result->setBaseAmount($this->currencyRounding->round($baseCurrency, $result->getBaseAmount()));
$result->setBaseOriginalAmount($this->currencyRounding->round($baseCurrency, $result->getBaseOriginalAmount()));
$result->setOriginalAmount($this->currencyRounding->round($quoteCurrency, $result->getOriginalAmount()));

return $result;
}
}
Loading