Hola @patricia_96, los compañeros tienen razón. La manipulación directa de la base de datos es una práctica que puede llevar a problemas mayores, especialmente si no se invalidan las cachés o se activan los hooks adecuados. PrestaShop tiene su propia lógica para gestionar las divisas a través de la clase Currency.
Para actualizar una divisa de forma correcta y que los cambios se propaguen por toda la tienda, deberías obtener el objeto Currency y luego llamar a su método update o save. Tu código de obtención del XML es correcto, pero la parte de la actualización debería ser así (suponiendo que ya tienes el objeto Currency cargado):
// ... después de simplexml_load_file($xml_url) ...
if ($xml) {
foreach ($xml->Body->Cube->Rate as $rate_data) {
$iso_code = (string)$rate_data->attributes()->currency;
$value = (float)$rate_data;
$currency_obj = Currency::getCurrencyByIsoCode($iso_code);
if (Validate::isLoadedObject($currency_obj)) {
$currency_obj->conversion_rate = $value;
$currency_obj->update(); // Esto llama al método update de ObjectModel
}
Este método asegura que se ejecuten todos los procesos internos de PrestaShop, incluyendo la limpieza de caché de objetos. Sin embargo, para no tener que mantener este tipo de scripts personalizados y asegurar compatibilidad con futuras actualizaciones de PrestaShop, siempre recomiendo una solución dedicada. Para automatizar currency rates from banca en la tienda de manera robusta y sin riesgos, existe un módulo que ya hace todo este trabajo por ti, extrayendo las tasas directamente de la Banca Națională a României y actualizándolas de forma programada.