{"id":6294,"date":"2026-04-06T16:56:15","date_gmt":"2026-04-06T16:56:15","guid":{"rendered":"https:\/\/www.redccu.gob.pe\/?page_id=6294"},"modified":"2026-04-06T19:36:01","modified_gmt":"2026-04-06T19:36:01","slug":"sistema","status":"publish","type":"page","link":"https:\/\/www.redccu.gob.pe\/index.php\/sistema\/","title":{"rendered":"Control de Resoluciones sistema"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Control de Resoluciones &#8211; RSCLU<\/title>\n  <style>\n    * { box-sizing: border-box; margin: 0; padding: 0; }\n    body {\n      font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n      background: #f1f5f9; padding: 20px; min-height: 100vh;\n      display: flex; align-items: center; justify-content: center;\n    }\n    .login-overlay {\n      position: fixed; top: 0; left: 0; width: 100%; height: 100%;\n      background: #0f2c3bcc; backdrop-filter: blur(6px);\n      display: flex; align-items: center; justify-content: center; z-index: 1000;\n    }\n    .login-card {\n      background: white; border-radius: 28px; padding: 2rem 1.8rem;\n      width: 340px; box-shadow: 0 25px 45px rgba(0,0,0,0.2);\n      text-align: center; border: 1px solid #cbd5e1;\n    }\n    .login-card h2 { color: #1F4E79; margin-bottom: 0.5rem; font-weight: 600; }\n    .login-card p  { font-size: 0.8rem; color: #475569; margin-bottom: 1.5rem; }\n    .login-input {\n      width: 100%; padding: 0.7rem 1rem; margin-bottom: 0.8rem;\n      border: 1px solid #cbd5e1; border-radius: 40px;\n      font-size: 0.9rem; background: #f8fafc;\n    }\n    .login-btn {\n      background: #1F4E79; color: white; border: none; width: 100%;\n      padding: 0.7rem; border-radius: 40px; font-weight: 600;\n      font-size: 1rem; cursor: pointer; transition: 0.2s;\n    }\n    .login-btn:hover { background: #163a5a; }\n    .error-msg { color: #e11d48; font-size: 0.75rem; margin-top: 0.8rem; }\n\n    .app-content { display: none; width: 100%; }\n    .wrap { max-width: 1400px; margin: 0 auto; }\n    .header {\n      background: #1F4E79; color: #fff; border-radius: 12px;\n      padding: 1rem 1.25rem; margin-bottom: 1rem;\n      display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;\n    }\n    .header h1 { font-size: 1.5rem; margin-bottom: 0.2rem; }\n    .header p  { font-size: 0.85rem; opacity: 0.8; }\n    .header-right { display: flex; gap: 0.75rem; align-items: center; }\n    .sync-indicator { font-size: 0.72rem; color: rgba(255,255,255,0.8); display: flex; align-items: center; gap: 0.4rem; }\n    .sync-dot { width: 8px; height: 8px; border-radius: 50%; background: #10b981; display: inline-block; transition: background 0.3s; }\n    .sync-dot.syncing { background: #f59e0b; animation: pulse 0.9s infinite; }\n    .sync-dot.error   { background: #ef4444; }\n    @keyframes pulse { 0%,100%{opacity:1} 50%{opacity:0.3} }\n    .logout-btn {\n      background: rgba(255,255,255,0.2); border: none; color: white;\n      padding: 0.4rem 1rem; border-radius: 40px; font-weight: 500;\n      cursor: pointer; font-size: 0.8rem; transition: 0.2s;\n    }\n    .logout-btn:hover { background: rgba(255,255,255,0.35); }\n\n    .card {\n      background: white; border: 1px solid #e2e8f0; border-radius: 12px;\n      padding: 1rem 1.25rem; margin-bottom: 1rem;\n      box-shadow: 0 1px 2px rgba(0,0,0,0.05);\n    }\n    .card-title {\n      font-size: 0.9rem; font-weight: 600; color: #475569;\n      margin-bottom: 1rem; text-transform: uppercase; letter-spacing: 0.5px;\n    }\n    .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }\n    .form-group { display: flex; flex-direction: column; gap: 0.25rem; }\n    .form-group.full { grid-column: 1 \/ -1; }\n    label { font-size: 0.8rem; font-weight: 500; color: #475569; }\n    select, input, textarea {\n      width: 100%; padding: 0.5rem 0.75rem; font-size: 0.85rem;\n      border: 1px solid #cbd5e1; border-radius: 8px;\n      background: #f8fafc; font-family: inherit;\n    }\n    select:focus, input:focus, textarea:focus { outline: none; border-color: #1F4E79; }\n    .num-display {\n      background: #f8fafc; border: 1px solid #cbd5e1; border-radius: 8px;\n      padding: 0.5rem 0.75rem; font-size: 1.1rem; font-weight: 500;\n      color: #1F4E79; display: flex; align-items: center; gap: 0.5rem;\n    }\n    .num-display span { font-size: 0.7rem; color: #64748b; font-weight: normal; }\n    .btn {\n      padding: 0.5rem 1rem; font-size: 0.8rem; font-weight: 500;\n      border-radius: 8px; cursor: pointer; border: none; transition: 0.15s;\n    }\n    .btn-primary { background: #1F4E79; color: white; }\n    .btn-primary:hover { background: #163a5a; }\n    .btn-secondary { background: #f1f5f9; color: #1e293b; border: 1px solid #cbd5e1; }\n    .btn-secondary:hover { background: #e2e8f0; }\n    .btn:disabled { opacity: 0.5; cursor: not-allowed; }\n    .btn-row { display: flex; gap: 0.5rem; justify-content: flex-end; margin-top: 1rem; }\n\n    .toast {\n      position: fixed; bottom: 20px; right: 20px; background: #10b981;\n      color: white; padding: 0.6rem 1rem; border-radius: 8px; font-size: 0.8rem;\n      display: none; z-index: 999; box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n    }\n    .toast.error { background: #ef4444; }\n\n    table { width: 100%; border-collapse: collapse; font-size: 0.8rem; }\n    th { background: #1F4E79; color: white; padding: 0.6rem 0.75rem; text-align: left; }\n    td { padding: 0.6rem 0.75rem; border-bottom: 1px solid #e2e8f0; }\n    tr:hover td { background: #f8fafc; }\n    .badge { display: inline-block; padding: 0.2rem 0.5rem; border-radius: 20px; font-size: 0.7rem; font-weight: 500; }\n    .badge-num  { background: #dbeafe; color: #1e40af; font-weight: bold; }\n    .badge-tipo { background: #e2e3e5; color: #2c3e50; }\n    .stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75rem; margin-bottom: 1rem; }\n    .stat { background: white; border-radius: 8px; padding: 0.75rem; text-align: center; box-shadow: 0 1px 2px rgba(0,0,0,0.05); }\n    .stat-n { font-size: 1.6rem; font-weight: 600; color: #1F4E79; }\n    .stat-l { font-size: 0.7rem; color: #64748b; }\n    .tbl-wrap { overflow-x: auto; }\n\n    \/* WP nonce input *\/\n    .wp-nonce-wrap { background: #fef9ec; border: 1px solid #fbbf24; border-radius: 8px; padding: 0.6rem 1rem; font-size: 0.75rem; color: #92400e; margin-bottom: 0.5rem; }\n    .wp-nonce-wrap input { border-radius: 6px; padding: 0.3rem 0.6rem; font-size: 0.8rem; margin-top: 0.3rem; background: white; }\n\n    \/* Loading spinner en tabla *\/\n    .table-loading { text-align: center; padding: 2rem; color: #64748b; font-size: 0.85rem; }\n    .spinner-sm {\n      display: inline-block; width: 18px; height: 18px;\n      border: 2px solid #e2e8f0; border-top-color: #1F4E79;\n      border-radius: 50%; animation: spin 0.7s linear infinite;\n      vertical-align: middle; margin-right: 0.4rem;\n    }\n    @keyframes spin { to { transform: rotate(360deg); } }\n  <\/style>\n<\/head>\n<body>\n\n<!-- Login -->\n<div id=\"loginPanel\" class=\"login-overlay\">\n  <div class=\"login-card\">\n    <h2>\ud83d\udd10 Acceso restringido<\/h2>\n    <p>Red de Salud Castilla Condesuyos La Uni\u00f3n<\/p>\n\n    <!-- Nonce de WordPress (solo necesario para guardar\/eliminar) -->\n    <div class=\"wp-nonce-wrap\">\n      \ud83d\udd11 Nonce de WordPress (para guardar datos):<br>\n      <input type=\"text\" id=\"wpNonce\" class=\"login-input\" style=\"margin-top:0.4rem; border-radius:6px;\" placeholder=\"Pega aqu\u00ed el nonce de WordPress\">\n      <div style=\"font-size:0.65rem; margin-top:0.3rem; color:#78716c\">Obt\u00e9n el nonce en: <b>\/wp-json\/resoluciones\/v1\/nonce<\/b><\/div>\n    <\/div>\n\n    <input type=\"text\"     id=\"loginUser\" class=\"login-input\" placeholder=\"Usuario\" autocomplete=\"off\">\n    <input type=\"password\" id=\"loginPass\" class=\"login-input\" placeholder=\"Contrase\u00f1a\">\n    <button class=\"login-btn\" onclick=\"validarAcceso()\">Ingresar<\/button>\n    <div id=\"loginError\" class=\"error-msg\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- App -->\n<div id=\"appContent\" class=\"app-content\">\n  <div class=\"wrap\">\n    <div class=\"header\">\n      <div>\n        <h1>\ud83d\udcc4 Control de Resoluciones<\/h1>\n        <p>Red de Salud Castilla Condesuyos La Uni\u00f3n \u2014 Base de datos WordPress<\/p>\n      <\/div>\n      <div class=\"header-right\">\n        <div class=\"sync-indicator\">\n          <span class=\"sync-dot\" id=\"syncDot\"><\/span>\n          <span id=\"syncText\">Conectando&#8230;<\/span>\n        <\/div>\n        <button class=\"logout-btn\" onclick=\"cerrarSesion()\">\ud83d\udeaa Cerrar sesi\u00f3n<\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"stats\">\n      <div class=\"stat\"><div class=\"stat-n\" id=\"s-total\">\u2014<\/div><div class=\"stat-l\">Total resoluciones<\/div><\/div>\n      <div class=\"stat\"><div class=\"stat-n\" id=\"s-next\">\u2014<\/div><div class=\"stat-l\">Pr\u00f3ximo N\u00b0 (tipo actual)<\/div><\/div>\n      <div class=\"stat\"><div class=\"stat-n\" id=\"s-hoy\">\u2014<\/div><div class=\"stat-l\">Registradas hoy<\/div><\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"card-title\">\u2795 Nueva Resoluci\u00f3n<\/div>\n      <div class=\"form-grid\">\n        <div class=\"form-group\">\n          <label>\ud83d\udc64 Cargo<\/label>\n          <select id=\"f-cargo\">\n            <option value=\"\">Seleccionar&#8230;<\/option>\n            <option>Director Ejecutivo<\/option>\n            <option>Administraci\u00f3n<\/option>\n            <option>Responsable de Recursos Humanos<\/option>\n          <\/select>\n        <\/div>\n        <div class=\"form-group\">\n          <label>\ud83d\udcc4 Tipo de Resoluci\u00f3n<\/label>\n          <select id=\"f-tipo\" onchange=\"actualizarSiguienteNumero()\">\n            <option value=\"\">Seleccionar&#8230;<\/option>\n            <option>Resoluci\u00f3n Administrativa<\/option>\n            <option>Resoluci\u00f3n Directoral<\/option>\n          <\/select>\n        <\/div>\n        <div class=\"form-group\">\n          <label>\ud83d\udccc N\u00b0 Correlativo (autom\u00e1tico)<\/label>\n          <div class=\"num-display\" id=\"num-display\">\u2014 <span>selecciona tipo<\/span><\/div>\n        <\/div>\n        <div class=\"form-group\">\n          <label>\ud83d\udcc5 Fecha<\/label>\n          <input type=\"text\" id=\"f-fecha\" readonly>\n        <\/div>\n        <div class=\"form-group full\">\n          <label>\ud83d\udcdd Asunto<\/label>\n          <textarea id=\"f-asunto\" rows=\"3\" placeholder=\"Describe el asunto de la resoluci\u00f3n...\"><\/textarea>\n        <\/div>\n        <div class=\"form-group full\">\n          <label>\ud83d\udcce Archivo adjunto (opcional)<\/label>\n          <input type=\"text\" id=\"f-archivo\" placeholder=\"Nombre o ruta del archivo\">\n        <\/div>\n      <\/div>\n      <div class=\"btn-row\">\n        <button class=\"btn btn-secondary\" onclick=\"limpiarFormulario()\">\ud83d\uddd1\ufe0f Limpiar<\/button>\n        <button class=\"btn btn-primary\" id=\"btnRegistrar\" onclick=\"registrar()\">\u2705 Registrar Resoluci\u00f3n<\/button>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div style=\"display:flex; justify-content:space-between; align-items:center; margin-bottom:1rem\">\n        <div class=\"card-title\" style=\"margin:0\">\ud83d\udccb Resoluciones Registradas<\/div>\n        <div style=\"display:flex; gap:0.5rem\">\n          <button class=\"btn btn-secondary\" style=\"font-size:0.75rem;padding:0.3rem 0.8rem\" onclick=\"cargarDatos()\">\ud83d\udd04 Actualizar<\/button>\n          <button class=\"btn btn-secondary\" style=\"font-size:0.75rem;padding:0.3rem 0.8rem\" onclick=\"exportarCSV()\">\ud83d\udcce Exportar CSV<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"tbl-wrap\">\n        <table>\n          <thead>\n            <tr><th>N\u00b0<\/th><th>Cargo<\/th><th>Tipo<\/th><th>Fecha<\/th><th>Asunto<\/th><th>Archivo<\/th><th><\/th><\/tr>\n          <\/thead>\n          <tbody id=\"tabla-body\">\n            <tr><td colspan=\"7\" class=\"table-loading\"><span class=\"spinner-sm\"><\/span>Cargando datos&#8230;<\/td><\/tr>\n          <\/tbody>\n        <\/table>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div id=\"toast\" class=\"toast\"><\/div>\n\n<script>\n\/\/ ==========================================\n\/\/ CONFIGURACI\u00d3N \u2014 CAMBIA SOLO ESTA URL\n\/\/ ==========================================\nconst WP_API = 'https:\/\/www.redccu.gob.pe\/wp-json\/resoluciones\/v1\/datos';\n\/\/ ==========================================\n\nconst VALID_USER = \"sistema123\";\nconst VALID_PASS  = \"123456\";\n\nlet resoluciones = [];\nlet wpNonce = '';\n\n\/\/ ===== AUTH =====\nfunction validarAcceso() {\n  const user  = document.getElementById('loginUser').value.trim();\n  const pass  = document.getElementById('loginPass').value.trim();\n  const nonce = document.getElementById('wpNonce').value.trim();\n  const err   = document.getElementById('loginError');\n\n  if (user !== VALID_USER || pass !== VALID_PASS) {\n    err.innerText = '\u274c Usuario o contrase\u00f1a incorrectos.'; return;\n  }\n  if (!nonce) {\n    err.innerText = '\u26a0\ufe0f Ingresa el nonce de WordPress para poder guardar datos.'; return;\n  }\n  wpNonce = nonce;\n  sessionStorage.setItem('auth_resoluciones', 'true');\n  sessionStorage.setItem('wp_nonce', nonce);\n  mostrarApp();\n}\n\nfunction mostrarApp() {\n  document.getElementById('loginPanel').style.display = 'none';\n  document.getElementById('appContent').style.display = 'block';\n  document.getElementById('f-fecha').value = fechaHoy();\n  cargarDatos();\n}\n\nfunction cerrarSesion() {\n  sessionStorage.clear();\n  location.reload();\n}\n\nwindow.onload = () => {\n  if (sessionStorage.getItem('auth_resoluciones') === 'true') {\n    wpNonce = sessionStorage.getItem('wp_nonce') || '';\n    mostrarApp();\n  }\n};\n\n\/\/ ===== API WORDPRESS =====\nfunction setSyncState(state, text) {\n  const dot = document.getElementById('syncDot');\n  const txt = document.getElementById('syncText');\n  dot.className = 'sync-dot' + (state === 'syncing' ? ' syncing' : state === 'error' ? ' error' : '');\n  txt.innerText = text;\n}\n\nasync function cargarDatos() {\n  setSyncState('syncing', 'Cargando desde WordPress...');\n  document.getElementById('tabla-body').innerHTML =\n    '<tr><td colspan=\"7\" class=\"table-loading\"><span class=\"spinner-sm\"><\/span>Cargando datos...<\/td><\/tr>';\n  try {\n    const res = await fetch(WP_API, { cache: 'no-store' });\n    if (!res.ok) throw new Error('HTTP ' + res.status);\n    const data = await res.json();\n    resoluciones = Array.isArray(data.resoluciones) ? data.resoluciones : [];\n    setSyncState('ok', 'Datos cargados \u2713');\n    actualizarVista();\n    actualizarSiguienteNumero();\n  } catch(e) {\n    setSyncState('error', 'Error al conectar con WordPress');\n    mostrarMsg('\u274c No se pudo conectar con la API de WordPress. \u00bfAgregaste el c\u00f3digo PHP?', true);\n    document.getElementById('tabla-body').innerHTML =\n      '<tr><td colspan=\"7\" style=\"text-align:center;padding:2rem;color:#ef4444\">Error de conexi\u00f3n con la API<\/td><\/tr>';\n    console.error(e);\n  }\n}\n\nasync function guardarEnWP() {\n  setSyncState('syncing', 'Guardando...');\n  try {\n    const res = await fetch(WP_API, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application\/json',\n        'X-WP-Nonce': wpNonce\n      },\n      body: JSON.stringify({ resoluciones })\n    });\n    if (res.status === 401 || res.status === 403) {\n      throw new Error('No autorizado \u2014 el nonce puede haber expirado');\n    }\n    if (!res.ok) throw new Error('HTTP ' + res.status);\n    setSyncState('ok', 'Guardado en WordPress \u2713');\n    setTimeout(() => setSyncState('ok', 'Conectado'), 2500);\n    return true;\n  } catch(e) {\n    setSyncState('error', 'Error al guardar');\n    mostrarMsg('\u274c ' + e.message, true);\n    console.error(e);\n    return false;\n  }\n}\n\n\/\/ ===== L\u00d3GICA =====\nfunction siguienteNumeroPorTipo(tipo) {\n  if (!tipo) return null;\n  const docs = resoluciones.filter(d => d.tipo === tipo);\n  return docs.length === 0 ? 1 : Math.max(...docs.map(d => d.num)) + 1;\n}\n\nfunction fechaHoy() {\n  const h = new Date();\n  return `${String(h.getDate()).padStart(2,'0')}\/${String(h.getMonth()+1).padStart(2,'0')}\/${h.getFullYear()}`;\n}\n\nfunction actualizarVista() {\n  document.getElementById('s-total').innerText = resoluciones.length;\n  document.getElementById('s-hoy').innerText = resoluciones.filter(d => d.fecha === fechaHoy()).length;\n  const tbody = document.getElementById('tabla-body');\n  if (resoluciones.length === 0) {\n    tbody.innerHTML = '<tr><td colspan=\"7\" style=\"text-align:center;padding:2rem\">No hay resoluciones registradas a\u00fan<\/td><\/tr>';\n    return;\n  }\n  const ordenados = [...resoluciones].sort((a,b) => a.tipo !== b.tipo ? a.tipo.localeCompare(b.tipo) : a.num - b.num);\n  tbody.innerHTML = ordenados.map(d => `\n    <tr>\n      <td><span class=\"badge badge-num\">${String(d.num).padStart(3,'0')}<\/span><\/td>\n      <td>${esc(d.cargo)}<\/td>\n      <td><span class=\"badge badge-tipo\">${esc(d.tipo)}<\/span><\/td>\n      <td>${d.fecha}<\/td>\n      <td style=\"max-width:250px;word-break:break-word\">${esc(d.asunto)}<\/td>\n      <td>${d.archivo ? esc(d.archivo) : '\u2014'}<\/td>\n      <td><button class=\"btn btn-secondary\" style=\"font-size:0.7rem;padding:0.2rem 0.6rem;color:#c00\" onclick=\"eliminar(${d.id})\">\u2715 Eliminar<\/button><\/td>\n    <\/tr>\n  `).join('');\n}\n\nfunction actualizarSiguienteNumero() {\n  const tipo = document.getElementById('f-tipo').value;\n  const div  = document.getElementById('num-display');\n  if (!tipo) {\n    div.innerHTML = '\u2014 <span>selecciona tipo de resoluci\u00f3n<\/span>';\n    document.getElementById('s-next').innerText = '-'; return;\n  }\n  const sig = siguienteNumeroPorTipo(tipo);\n  div.innerHTML = `<b>${String(sig).padStart(3,'0')}<\/b> <span>correlativo para ${tipo}<\/span>`;\n  document.getElementById('s-next').innerText = String(sig).padStart(3,'0');\n}\n\nfunction limpiarFormulario() {\n  ['f-cargo','f-tipo','f-asunto','f-archivo'].forEach(id => document.getElementById(id).value = '');\n  actualizarSiguienteNumero();\n  document.getElementById('f-fecha').value = fechaHoy();\n}\n\nasync function registrar() {\n  const cargo  = document.getElementById('f-cargo').value;\n  const tipo   = document.getElementById('f-tipo').value;\n  const asunto = document.getElementById('f-asunto').value.trim();\n  const archivo= document.getElementById('f-archivo').value.trim();\n  if (!cargo)  { mostrarMsg('\u274c Selecciona un cargo', true); return; }\n  if (!tipo)   { mostrarMsg('\u274c Selecciona el tipo de resoluci\u00f3n', true); return; }\n  if (!asunto) { mostrarMsg('\u274c Escribe el asunto', true); return; }\n\n  const num = siguienteNumeroPorTipo(tipo);\n  const nueva = { id: Date.now() + Math.floor(Math.random()*9999), num, cargo, tipo, fecha: fechaHoy(), asunto, archivo };\n\n  const btn = document.getElementById('btnRegistrar');\n  btn.disabled = true; btn.innerText = '\u23f3 Guardando...';\n\n  resoluciones.push(nueva);\n  const ok = await guardarEnWP();\n  btn.disabled = false; btn.innerText = '\u2705 Registrar Resoluci\u00f3n';\n\n  if (ok) {\n    limpiarFormulario(); actualizarVista(); actualizarSiguienteNumero();\n    mostrarMsg(`\u2705 Resoluci\u00f3n guardada: ${tipo} N\u00b0 ${String(num).padStart(3,'0')}`);\n  } else {\n    resoluciones = resoluciones.filter(d => d.id !== nueva.id);\n  }\n}\n\nasync function eliminar(id) {\n  const doc = resoluciones.find(d => d.id === id);\n  if (!doc) return;\n  if (!confirm(`\u00bfEliminar ${doc.tipo} N\u00b0 ${String(doc.num).padStart(3,'0')}?`)) return;\n  const backup = [...resoluciones];\n  resoluciones = resoluciones.filter(d => d.id !== id);\n  const ok = await guardarEnWP();\n  if (ok) { actualizarVista(); actualizarSiguienteNumero(); mostrarMsg('Resoluci\u00f3n eliminada'); }\n  else { resoluciones = backup; }\n}\n\nfunction exportarCSV() {\n  if (!resoluciones.length) { mostrarMsg('No hay registros', true); return; }\n  const h = ['N\u00b0 Serie','Cargo','Tipo','Fecha','Asunto','Archivo'];\n  const f = resoluciones.map(d => [d.num,d.cargo,d.tipo,d.fecha,d.asunto,d.archivo||'']);\n  const csv = [h,...f].map(r => r.map(c => `\"${String(c).replace(\/\"\/g,'\"\"')}\"`).join(',')).join('\\n');\n  const a = document.createElement('a');\n  a.href = URL.createObjectURL(new Blob(['\\uFEFF'+csv], {type:'text\/csv;charset=utf-8'}));\n  a.download = 'resoluciones.csv'; a.click();\n  mostrarMsg('Exportado');\n}\n\nfunction mostrarMsg(texto, error=false) {\n  const t = document.getElementById('toast');\n  t.textContent = texto;\n  t.className = 'toast' + (error ? ' error' : '');\n  t.style.display = 'block';\n  setTimeout(() => t.style.display = 'none', 3500);\n}\n\nfunction esc(str) {\n  return String(str||'').replace(\/[&<>]\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;'}[m]));\n}\n<\/script>\n<\/body>\n<\/html>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Control de Resoluciones &#8211; RSCLU \ud83d\udd10 Acceso restringido Red de Salud Castilla Condesuyos La Uni\u00f3n \ud83d\udd11 Nonce de WordPress (para guardar datos): Obt\u00e9n el nonce en: \/wp-json\/resoluciones\/v1\/nonce Ingresar \ud83d\udcc4 Control de Resoluciones Red de Salud Castilla Condesuyos La Uni\u00f3n \u2014 Base de datos WordPress Conectando&#8230; \ud83d\udeaa Cerrar sesi\u00f3n \u2014 Total resoluciones \u2014 Pr\u00f3ximo N\u00b0 (tipo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6294","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/pages\/6294"}],"collection":[{"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/comments?post=6294"}],"version-history":[{"count":8,"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/pages\/6294\/revisions"}],"predecessor-version":[{"id":6308,"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/pages\/6294\/revisions\/6308"}],"wp:attachment":[{"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/media?parent=6294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}