Cierto, @miguel_deco50 ha dado en el clavo con los dos puntos. @mariaweb, el problema principal es que Currency::getCurrencyByIsoCode() devuelve un array, no un objeto, por lo que Validate::isLoadedObject($currency) siempre será falso, y el update() nunca se ejecuta.
Además, como bien señala, el mnozstvi del CNB es fundamental. Debes dividir el kurz por mnozstvi para obtener la tasa unitaria correcta. Esto es un error común al trabajar con fuentes de cambio como el CNB.
Aquí tienes el código corregido que debería funcionar para PrestaShop 1.7.6.8:
// En tu controlador de módulo custom (ej. /modules/micurrencyupdater/controllers/admin/AdminCnbUpdateController.php)
class AdminCnbUpdateController extends ModuleAdminController
{
public function updateRatesAction()
{
$url = 'https://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.xml';
$xml = simplexml_load_file($url);
if ($xml) {
foreach ($xml->tabulka->radek as $radek) {
$isoCode = (string)$radek['kod'];
Con estos cambios, deberías ver las tasas de cambio correctas aplicándose. Sin embargo, ten en cuenta que modificar el core o crear controladores personalizados para esto puede ser propenso a errores en futuras actualizaciones de PrestaShop. Para una solución más robusta y sin preocupaciones de mantenimiento, especialmente para entornos de producción, considera usar un módulo especializado. Por ejemplo, existe una [solución para tipos de cambio] que integra esto de forma segura.
Si buscas una solución lista para usar y sin complicaciones, echa un vistazo a solución para tipos de cambio.