This commit is contained in:
Lizandro Guarnizo
2026-04-21 21:36:24 -05:00
parent 3a19f08bf8
commit 4b8b668774
7 changed files with 541 additions and 223 deletions
+47 -34
View File
@@ -120,16 +120,19 @@ $adminNombre = $_SESSION['admin_user']['full_name'] ?? $_SESSION['admin_user']['
/* ── Consentimientos ── */
.consent-row {
display: flex; align-items: center; gap: .6rem;
padding: .5rem .65rem; border-radius: 8px; margin-bottom: .35rem;
font-size: .85rem;
padding: .55rem .7rem; border-radius: 10px; margin-bottom: .4rem;
font-size: .84rem; border: 1px solid transparent;
}
.consent-row.firmado { background: #f0fdf4; color: #166534; }
.consent-row.rechazado { background: #f1f5f9; color: #475569; }
.consent-row.enviado { background: #eff6ff; color: #1e40af; }
.consent-row.pendiente { background: #fffbeb; color: #92400e; }
.consent-row.visto { background: #faf5ff; color: #6b21a8; }
.consent-row .nom-form { flex: 1; }
.consent-row .acciones-consent { display: flex; gap: .4rem; }
.consent-row.firmado { background: #f0fdf4; color: #166534; border-color: #bbf7d0; }
.consent-row.rechazado { background: #f8fafc; color: #64748b; border-color: #e2e8f0; }
.consent-row.enviado { background: #eff6ff; color: #1e40af; border-color: #bfdbfe; }
.consent-row.pendiente { background: #fffbeb; color: #92400e; border-color: #fde68a; }
.consent-row.visto { background: #faf5ff; color: #6b21a8; border-color: #ddd6fe; }
.consent-row .nom-form { flex: 1; font-weight: 500; }
.consent-row .c-badge { font-size: .68rem; padding: 1px 8px; border-radius: 99px;
border: 1px solid currentColor; font-weight: 700; opacity: .85; }
.consent-row .acciones-consent { display: flex; gap: .3rem; flex-shrink: 0; }
.consent-row .acciones-consent .btn { font-size: .72rem; padding: 2px 9px; border-radius: 7px; }
/* ── Barra de acciones ── */
.ficha-acciones {
@@ -518,6 +521,14 @@ async function cargarFichaSolicitud(turnoId) {
}
// ── Consentimientos ───────────────────────────────────────────
const CONSENT_IC = {
firmado:'fa-check-circle', rechazado:'fa-ban',
enviado:'fa-envelope', visto:'fa-eye', pendiente:'fa-clock',
};
const CONSENT_LBL = {
firmado:'Firmado', rechazado:'Rechazado', enviado:'Enviado', visto:'Visto', pendiente:'Pendiente',
};
function renderConsentimientos(lista) {
tieneConsent = lista.length > 0;
hayPendientes = lista.some(c => !['firmado', 'rechazado'].includes(c.estado));
@@ -541,35 +552,37 @@ function renderConsentimientos(lista) {
btnIni.disabled = hayPendientes;
listEl.innerHTML = lista.map(c => {
const cls = c.estado;
const ico = c.estado === 'firmado' ? 'fa-check-circle'
: c.estado === 'rechazado' ? 'fa-ban'
: c.estado === 'enviado' ? 'fa-envelope'
: c.estado === 'visto' ? 'fa-eye'
: 'fa-clock';
const label = c.estado === 'firmado' ? 'Firmado'
: c.estado === 'rechazado' ? 'Rechazado'
: c.estado === 'enviado' ? 'Enviado'
: c.estado === 'visto' ? 'Visto'
: 'Pendiente';
const ya = ['firmado','rechazado'].includes(c.estado);
const ico = CONSENT_IC[c.estado] || 'fa-clock';
const label = CONSENT_LBL[c.estado] || c.estado;
const token = escHtml(c.token || '');
const nomJs = JSON.stringify(c.formulario_nombre || 'Consentimiento');
const idJs = parseInt(c.id) || 0;
const tId = parseInt(c.turno_id) || (turnoActivo?.id) || 0;
const botonesAccion = !['firmado','rechazado'].includes(c.estado) ? `
<div class="acciones-consent">
<button class="btn btn-outline-secondary btn-sm py-0" title="Reenviar WhatsApp"
onclick="reenviarConsentimiento(${c.turno_id})">
<i class="fas fa-paper-plane" style="font-size:.75rem"></i>
</button>
<button class="btn btn-outline-primary btn-sm py-0" title="Firmar presencialmente"
onclick="abrirFirmaPresencial('${c.token}', ${c.id}, ${JSON.stringify(c.formulario_nombre).replace(/"/g,'&quot;')})">
<i class="fas fa-signature" style="font-size:.75rem"></i> Firmar aquí
</button>
</div>` : '';
// Firmar aquí: solo si no completado y hay token
const btnFirmar = (!ya && c.token)
? `<button class="btn btn-outline-primary" title="Firmar aquí"
onclick="abrirFirmaPresencial('${token}', ${idJs}, ${nomJs.replace(/"/g,'&quot;')})">
<i class="fas fa-signature"></i> Firmar
</button>` : '';
return `<div class="consent-row ${cls}" data-consent-id="${c.id}">
// WA / Ver: según estado
const btnWa = ya
? (c.token ? `<button class="btn btn-outline-secondary" title="Ver firmado"
onclick="window.open(BASE_WA+'ver_formulario_enviado.php?token='+encodeURIComponent('${token}'),'_blank')">
<i class="fas fa-eye"></i> Ver
</button>` : '')
: `<button class="btn btn-outline-success" title="Reenviar por WhatsApp"
onclick="reenviarConsentimiento(${tId})">
<i class="fab fa-whatsapp"></i> WA
</button>`;
return `<div class="consent-row ${c.estado}" data-consent-id="${c.id}">
<i class="fas ${ico}"></i>
<span class="nom-form">${escHtml(c.formulario_nombre || 'Consentimiento')}</span>
<span class="badge">${escHtml(label)}</span>
${botonesAccion}
<span class="c-badge">${label}</span>
<div class="acciones-consent">${btnFirmar}${btnWa}</div>
</div>`;
}).join('');
}