135 lines
5.4 KiB
PHP
135 lines
5.4 KiB
PHP
<?php
|
|
/**
|
|
* fix_form_modos.php — Migración + corrección de modos de firma
|
|
* 1. Aplica la columna firma_modos si no existe
|
|
* 2. Muestra y permite corregir los modos por formulario
|
|
* ELIMINAR después de usar.
|
|
*/
|
|
require_once 'config/config.php';
|
|
if (!isUserLoggedIn()) { die('No autorizado'); }
|
|
|
|
$db = Database::getInstance();
|
|
$pdo = $db->getConnection();
|
|
|
|
// ── 1. Migración automática ──────────────────────────────────────────────────
|
|
$migMsg = '';
|
|
try {
|
|
$pdo->exec("ALTER TABLE lab_formularios
|
|
ADD COLUMN IF NOT EXISTS firma_modos VARCHAR(50) NOT NULL DEFAULT 'canvas,foto'
|
|
COMMENT 'Modos habilitados: canvas, foto o ambos (CSV)'
|
|
AFTER requiere_firma");
|
|
$migMsg = '✅ Columna <code>firma_modos</code> lista.';
|
|
} catch (PDOException $e) {
|
|
$migMsg = '⚠️ ' . htmlspecialchars($e->getMessage());
|
|
}
|
|
|
|
// ── 2. Guardar corrección manual ─────────────────────────────────────────────
|
|
$saveMsg = '';
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['form_id'])) {
|
|
$fid = (int)$_POST['form_id'];
|
|
$canvas = !empty($_POST['canvas']);
|
|
$foto = !empty($_POST['foto']);
|
|
$modos = [];
|
|
if ($canvas) $modos[] = 'canvas';
|
|
if ($foto) $modos[] = 'foto';
|
|
if (!$modos) $modos = ['canvas']; // al menos canvas
|
|
|
|
$modosStr = implode(',', $modos);
|
|
|
|
// Actualiza columna firma_modos
|
|
$upd = $pdo->prepare('UPDATE lab_formularios SET firma_modos = ? WHERE id = ?');
|
|
$upd->execute([$modosStr, $fid]);
|
|
|
|
// También actualiza el campo tipo:'firma' dentro del esquema si existe
|
|
$row = $pdo->prepare('SELECT esquema FROM lab_formularios WHERE id = ?');
|
|
$row->execute([$fid]);
|
|
$f = $row->fetch(PDO::FETCH_ASSOC);
|
|
if ($f) {
|
|
$esquema = json_decode($f['esquema'], true) ?? [];
|
|
$changed = false;
|
|
$esquema = array_map(function($c) use ($modos, &$changed) {
|
|
if ($c['tipo'] === 'firma') { $c['modos'] = $modos; $changed = true; }
|
|
return $c;
|
|
}, $esquema);
|
|
if ($changed) {
|
|
$upd2 = $pdo->prepare('UPDATE lab_formularios SET esquema = ? WHERE id = ?');
|
|
$upd2->execute([json_encode($esquema, JSON_UNESCAPED_UNICODE), $fid]);
|
|
}
|
|
}
|
|
|
|
$saveMsg = "✅ Formulario #$fid actualizado → modos: <strong>" . htmlspecialchars($modosStr) . '</strong>';
|
|
}
|
|
|
|
// ── 3. Leer formularios ──────────────────────────────────────────────────────
|
|
$stmt = $pdo->query('SELECT id, nombre, esquema, firma_modos FROM lab_formularios WHERE is_active = 1 ORDER BY id');
|
|
$formularios = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="es">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<title>Fix Modos Firma</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
</head>
|
|
<body class="p-4">
|
|
<h4 class="mb-3">🔧 Migración y corrección de modos de firma</h4>
|
|
<div class="alert alert-info"><?= $migMsg ?></div>
|
|
<?php if ($saveMsg): ?><div class="alert alert-success"><?= $saveMsg ?></div><?php endif; ?>
|
|
<div class="table-responsive">
|
|
<table class="table table-bordered table-sm">
|
|
<thead class="table-dark">
|
|
<tr><th>#</th><th>Nombre</th><th>firma_modos (DB col)</th><th>modos en esquema JSON</th><th>Corregir</th></tr>
|
|
</thead>
|
|
<tbody>
|
|
<?php foreach ($formularios as $f): ?>
|
|
<?php
|
|
$esquema = json_decode($f['esquema'], true) ?? [];
|
|
$firmaCampo = null;
|
|
foreach ($esquema as $c) { if ($c['tipo'] === 'firma') { $firmaCampo = $c; break; } }
|
|
$modsCol = $f['firma_modos'] ?? 'canvas,foto';
|
|
$modsArr = array_filter(explode(',', $modsCol));
|
|
$modsJson = $firmaCampo['modos'] ?? null;
|
|
$hayFotoCol = in_array('foto', $modsArr);
|
|
$hayCanvasCol = in_array('canvas', $modsArr);
|
|
?>
|
|
<tr>
|
|
<td><?= $f['id'] ?></td>
|
|
<td><?= htmlspecialchars($f['nombre']) ?></td>
|
|
<td>
|
|
<code><?= htmlspecialchars($modsCol) ?></code>
|
|
<?php if ($hayFotoCol): ?>
|
|
<span class="badge bg-warning text-dark ms-1">📷 foto ACTIVA</span>
|
|
<?php else: ?>
|
|
<span class="badge bg-success ms-1">✅ foto off</span>
|
|
<?php endif; ?>
|
|
</td>
|
|
<td>
|
|
<?php if ($modsJson !== null): ?>
|
|
<code><?= htmlspecialchars(implode(', ', $modsJson)) ?></code>
|
|
<?php else: ?>
|
|
<span class="text-muted">sin campo firma en esquema</span>
|
|
<?php endif; ?>
|
|
</td>
|
|
<td>
|
|
<form method="POST" class="d-flex gap-2 align-items-center">
|
|
<input type="hidden" name="form_id" value="<?= $f['id'] ?>">
|
|
<div class="form-check form-check-inline">
|
|
<input class="form-check-input" type="checkbox" name="canvas" id="c<?= $f['id'] ?>" <?= $hayCanvasCol ? 'checked' : '' ?>>
|
|
<label class="form-check-label" for="c<?= $f['id'] ?>">✍️ Dibujar</label>
|
|
</div>
|
|
<div class="form-check form-check-inline">
|
|
<input class="form-check-input" type="checkbox" name="foto" id="f<?= $f['id'] ?>" <?= $hayFotoCol ? 'checked' : '' ?>>
|
|
<label class="form-check-label" for="f<?= $f['id'] ?>">📷 Foto</label>
|
|
</div>
|
|
<button type="submit" class="btn btn-sm btn-primary">Guardar</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
<?php endforeach; ?>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="alert alert-warning mt-3">⚠️ Elimina este archivo del servidor después de usarlo.</div>
|
|
</body>
|
|
</html>
|