From 11e939b68fa339164fe84ad49e4b42038096e7df Mon Sep 17 00:00:00 2001 From: Javier Date: Sun, 30 Aug 2026 02:41:08 +0200 Subject: [PATCH] feat: import rules from JSON via Rule::fromJson + RuleDao::insert --- src/ui/rulesmanagerdialog.cpp | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/ui/rulesmanagerdialog.cpp b/src/ui/rulesmanagerdialog.cpp index 8b050c9..aca4f73 100644 --- a/src/ui/rulesmanagerdialog.cpp +++ b/src/ui/rulesmanagerdialog.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -273,9 +274,32 @@ void RulesManagerDialog::onImportExport(bool import) if (import) { QString file = QFileDialog::getOpenFileName(this, tr("Importar reglas"), QString(), tr("JSON (*.json)")); if (file.isEmpty()) return; - - // TODO: Parse JSON and create rules - QMessageBox::information(this, tr("Importar"), tr("Función de importación en desarrollo.")); + + QFile f(file); + if (!f.open(QIODevice::ReadOnly)) { + QMessageBox::warning(this, tr("Importar"), tr("No se pudo abrir el archivo.")); + return; + } + QJsonParseError err; + QJsonDocument doc = QJsonDocument::fromJson(f.readAll(), &err); + if (err.error != QJsonParseError::NoError || !doc.isArray()) { + QMessageBox::warning(this, tr("Importar"), tr("Archivo JSON inválido.")); + return; + } + QJsonArray arr = doc.array(); + int imported = 0; + int skipped = 0; + for (const QJsonValue &v : arr) { + if (!v.isObject()) { ++skipped; continue; } + Rule rule = Rule::fromJson(v.toObject()); + if (rule.name.isEmpty()) { ++skipped; continue; } + rule.accountId = m_accountId; // scope to the dialog's account (-1 = global) + if (RuleDao::insert(rule)) ++imported; + else ++skipped; + } + QMessageBox::information(this, tr("Importar"), + tr("Se importaron %1 regla(s). %2 omitida(s).").arg(imported).arg(skipped)); + refresh(); } else { QString file = QFileDialog::getSaveFileName(this, tr("Exportar reglas"), "rules.json", tr("JSON (*.json)")); if (file.isEmpty()) return;