{"id":6309,"date":"2026-04-06T20:04:36","date_gmt":"2026-04-06T20:04:36","guid":{"rendered":"https:\/\/www.redccu.gob.pe\/?page_id=6309"},"modified":"2026-04-06T20:15:33","modified_gmt":"2026-04-06T20:15:33","slug":"control-de-resoluciones","status":"publish","type":"page","link":"https:\/\/www.redccu.gob.pe\/index.php\/control-de-resoluciones\/","title":{"rendered":"Control de Resoluciones"},"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.3rem; 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    .login-btn:disabled { opacity: 0.6; cursor: not-allowed; }\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    .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    <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\" id=\"loginBtn\" 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<\/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\" style=\"text-align:center;padding:2rem\"><span class=\"spinner-sm\"><\/span>Cargando&#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  \/\/ == CONFIGURACI\u00d3N ==\n  const WP_API   = 'https:\/\/www.redccu.gob.pe\/wp-json\/resoluciones\/v1\/datos';\n  const WP_NONCE = 'https:\/\/www.redccu.gob.pe\/wp-json\/resoluciones\/v1\/nonce';\n\n  \/\/ == CREDENCIALES DEL SISTEMA ==\n  const VALID_USER = \"sistema123\";\n  const VALID_PASS = \"123456\";\n\n  let resoluciones = [];\n  let wpNonce = '';\n\n  \/\/ ===== LOGIN =====\n  async function validarAcceso() {\n    const user = document.getElementById('loginUser').value.trim();\n    const pass = document.getElementById('loginPass').value.trim();\n    const err  = document.getElementById('loginError');\n    const btn  = document.getElementById('loginBtn');\n\n    if (user !== VALID_USER || pass !== VALID_PASS) {\n      err.innerText = '\u274c Usuario o contrase\u00f1a incorrectos.';\n      return;\n    }\n\n    \/\/ Obtener nonce autom\u00e1ticamente\n    btn.disabled = true;\n    btn.innerText = '\u23f3 Conectando...';\n    err.innerText = '';\n\n    try {\n      const res  = await fetch(WP_NONCE, { cache: 'no-store' });\n      const data = await res.json();\n      wpNonce = data.nonce;\n      sessionStorage.setItem('auth_resoluciones', 'true');\n      sessionStorage.setItem('wp_nonce', wpNonce);\n      mostrarApp();\n    } catch(e) {\n      err.innerText = '\u274c No se pudo conectar con el servidor. Verifica la configuraci\u00f3n.';\n      btn.disabled = false;\n      btn.innerText = 'Ingresar';\n    }\n  }\n\n  function 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\n  function cerrarSesion() {\n    sessionStorage.clear();\n    location.reload();\n  }\n\n  \/\/ Al recargar la p\u00e1gina, restaurar sesi\u00f3n autom\u00e1ticamente\n  window.onload = async () => {\n    if (sessionStorage.getItem('auth_resoluciones') === 'true') {\n      \/\/ Renovar nonce autom\u00e1ticamente al recargar\n      try {\n        const res  = await fetch(WP_NONCE, { cache: 'no-store' });\n        const data = await res.json();\n        wpNonce = data.nonce;\n        sessionStorage.setItem('wp_nonce', wpNonce);\n      } catch(e) {\n        wpNonce = sessionStorage.getItem('wp_nonce') || '';\n      }\n      mostrarApp();\n    }\n  };\n\n  \/\/ Renovar nonce cada 20 minutos para que no expire\n  setInterval(async () => {\n    if (sessionStorage.getItem('auth_resoluciones') === 'true') {\n      try {\n        const res  = await fetch(WP_NONCE, { cache: 'no-store' });\n        const data = await res.json();\n        wpNonce = data.nonce;\n        sessionStorage.setItem('wp_nonce', wpNonce);\n      } catch(e) {}\n    }\n  }, 20 * 60 * 1000);\n\n  \/\/ ===== API WORDPRESS =====\n  function setSyncState(state, text) {\n    document.getElementById('syncDot').className = 'sync-dot' + (state === 'syncing' ? ' syncing' : state === 'error' ? ' error' : '');\n    document.getElementById('syncText').innerText = text;\n  }\n\n  async function cargarDatos() {\n    setSyncState('syncing', 'Cargando datos...');\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', 'Conectado \u2713');\n      actualizarVista();\n      actualizarSiguienteNumero();\n    } catch(e) {\n      setSyncState('error', 'Error de conexi\u00f3n');\n      mostrarMsg('\u274c No se pudo conectar con WordPress', true);\n      document.getElementById('tabla-body').innerHTML =\n        '<tr><td colspan=\"7\" style=\"text-align:center;padding:2rem;color:#ef4444\">Error al cargar datos<\/td><\/tr>';\n    }\n  }\n\n  async function guardarEnWP() {\n    setSyncState('syncing', 'Guardando...');\n    try {\n      const res = await fetch(WP_API, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'X-App-Key': 'rsclu2024seguro' },\n        body: JSON.stringify({ resoluciones })\n      });\n      if (!res.ok) throw new Error('HTTP ' + res.status);\n      setSyncState('ok', 'Guardado \u2713');\n      setTimeout(() => setSyncState('ok', 'Conectado \u2713'), 2000);\n      return true;\n    } catch(e) {\n      setSyncState('error', 'Error al guardar');\n      mostrarMsg('\u274c Error al guardar. Intenta de nuevo.', true);\n      return false;\n    }\n  }\n\n  \/\/ ===== L\u00d3GICA =====\n  function 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\n  function 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\n  function 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\n  function 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\n  function 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\n  async 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 Guardado: ${tipo} N\u00b0 ${String(num).padStart(3,'0')}`);\n    } else {\n      resoluciones = resoluciones.filter(d => d.id !== nueva.id);\n    }\n  }\n\n  async 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\n  function 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\n  function 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\n  function esc(str) {\n    return String(str||'').replace(\/[&<>]\/g, m=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[m]));\n  }\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Control de Resoluciones &#8211; RSCLU \ud83d\udd10 Acceso restringido Red de Salud Castilla Condesuyos La Uni\u00f3n Ingresar \ud83d\udcc4 Control de Resoluciones Red de Salud Castilla Condesuyos La Uni\u00f3n Conectando&#8230; \ud83d\udeaa Cerrar sesi\u00f3n \u2014 Total resoluciones \u2014 Pr\u00f3ximo N\u00b0 (tipo actual) \u2014 Registradas hoy \u2795 Nueva Resoluci\u00f3n \ud83d\udc64 Cargo Seleccionar&#8230;Director EjecutivoAdministraci\u00f3nResponsable de Recursos Humanos \ud83d\udcc4 Tipo de [&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-6309","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/pages\/6309"}],"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=6309"}],"version-history":[{"count":3,"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/pages\/6309\/revisions"}],"predecessor-version":[{"id":6314,"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/pages\/6309\/revisions\/6314"}],"wp:attachment":[{"href":"https:\/\/www.redccu.gob.pe\/index.php\/wp-json\/wp\/v2\/media?parent=6309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}