From 79bcc5e4bf02985b6bf520e9e0b7f6e6cae708ea Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:46:54 -0500 Subject: [PATCH] up --- classes/lab/Formulario.php | 3 +- fix_form_modos.php | 134 ++++++++++++++++++ lab_formulario_builder.php | 9 +- .../20260305_lab_formularios_firma_modos.sql | 8 ++ 4 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 fix_form_modos.php create mode 100644 migrations/20260305_lab_formularios_firma_modos.sql 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); +?> + + + + +Fix Modos Firma + + + +

🔧 Migración y corrección de modos de firma

+
+
+
+ + + + + + + + + + + + + + + + +
#Nombrefirma_modos (DB col)modos en esquema JSONCorregir
+ + + 📷 foto ACTIVA + + ✅ foto off + + + + + + sin campo firma en esquema + + +
+ +
+ > + +
+
+ > + +
+ +
+
+
+
⚠️ Elimina este archivo del servidor después de usarlo.
+ + diff --git a/lab_formulario_builder.php b/lab_formulario_builder.php index 43624f4..5de8c0c 100644 --- a/lab_formulario_builder.php +++ b/lab_formulario_builder.php @@ -937,8 +937,12 @@ async function cargarFormulario(id) { $('tb-firma').checked = !!f.permite_firma; $('tb-firma-req').checked = !!f.requiere_firma; _campos = f.esquema_decoded || []; + // Leer modos: primero columna dedicada, luego campo tipo:'firma' en esquema, nunca defaultear a foto const _firmaCampo = _campos.find(c => c.tipo === 'firma'); - const _fModos = _firmaCampo?.modos || ['canvas','foto']; + const _fModosStr = f.firma_modos || ''; // columna DB: 'canvas', 'foto', 'canvas,foto' o '' + const _fModos = _fModosStr + ? _fModosStr.split(',').map(m => m.trim()).filter(Boolean) + : (_firmaCampo?.modos ?? ['canvas','foto']); $('tb-firma-canvas').checked = _fModos.includes('canvas'); $('tb-firma-foto').checked = _fModos.includes('foto'); @@ -984,7 +988,7 @@ async function guardar() { const usarGlobal = $('tb-usar-global').checked; // Sincronizar modos ANTES de serializar el esquema const _modos = []; if($('tb-firma-canvas').checked)_modos.push('canvas'); if($('tb-firma-foto').checked)_modos.push('foto'); - _campos = _campos.map(c => c.tipo === 'firma' ? { ...c, modos: _modos.length ? _modos : ['canvas','foto'] } : c); + _campos = _campos.map(c => c.tipo === 'firma' ? { ...c, modos: _modos.length ? _modos : ['canvas'] } : c); const datos = { nombre, descripcion: $('tb-descripcion').value.trim() || null, @@ -992,6 +996,7 @@ async function guardar() { esquema: JSON.stringify(_campos), permite_firma: $('tb-firma').checked ? 1 : 0, requiere_firma: $('tb-firma-req').checked ? 1 : 0, + firma_modos: _modos.length ? _modos.join(',') : 'canvas', doc_encabezado: usarGlobal ? null : ($('tb-doc-encabezado').value.trim() || null), doc_subtitulo: usarGlobal ? null : ($('tb-doc-subtitulo').value.trim() || null), doc_color: usarGlobal ? null : ($('tb-doc-color').value || null), diff --git a/migrations/20260305_lab_formularios_firma_modos.sql b/migrations/20260305_lab_formularios_firma_modos.sql new file mode 100644 index 0000000..3e1a5d7 --- /dev/null +++ b/migrations/20260305_lab_formularios_firma_modos.sql @@ -0,0 +1,8 @@ +-- Agrega columna firma_modos a lab_formularios +-- Almacena qué modos de captura están activos: 'canvas', 'foto', o ambos separados por coma. +-- Valor por defecto: 'canvas,foto' (compatibilidad con registros anteriores) + +ALTER TABLE lab_formularios + ADD COLUMN IF NOT EXISTS firma_modos VARCHAR(50) NOT NULL DEFAULT 'canvas,foto' + COMMENT 'Modos de firma habilitados: canvas, foto o ambos (CSV)' + AFTER requiere_firma;