Comment obtenir le prix du produit dans toutes les devises autorisées?

10

J'ai une configuration avec deux vues de magasin.

La première vue de magasin a une base et la seule devise définie sur USD. Le second a 2 devises autorisées - USD et EUR. EUR est celui affiché par défaut, USD est défini comme base.

Tous les prix des produits sont fixés uniquement en USD et le taux de change pour l'EUR est fixé à 0,75. Le prix du produit est disons 14 $.

Et mon code va:

// Store ID 2 - default currency EUR, base currency USD
// $product is instance of Magento\Catalog\Model\Product
$priceInfo = $product->getPriceInfo();
$price = $priceInfo->getPrice('regular_price')->getValue();

Ce code récupère toujours le prix correct (10,50) en EUR. Mais j'ai besoin des deux prix - en USD et en EUR, mais je n'ai trouvé aucun moyen de passer de la monnaie à n'importe quelle getPriceméthode.

J'ai essayé d'utiliser Magento\Directory\Helper\Datapour convertir:

$helper->currencyConvert($price, 'EUR', 'USD');

Mais cela me donne 13,99 $ lorsque le prix réel en USD est de 14 $ - donc le calcul est faux.

Savez-vous comment puis-je obtenir les prix des produits pour les deux devises du magasin? Merci beaucoup!

Jan Petr
la source

Réponses:

1

Lorsque vous vous sentez «le calcul est faux», il est toujours utile de regarder le code source. Quand je regarde \Magento\Directory\Model\Currency::convert()(c'est la méthode interne qui \Magento\Directory\Helper\Data::currencyConvert()utilise), je vois quelque chose d'intéressant:

public function convert($price, $toCurrency = null)
{
    if ($toCurrency === null) {
        return $price;
    } elseif ($rate = $this->getRate($toCurrency)) {
        return $price * $rate;
    }

Cela signifie qu'il convertit le prix au taux défini dans le $toCurrency. Dans votre exemple, vous convertissez EUR en USD. Je suppose que le taux d'USD est de 1,00, donc lorsque vous convertissez 14 USD * 1,00, vous obtenez 13,99 (je suppose que cela est dû au fonctionnement des nombres flottants?).

Comment résoudre ça? Eh bien, vous avez votre prix de base en USD et vous savez que l'EUR a un taux de 0,75, donc si vous avez un code qui récupère le prix de base de votre produit, charge le taux EUR et le multiplie avec celui que vous pourriez être configuré pour aller . Par exemple:

$basePrice = $product->getPrice();
$currency  = $currencyFactory->create()->load('EUR');
$eurPrice  = $currency->convert($basePrice, 'EUR');

Je ne l'ai pas encore testé, donc je ne sais pas si cela fonctionne, en suivant uniquement le code. Mais peut-être que cela vous aide à trouver votre solution.

Giel Berkers
la source
1

Veuillez utiliser le code ci-dessous

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productId = 46;
$product = $objectManager->create('Magento\Catalog\Model\Product')->load(productId );
$price = $product->getFinalPrice();
$currency = $objectManager->create('Magento\Directory\Model\Currency')->load('USD');
echo $currency->convert($price,'EUR');
Nilesh Gosai
la source