Cleanup: backups antigos removidos + dashboard config + HANDOFF/log

- Remove database-novo/backups/2026-03-27 e 2026-03-29 (deveriam estar
  no gitignore, mas haviam sido tracked antes)
- Atualiza db.config.json + generate-dashboard.cjs + dashboard.html
- HANDOFF.md atualizado com estado de 05-05 (sprint blueprint tabular +
  arquivamento de pacientes)
- Obsidian/Brain/log.md: entrada da sessao 05-05 adicionada

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-06 09:15:22 -03:00
parent 98f7252dcd
commit 15103eded5
11 changed files with 416 additions and 87153 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+22 -5
View File
@@ -132,7 +132,7 @@
"notification_templates", "notification_channels", "notification_preferences",
"notification_logs", "notification_schedules", "notification_queue",
"notifications", "notice_dismissals", "global_notices", "login_carousel_slides",
"twilio_subaccount_usage"
"twilio_subaccount_usage", "saas_twilio_config"
],
"CRM Conversas (WhatsApp)": [
"conversation_messages", "conversation_threads",
@@ -140,14 +140,30 @@
"conversation_tags", "conversation_thread_tags",
"conversation_optouts", "conversation_optout_keywords",
"conversation_autoreply_settings", "conversation_autoreply_log",
"session_reminder_settings", "session_reminder_logs"
"session_reminder_settings", "session_reminder_logs",
"conversation_assignments",
"conversation_bots", "conversation_bot_sessions",
"conversation_sla_rules", "conversation_sla_breaches",
"whatsapp_connection_incidents"
],
"Segurança / Rate limiting": [
"submission_rate_limits"
"Segurança / Auditoria": [
"submission_rate_limits",
"audit_logs",
"saas_security_config",
"math_challenges",
"patient_invite_attempts",
"public_submission_attempts"
],
"Central SaaS (docs/FAQ)": [
"saas_docs", "saas_doc_votos", "saas_faq", "saas_faq_itens"
],
"Dev / Tracking": [
"dev_auditoria_items", "dev_verificacoes_items", "dev_test_items",
"dev_roadmap_phases", "dev_roadmap_items",
"dev_competitors", "dev_competitor_features",
"dev_comparison_matrix", "dev_comparison_competitor_status",
"dev_generation_log"
],
"Estrutura / Calendário": [
"feriados"
]
@@ -163,8 +179,9 @@
"Documentos": "#0ea5e9",
"Comunicação / Notificações": "#fbbf24",
"CRM Conversas (WhatsApp)": "#25d366",
"Segurança / Rate limiting": "#ef4444",
"Segurança / Auditoria": "#ef4444",
"Central SaaS (docs/FAQ)": "#c084fc",
"Dev / Tracking": "#94a3b8",
"Estrutura / Calendário": "#fb923c"
},
"infrastructure": {
+4 -4
View File
@@ -305,7 +305,7 @@ function buildSB(){
</div>
<div class="sb-h" style="margin-top:8px">Domínios</div>\`;
for(const[d,ts]of Object.entries(D.domains)){
h+=\`<div class="sb-i \${dom===d?'active':''}" onclick="scrollToDomain(\`+JSON.stringify(d)+\`)">
h+=\`<div class="sb-i \${dom===d?'active':''}" onclick="scrollToDomain('\${D.slugs[d]}')">
<div class="sb-dot" style="background:\${gc(d)}"></div>\${escapeHtml(d)}
<span class="sb-c">\${ts.length}</span>
</div>\`;
@@ -349,7 +349,7 @@ function buildMN(){
<div class="dgrid">\`;
for(const[d,ts]of Object.entries(D.domains)){
const fks=ts.reduce((a,t)=>a+(D.tables[t]?.fks?.length||0),0);
h+=\`<div class="dc" style="--c:\${gc(d)}" onclick="scrollToDomain(\`+JSON.stringify(d)+\`)">
h+=\`<div class="dc" style="--c:\${gc(d)}" onclick="scrollToDomain('\${D.slugs[d]}')">
<div class="dc-n">\${escapeHtml(d)}</div>
<div class="dc-m"><span style="color:\${gc(d)}">\${ts.length}</span> tabelas · \${fks} FKs</div>
</div>\`;
@@ -420,7 +420,7 @@ function sel(d){
dom=d;view='overview';q='';document.getElementById('si').value='';
buildSB();buildMN();document.getElementById('mn').scrollTop=0;
}
function scrollToDomain(d){
function scrollToDomain(slug){
// Sempre ir pra overview (com todos os domínios visíveis) antes de scrollar
const needRebuild=view!=='overview'||dom!==null||q;
if(needRebuild){
@@ -429,7 +429,7 @@ function scrollToDomain(d){
buildSB();buildMN();
}
setTimeout(()=>{
const el=document.getElementById('dom-'+(D.slugs[d]||''));
const el=document.getElementById('dom-'+slug);
if(el) el.scrollIntoView({behavior:'smooth',block:'start'});
}, needRebuild?80:0);
}