¿Cómo obtener el precio del producto en todas las monedas permitidas?

10

Tengo una configuración con dos vistas de la tienda.

La primera vista de la tienda tiene base y la única moneda establecida en USD. El segundo tiene 2 monedas permitidas: USD y EUR. EUR es el valor predeterminado que se muestra, USD se establece como base.

Los precios de todos los productos se establecen solo en USD y el tipo de cambio para EUR se establece en 0,75. El precio del producto es, digamos, $ 14.

Y mi código dice:

// 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();

Este código siempre obtiene el precio correcto (10,50) en EUR. Pero necesito ambos precios, en USD y en EUR, pero no encontré una manera de pasar la moneda a ningún getPricemétodo.

Traté de usar Magento\Directory\Helper\Datapara convertir:

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

Pero me da $ 13.99 cuando el precio real en USD es $ 14, por lo que el cálculo es incorrecto.

¿Sabes cómo puedo obtener los precios de los productos para las monedas de ambas tiendas? ¡Muchas gracias!

Jan Petr
fuente

Respuestas:

1

Cuando sientes que 'el cálculo es incorrecto', siempre es útil mirar el código fuente. Cuando miro \Magento\Directory\Model\Currency::convert()(este es el método interno que \Magento\Directory\Helper\Data::currencyConvert()usa), veo algo interesante:

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

Esto significa que convierte el precio a la tasa establecida en $toCurrency. En su ejemplo, su conversión de EUR a USD. Supongo que la tasa de USD es 1.00, así que cuando estás convirtiendo 14 USD * 1.00, obtienes 13.99 (¿supongo que esto se debe a cómo funcionan los números flotantes?).

¿Cómo resolver esto? Bueno, tiene su precio base en USD, y sabe que el EUR tiene una tasa de 0,75, por lo que si tiene un código que obtiene el precio base de su producto, carga la tasa del EUR y lo multiplica con lo que podría estar listo. . Por ejemplo:

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

Todavía no lo he probado, así que no estoy seguro de si funciona, solo sigo el código. Pero quizás te ayude a encontrar tu solución.

Giel Berkers
fuente
1

Por favor use el siguiente código

$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
fuente