Files
tangente-bloques-en-transicion/bloques-actuaciones-import/templates/admin/import-page.php
Jose Ibáñez 26d7f11378 Plugins bloques
2026-02-13 13:13:06 +01:00

173 lines
10 KiB
PHP

<?php
if (!defined('ABSPATH')) {
exit;
}
$step = $step ?? 'upload';
$message = $message ?? '';
$message_type = $message_type ?? '';
$import_errors = $import_errors ?? [];
$analysis = $analysis ?? null;
?>
<div class="wrap">
<h1><?php esc_html_e('Importar Actuaciones desde CSV', 'bloques-actuaciones-import'); ?></h1>
<?php if ($message) : ?>
<div class="notice notice-<?php echo esc_attr($message_type === 'success' ? 'success' : 'error'); ?> is-dismissible">
<p><?php echo esc_html($message); ?></p>
</div>
<?php endif; ?>
<?php if (!empty($import_errors)) : ?>
<div class="notice notice-warning">
<p><strong><?php esc_html_e('Detalle:', 'bloques-actuaciones-import'); ?></strong></p>
<ul style="margin-left:1.5em;list-style:disc;">
<?php foreach (array_slice($import_errors, 0, 30) as $err) : ?>
<li><?php echo esc_html($err); ?></li>
<?php endforeach; ?>
</ul>
<?php if (count($import_errors) > 30) : ?>
<p><?php echo esc_html(sprintf(__('… y %d más.', 'bloques-actuaciones-import'), count($import_errors) - 30)); ?></p>
<?php endif; ?>
</div>
<?php endif; ?>
<?php /* ═══════════════════════════════════════════
* PASO 1 — Subir CSV
* ═══════════════════════════════════════════ */ ?>
<?php if ($step === 'upload' || $step === 'done') : ?>
<div class="card" style="max-width:660px;padding:20px;">
<h2 style="margin-top:0;"><?php esc_html_e('1. Subir archivo CSV', 'bloques-actuaciones-import'); ?></h2>
<p><?php esc_html_e('CSV con delimitador punto y coma (;). Columnas: Título/Nombre, Descripción, Lat/Long, Iniciativa, Línea de trabajo.', 'bloques-actuaciones-import'); ?></p>
<p><?php esc_html_e('La importación es idempotente: si la actuación ya existe (mismo título), se actualiza.', 'bloques-actuaciones-import'); ?></p>
<form method="post" enctype="multipart/form-data">
<?php wp_nonce_field('bloques_import_actuaciones', 'bloques_import_nonce'); ?>
<input type="hidden" name="bloques_import_step" value="analyze">
<p>
<label for="csv_file"><strong><?php esc_html_e('Archivo CSV', 'bloques-actuaciones-import'); ?></strong></label><br>
<input type="file" name="csv_file" id="csv_file" accept=".csv,.txt" required>
</p>
<p>
<label>
<input type="checkbox" name="reverse_geocode" value="1" checked>
<?php esc_html_e('Obtener dirección desde coordenadas (Nominatim/OpenStreetMap, ~1 petición/s).', 'bloques-actuaciones-import'); ?>
</label>
</p>
<p>
<button type="submit" class="button button-primary"><?php esc_html_e('Analizar CSV', 'bloques-actuaciones-import'); ?></button>
</p>
</form>
</div>
<?php endif; ?>
<?php /* ═══════════════════════════════════════════
* PASO 2 — Mapeo de categorías
* ═══════════════════════════════════════════ */ ?>
<?php if ($step === 'mapping' && $analysis) :
$unmatched_ini = $analysis['unmatched_iniciativas'];
$unmatched_lin = $analysis['unmatched_lineas'];
$existing_ini = $analysis['existing_iniciativas'];
$existing_lin = $analysis['existing_lineas'];
$default_map = $analysis['default_map'];
$has_unmatched = !empty($unmatched_ini) || !empty($unmatched_lin);
?>
<div class="card" style="max-width:780px;padding:20px;">
<h2 style="margin-top:0;">
<?php esc_html_e('2. Revisar mapeo de categorías', 'bloques-actuaciones-import'); ?>
</h2>
<p>
<?php echo esc_html(sprintf(
__('Se han encontrado %d filas en el CSV.', 'bloques-actuaciones-import'),
$analysis['total_rows']
)); ?>
</p>
<form method="post">
<?php wp_nonce_field('bloques_import_actuaciones', 'bloques_import_nonce'); ?>
<input type="hidden" name="bloques_import_step" value="import">
<input type="hidden" name="csv_path" value="<?php echo esc_attr($analysis['csv_path']); ?>">
<input type="hidden" name="reverse_geocode" value="<?php echo !empty($_POST['reverse_geocode']) ? '1' : '0'; ?>">
<?php if (!$has_unmatched) : ?>
<div class="notice notice-success inline" style="margin:12px 0;">
<p><?php esc_html_e('Todas las categorías del CSV coinciden con términos existentes en WordPress. Puedes importar directamente.', 'bloques-actuaciones-import'); ?></p>
</div>
<?php endif; ?>
<?php /* ── Iniciativas ── */ ?>
<?php if (!empty($unmatched_ini)) : ?>
<h3><?php esc_html_e('Iniciativas', 'bloques-actuaciones-import'); ?></h3>
<p class="description"><?php esc_html_e('Estos valores de la columna "Iniciativa" no coinciden exactamente con ningún término existente. Elige a qué iniciativa asignarlos o crea uno nuevo.', 'bloques-actuaciones-import'); ?></p>
<table class="widefat striped" style="max-width:720px;">
<thead>
<tr>
<th><?php esc_html_e('Valor en CSV', 'bloques-actuaciones-import'); ?></th>
<th><?php esc_html_e('Asignar a…', 'bloques-actuaciones-import'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($unmatched_ini as $csv_val => $suggested_slug) : ?>
<tr>
<td><strong><?php echo esc_html($csv_val); ?></strong></td>
<td>
<select name="ini_map[<?php echo esc_attr($csv_val); ?>]" style="width:100%;">
<option value="__new__"><?php echo esc_html(sprintf(__('Crear nueva: "%s"', 'bloques-actuaciones-import'), $csv_val)); ?></option>
<?php foreach ($existing_ini as $slug => $name) : ?>
<option value="<?php echo esc_attr($slug); ?>"<?php selected($suggested_slug, $slug); ?>>
<?php echo esc_html($name); ?>
</option>
<?php endforeach; ?>
</select>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<?php /* ── Líneas de trabajo ── */ ?>
<?php if (!empty($unmatched_lin)) : ?>
<h3 style="margin-top:24px;"><?php esc_html_e('Líneas de trabajo', 'bloques-actuaciones-import'); ?></h3>
<p class="description"><?php esc_html_e('Estos valores de "Línea de trabajo" no coinciden con ningún término existente.', 'bloques-actuaciones-import'); ?></p>
<table class="widefat striped" style="max-width:720px;">
<thead>
<tr>
<th><?php esc_html_e('Valor en CSV', 'bloques-actuaciones-import'); ?></th>
<th><?php esc_html_e('Asignar a…', 'bloques-actuaciones-import'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($unmatched_lin as $csv_val => $suggested_slug) : ?>
<tr>
<td><strong><?php echo esc_html($csv_val); ?></strong></td>
<td>
<select name="linea_map[<?php echo esc_attr($csv_val); ?>]" style="width:100%;">
<option value="__new__"><?php echo esc_html(sprintf(__('Crear nueva: "%s"', 'bloques-actuaciones-import'), $csv_val)); ?></option>
<?php foreach ($existing_lin as $slug => $name) : ?>
<option value="<?php echo esc_attr($slug); ?>"<?php selected($suggested_slug, $slug); ?>>
<?php echo esc_html($name); ?>
</option>
<?php endforeach; ?>
</select>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php endif; ?>
<p style="margin-top:20px;">
<button type="submit" class="button button-primary button-hero">
<?php esc_html_e('Confirmar e importar', 'bloques-actuaciones-import'); ?>
</button>
<a href="<?php echo esc_url(admin_url('admin.php?page=bloques-import-actuaciones')); ?>" class="button" style="margin-left:8px;">
<?php esc_html_e('Cancelar', 'bloques-actuaciones-import'); ?>
</a>
</p>
</form>
</div>
<?php endif; ?>
</div>