💱 Multimoneda y conversion
Actualizado: 2024-12-01
Si vendes a nivel internacional, necesitas ofrecer precios en la moneda local del cliente. PrestaShop soporta multiples monedas con conversion automatica o precios fijos por moneda.
#Configurar monedas
Gestionar monedas programaticamente
php
<?php
// ── Obtener moneda actual del contexto ──
$currency = Context::getContext()->currency;
echo $currency->iso_code; // EUR
echo $currency->sign; // €
echo $currency->name; // Euro
// ── Obtener todas las monedas activas ──
$currencies = Currency::getCurrencies();
// [['id_currency' => 1, 'name' => 'Euro', 'iso_code' => 'EUR', ...], ...]
// ── Convertir precio a otra moneda ──
$priceEUR = 29.99;
$priceUSD = Tools::convertPrice($priceEUR, Currency::getIdByIsoCode('USD'));
// Usa la tasa de cambio configurada
// ── Conversion inversa (de otra moneda a la base) ──
$priceBase = Tools::convertPrice($priceUSD, Currency::getIdByIsoCode('USD'), false);
// false = conversion inversa
// ── Formatear precio con moneda ──
$formatted = Tools::displayPrice($priceEUR, $currency);
// "29,99 €" (segun locale y moneda)
// ── Obtener tasa de cambio ──
$usd = new Currency(Currency::getIdByIsoCode('USD'));
echo $usd->conversion_rate; // 1.08 (respecto a moneda base)
#Tasas de cambio
Actualizar tasas de cambio
text
DESDE EL BO
- Localizacion → Monedas
- Clic en "Actualizar tasas de cambio"
- Usa el servicio del Banco Central Europeo (ECB)
MEDIANTE CRON (recomendado)
- Automatizar actualizacion diaria:
php bin/console prestashop:update-currencies
MANUALMENTE
- Localizacion → Monedas → Editar USD
- Tasa de cambio: 1.08 (1 EUR = 1.08 USD)
PRECIOS FIJOS POR MONEDA
- En ficha producto → Precios → Precios especificos
- Crear precio especifico para moneda USD
- Fijar precio exacto: $32.99 (sin conversion)
- Util para precios psicologicos (29.99 vs 29.37)
#Precios por moneda en modulos
Manejar multimoneda en un modulo
php
<?php
// ── En hooks que muestran precios, SIEMPRE convertir ──
public function hookDisplayProductAdditionalInfo(array $params): string
{
$product = $params['product'];
$currency = Context::getContext()->currency;
// El precio del producto ya viene en la moneda actual si
// se obtiene via Product::getPrice() o desde $product['price']
$price = $product['price']; // Ya convertido
// Si calculas precios custom, convertir manualmente:
$customPriceEUR = 5.00; // Tu precio base siempre en moneda base
$customPrice = Tools::convertPrice($customPriceEUR, $currency);
$formatted = Tools::displayPrice($customPrice, $currency);
$this->context->smarty->assign([
'extra_fee' => $formatted,
]);
return $this->display(__FILE__, 'extra-fee.tpl');
}
// ── En el WebService, los precios siempre van en moneda base ──
// La conversion se hace en el front
// ── En el carrito ──
$cart = Context::getContext()->cart;
$total = $cart->getOrderTotal(true, Cart::BOTH);
// Ya en la moneda del contexto actual
#Conversion y redondeo
Configurar redondeo
text
Preferencias → General → Redondeo
MODO DE REDONDEO
- Redondeo al valor superior: 10.555 → 10.56
- Redondeo al valor inferior: 10.555 → 10.55
- Redondeo clasico: 10.555 → 10.56 (mitades hacia arriba)
- Redondeo bancario: 10.555 → 10.56, 10.545 → 10.54
APLICAR REDONDEO
- Por articulo: redondea precio de cada linea
- Por linea: redondea despues de multiplicar por cantidad
- Por total: redondea solo el total final
PRECISION DECIMAL
- EUR: 2 decimales (29.99)
- JPY: 0 decimales (2999)
- BHD: 3 decimales (29.990)
- Se configura por moneda en Localizacion → Monedas
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.