⌖
OUV EusébioOUVIDORIA INTELIGENTE

Uma cidade que escuta. Uma gestão que responde.

Gestão de manifestações, transparência e diálogo entre a Ouvidoria e as secretarias do município.

⌖ Eusébio · Ceará | mapa interativo
Imagens ilustrativas, não registros oficiais de ações municipais. Mapa e fotografias requerem internet.
Acesso institucional

Bem-vindo de volta

Entre com suas credenciais para acessar a Ouvidoria Inteligente.

Novos usuários precisam de aprovação do Administrador Master para acessar.
© 2026 · Desenvolvido por Sérgio Torres
`;let win=window.open('','_blank');if(!win){alert('Permita pop-ups para gerar o relatório.');return}win.document.open();win.document.write(html);win.document.close();win.focus();setTimeout(()=>win.print(),400)} function renderIntelligence(){let all=data,from=$('reportFrom')?.value||'',to=$('reportTo')?.value||'';if(from)all=all.filter(x=>x.created>=from);if(to)all=all.filter(x=>x.created<=to);const sections=[['Temas / áreas','theme'],['Serviços / subtemas','subtheme'],['Tipos de manifestação','type'],['Bairros / localidades','neighborhood'],['Secretarias / órgãos (participações)','sector']];renderCharts(all,'reportCharts');$('intelligenceReport').innerHTML=`

${all.length} manifestações no período selecionado

`+sections.map(([name,key])=>`

${name}

${summaryBars(all,key)}
`).join('');} function exportIntelligence(){let from=$('reportFrom').value,to=$('reportTo').value,items=data.filter(x=>(!from||x.created>=from)&&(!to||x.created<=to));let lines=['Dimensão;Item;Quantidade;Percentual'];[['Tema','theme'],['Serviço','subtheme'],['Tipo','type'],['Bairro','neighborhood'],['Órgão participante','sector']].forEach(([title,key])=>countBy(items,key).forEach(([name,n])=>lines.push([title,name,n,items.length?(100*n/items.length).toFixed(1)+'%':'0%'].map(v=>'"'+String(v).replace(/"/g,'""')+'"').join(';'))));download('ouv_eusebio_inteligencia_municipal.csv','\ufeff'+lines.join('\r\n'),'text/csv;charset=utf-8');} function renderRadar(){$('themeStats').innerHTML=summaryBars(data,'theme');$('subthemeStats').innerHTML=summaryBars(data,'subtheme');$('neighborhoodStats').innerHTML=summaryBars(data,'neighborhood');const groups=new Map();data.filter(x=>!isDone(x)).forEach(x=>{let k=(x.theme||'Não informado')+'|'+(x.subtheme||'Não informado')+'|'+(x.neighborhood||'Não informado');groups.set(k,(groups.get(k)||0)+1)});let recurring=[...groups].filter(([k,n])=>n>=3).sort((a,b)=>b[1]-a[1]).slice(0,6);$('recurrenceAlerts').innerHTML=recurring.length?'

Alertas de recorrência (3 ou mais demandas abertas)

'+recurring.map(([k,n])=>`
${n} demandas • ${escapeHTML(k.split('|').join(' / '))}Demandas abertas sobre o mesmo serviço na mesma localidade. Avaliar ação conjunta.
`).join(''):'

Alertas aparecerão quando houver 3 ou mais demandas abertas sobre o mesmo serviço no mesmo bairro.

';} const KEY='aurea_ouvidoria_v1',SK='aurea_settings_v1';let data=load(KEY,[]),settings=load(SK,{org:'Ouvidoria Geral',deadline:15});settings.deadline=15;window.ouvLoadCentralRows=function(rows){if(!Array.isArray(rows))throw Error('Dados inválidos');data=rows;render();};const $=id=>document.getElementById(id);const today=()=>new Date().toLocaleDateString('en-CA');const dateISO=d=>{const x=new Date(d+'T12:00:00');return Number.isNaN(+x)?'':x.toLocaleDateString('pt-BR')};const escapeHTML=s=>String(s??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));function load(k,def){try{return JSON.parse(localStorage.getItem(k))??def}catch{return def}}function ouvAuditActor(){const u=window.ouvGetCurrentUser?.();return u?{user:String(u.name||u.login||'Usuário'),login:String(u.login||''),sector:String(u.sector||''),role:String(u.role||'')}:{user:'Usuário não identificado',login:'',sector:'',role:''}}function ouvAuditEvent(action){return {at:new Date().toLocaleString('pt-BR'),timestamp:new Date().toISOString(),action,...ouvAuditActor()}}function persist(){localStorage.setItem(KEY,JSON.stringify(data));render()}window.ouvAuditEvent=ouvAuditEvent;function addDays(s,n){let d=new Date(s+'T12:00:00');d.setDate(d.getDate()+Number(n||30));return d.toLocaleDateString('en-CA')}function isDone(x){return ['Concluída','Concluído','Arquivada','Arquivado'].includes(x.status)}function ouvDue(x){return x.due||(!isDone(x)&&x.created?addDays(x.created,15):'')}function isLate(x){const d=ouvDue(x);return !isDone(x)&&!!d&&d${escapeHTML(isLate(x)?'Atrasada':x.status)}`}function render(){const t=data.length,done=data.filter(isDone).length,late=data.filter(isLate).length;$('total').textContent=t;$('ongoing').textContent=data.filter(x=>!isDone(x)).length;$('finished').textContent=done;$('overdue').textContent=late;$('completion').textContent=t?Math.round(done/t*100)+'%':'0%';const completed=data.filter(x=>x.closed&&isDone(x));const days=completed.map(x=>Math.max(0,Math.round((new Date(x.closed+'T12:00:00')-new Date(x.created+'T12:00:00'))/86400000)));$('avgdays').textContent=days.length?Math.round(days.reduce((a,b)=>a+b,0)/days.length)+' dias':'0 dias';$('ontime').textContent=completed.length?Math.round(completed.filter(x=>x.closed<=x.due).length/completed.length*100)+'%':'0%';bars('categories','type');renderCharts(data,'liveCharts');renderRadar();renderIntelligence();bars('sectors','sector');const sorted=[...data].sort((a,b)=>b.created.localeCompare(a.created));$('activity').innerHTML=sorted.slice(0,5).map(x=>`
${escapeHTML(x.subject)}${escapeHTML(x.protocol)} • ${dateISO(x.created)} • ${escapeHTML(x.status)}
`).join('')||'
Nenhuma atividade registrada ainda.
';const attention=data.filter(x=>isLate(x)||x.priority==='Crítica').sort((a,b)=>a.due.localeCompare(b.due));$('attention').innerHTML=attention.length?table(attention.slice(0,7)):'
Tudo em ordem. Nenhuma demanda crítica ou vencida.
';renderTable();$('org').value=settings.org;$('deadline').value=settings.deadline}function bars(id,key){let counts={};data.forEach(x=>(key==='sector'?sectorsOf(x):[x[key]||'Não informado']).forEach(k=>counts[k]=(counts[k]||0)+1));let arr=Object.entries(counts).sort((a,b)=>b[1]-a[1]);$(''+id).innerHTML=arr.length?arr.slice(0,8).map(([name,n])=>`
${escapeHTML(name)}
${n}
`).join(''):'
Os indicadores aparecerão após o primeiro cadastro.
'}function table(rows){return `
${rows.map(x=>``).join('')}
ProtocoloManifestaçãoCadastroPrazoFinalizaçãoStatus
${escapeHTML(x.protocol)}${escapeHTML(x.subject)}
${escapeHTML(x.type)} • ${escapeHTML(x.theme||'Sem tema')} • ${escapeHTML(x.subtheme||'')} • ${escapeHTML(x.neighborhood||'')} • ${escapeHTML(sectorsOf(x).join(' • '))}
${dateISO(x.created)}${dateISO(ouvDue(x))}${x.closed?dateISO(x.closed):'—'}${badge(x)}${window.ouvEditActionButton?.(x)||""}${window.ouvTrashActionButton?.(x)||""}
`}function renderTable(){const q=($('search').value||'').toLocaleLowerCase(),s=$('statusfilter').value,t=$('typefilter').value,th=$('themefilter').value,nb=$('neighborhoodfilter').value.toLocaleLowerCase(),sf=$('sectorfilter').value;let rows=[...data].sort((a,b)=>b.created.localeCompare(a.created)).filter(x=>(!s||x.status===s)&&(!t||x.type===t)&&(!th||x.theme===th)&&(!sf||sectorsOf(x).includes(sf))&&(!nb||String(x.neighborhood||'').toLocaleLowerCase().includes(nb))&&[x.protocol,x.subject,x.name,...sectorsOf(x),x.description].some(v=>String(v||'').toLocaleLowerCase().includes(q)));$('records').innerHTML=rows.length?table(rows):'
Nenhuma manifestação encontrada.
'}document.querySelectorAll('.nav[data-tab]:not([data-tab=usuarios])').forEach(b=>b.addEventListener('click',()=>{document.querySelectorAll('.nav').forEach(n=>n.classList.remove('active'));b.classList.add('active');document.querySelectorAll('.section').forEach(s=>s.classList.remove('show'));$(b.dataset.tab).classList.add('show');let names={dashboard:['Visão geral','Controle, transparência e eficiência em cada atendimento.'],manifestacoes:['Manifestações','Gerencie protocolos, prazos e respostas em um só lugar.'],prazos:['Painel gerencial de prazos','Vencimentos, pendências e acompanhamento por secretaria.'],relatorios:['Relatórios e indicadores','Informações para decisões mais inteligentes.'],config:['Configurações','Personalize sua central e proteja seus dados.']};$('pagetitle').textContent=names[b.dataset.tab][0];$('pagesub').textContent=names[b.dataset.tab][1]}));function openForm(id){$('form').reset();setSectors([]);$('editid').value=id||'';$('created').value=today();$('due').value=addDays(today(),settings.deadline);$('formtitle').textContent=id?'Detalhes da manifestação':'Nova manifestação';$('historyblock').classList.toggle('hidden',!id);if(id){let x=data.find(v=>v.id===id);if(!x)return;['name','contact','cpf','email','phone','address','notes','type','theme','subtheme','neighborhood','location','status','priority','created','due','closed','channel','subject','description','resolution'].forEach(k=>$(k).value=x[k]||'');fillSubthemes(x.subtheme||'');setSectors(sectorsOf(x));setSelectWithLegacy('neighborhood',x.neighborhood);$('history').innerHTML=(x.history||[]).slice().reverse().map(h=>`
${escapeHTML(h.action)}${escapeHTML(h.at)} · Usuário: ${escapeHTML(h.user||h.login||'Não registrado (movimentação anterior)')}${h.sector?' · '+escapeHTML(h.sector):''}
`).join('')}else {$('history').innerHTML='';$('theme').value='';fillSubthemes();}$('modalbg').classList.remove('hidden')}function closeForm(){$('modalbg').classList.add('hidden')}$('created').addEventListener('change',()=>{if(!$('editid').value)$('due').value=addDays($('created').value,settings.deadline)});$('description').addEventListener('input',()=>{if($('editid').value)return;let txt=($('subject').value+' '+$('description').value).toLowerCase();if(/ameaça|violência|risco de morte|abuso|agressão|urgente|emergência/.test(txt))$('priority').value='Crítica';else if(/fraude|corrupção|assédio|discriminação/.test(txt))$('priority').value='Alta'});$('form').addEventListener('submit',e=>{e.preventDefault();let id=$('editid').value,old=data.find(x=>x.id===id),v={};['name','contact','cpf','email','phone','address','notes','type','theme','subtheme','neighborhood','location','status','priority','created','due','closed','channel','subject','description','resolution'].forEach(k=>v[k]=$(k).value.trim());v.sectors=selectedSectors();if(!v.sectors.length)return alert('Selecione pelo menos uma secretaria ou órgão responsável.');v.sector=v.sectors[0];if(v.dueURL.revokeObjectURL(url),1000)}function exportCSV(){const cols=['protocol','name','contact','cpf','email','phone','address','notes','type','theme','subtheme','neighborhood','location','subject','description','sector','sectors','status','priority','channel','created','due','closed','resolution'];let rows=[cols.join(';'),...data.map(x=>cols.map(k=>'"'+String(k==='sectors'?sectorsOf(x).join(' | '):(x[k]||'')).replace(/"/g,'""')+'"').join(';'))];download('ouv_eusebio_manifestacoes.csv','\ufeff'+rows.join('\r\n'),'text/csv;charset=utf-8')}function exportJSON(){download('backup_ouv_eusebio_'+today()+'.json',JSON.stringify({version:1,settings,data},null,2),'application/json')}function importJSON(e){let f=e.target.files[0];if(!f)return;let r=new FileReader();r.onload=()=>{try{let o=JSON.parse(r.result);if(!Array.isArray(o.data)||!o.data.every(x=>x.id&&x.protocol&&x.created))throw Error();if(!confirm('Restaurar backup? Isso substituirá os registros atuais.'))return;data=o.data;settings=o.settings||settings;localStorage.setItem(SK,JSON.stringify(settings));persist();alert('Backup restaurado com sucesso.')}catch{alert('Arquivo de backup inválido.')}finally{e.target.value=''}};r.readAsText(f)}function clearAll(){if(prompt('Para apagar TODOS os registros, digite APAGAR:')==='APAGAR'){data=[];persist()}}fillThemes();fillMunicipalLists();$('theme').addEventListener('change',()=>fillSubthemes());$('subject').addEventListener('input',detectTheme);$('description').addEventListener('input',detectTheme);render(); `;let w=window.open('','_blank');if(!w)return alert('Permita janelas pop-up para gerar o PDF.');w.document.write(html);w.document.close();w.focus();setTimeout(()=>w.print(),350)} (function(){let sel=document.getElementById('dlSector');let sectors=typeof MUNICIPAL_SECTORS!=='undefined'?MUNICIPAL_SECTORS:[];if(!sectors.length)sectors=[...new Set(data.flatMap(sectorsOf))].sort();sectors.forEach(s=>{let o=document.createElement('option');o.value=s;o.textContent=s;sel.appendChild(o)});const oldRender=render;render=function(){oldRender();renderDeadlines()};renderDeadlines()})(); `;let win=window.open('','_blank');if(!win){alert('Permita a abertura de pop-ups para visualizar o relatório.');return}win.document.open();win.document.write(html);win.document.close();win.focus();setTimeout(()=>win.print(),600)}; })();
Administração Master

Usuários de acesso

Convites, permissões e redefinição de senhas no Supabase

Convidar novo usuário

Usuários cadastrados

Nome / E-mailPerfilSituaçãoPermissões individuaisAdministração
Carregando...

As permissões adicionais só serão aplicadas aos módulos após integração com as respectivas políticas do banco. Senhas atuais não podem ser consultadas.