diff --git a/classes/lab/Formulario.php b/classes/lab/Formulario.php
index 6b76de8..6c74366 100644
--- a/classes/lab/Formulario.php
+++ b/classes/lab/Formulario.php
@@ -55,6 +55,7 @@ class Formulario {
'esquema' => $datos['esquema'] ?? '[]',
'permite_firma' => !empty($datos['permite_firma']) ? 1 : 0,
'requiere_firma' => !empty($datos['requiere_firma']) ? 1 : 0,
+ 'firma_modos' => $datos['firma_modos'] ?? 'canvas,foto',
'doc_encabezado' => $datos['doc_encabezado'] ?? null,
'doc_subtitulo' => $datos['doc_subtitulo'] ?? null,
'doc_logo_base64' => $datos['doc_logo_base64'] ?? null,
@@ -69,7 +70,7 @@ class Formulario {
public function actualizar(int $id, array $datos, int $adminId): bool {
$permitidos = [
'nombre','descripcion','categoria','esquema',
- 'permite_firma','requiere_firma','is_active',
+ 'permite_firma','requiere_firma','firma_modos','is_active',
'doc_encabezado','doc_subtitulo','doc_logo_base64','doc_color','doc_pie_pagina',
];
$campos = array_intersect_key($datos, array_flip($permitidos));
diff --git a/fix_form_modos.php b/fix_form_modos.php
new file mode 100644
index 0000000..9321547
--- /dev/null
+++ b/fix_form_modos.php
@@ -0,0 +1,134 @@
+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 firma_modos 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: " . htmlspecialchars($modosStr) . '';
+}
+
+// ── 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);
+?>
+
+
+
| # | Nombre | firma_modos (DB col) | modos en esquema JSON | Corregir |
|---|---|---|---|---|
| = $f['id'] ?> | += htmlspecialchars($f['nombre']) ?> | +
+ = htmlspecialchars($modsCol) ?>
+
+ 📷 foto ACTIVA
+
+ ✅ foto off
+
+ |
+
+
+ = htmlspecialchars(implode(', ', $modsJson)) ?>
+
+ sin campo firma en esquema
+
+ |
++ + | +