{"id":139,"date":"2026-08-19T16:54:37","date_gmt":"2026-08-19T16:54:37","guid":{"rendered":"https:\/\/cbsinfoshop.com.br\/?page_id=139"},"modified":"2026-08-19T18:35:55","modified_gmt":"2026-08-19T18:35:55","slug":"crm-italinia-dashboard","status":"publish","type":"page","link":"https:\/\/cbsinfoshop.com.br\/home\/crm-italinia-dashboard\/","title":{"rendered":"CRM ITALINIA DASHBOARD"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"139\" class=\"elementor elementor-139\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3f42efd e-flex e-con-boxed e-con e-parent\" data-id=\"3f42efd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d31e5aa elementor-widget elementor-widget-html\" data-id=\"d31e5aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>CRM Ital\u00ednea \u2022 Gest\u00e3o Comercial<\/title>\n<meta name=\"description\" content=\"CRM comercial para acompanhamento de lojas, agendamentos, previs\u00f5es de venda, libera\u00e7\u00f5es semanais e relat\u00f3rio gerencial.\">\n<style>\n:root{--bg:#f4f6f8;--card:#fff;--text:#17202a;--muted:#6b7280;--line:#e5e7eb;--brand:#111827;--accent:#b91c1c;--accent2:#dc2626;--ok:#15803d;--warn:#b45309;--blue:#1d4ed8;--shadow:0 8px 24px rgba(15,23,42,.07)}\n*{box-sizing:border-box} body{margin:0;background:var(--bg);font-family:Inter,Arial,Helvetica,sans-serif;color:var(--text)}\nbutton,input,select,textarea{font:inherit} button{cursor:pointer}\n.app{display:flex;min-height:100vh}.side{width:245px;background:#111827;color:#fff;padding:22px 14px;position:sticky;top:0;height:100vh}\n.logo{font-weight:800;font-size:20px;padding:8px 12px 25px}.logo span{color:#ef4444}.nav button{display:block;width:100%;border:0;background:transparent;color:#d1d5db;text-align:left;padding:12px 13px;border-radius:10px;margin:4px 0}.nav button:hover,.nav button.active{background:#374151;color:#fff}.nav small{display:block;color:#9ca3af;padding:20px 13px 5px}\n.main{flex:1;padding:24px;min-width:0}.top{display:flex;justify-content:space-between;align-items:center;gap:15px;margin-bottom:20px}.top h1{margin:0;font-size:26px}.top p{margin:5px 0 0;color:var(--muted)}\n.actions{display:flex;gap:8px;flex-wrap:wrap}.btn{border:1px solid var(--line);background:#fff;padding:10px 14px;border-radius:9px;font-weight:600}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.dark{background:#111827;color:#fff;border-color:#111827}.btn.danger{color:#b91c1c}\n.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}.card{background:var(--card);border:1px solid var(--line);border-radius:13px;padding:17px;box-shadow:var(--shadow)}.metric .label{color:var(--muted);font-size:13px}.metric .value{font-size:27px;font-weight:800;margin-top:7px}.metric .sub{font-size:12px;color:var(--muted);margin-top:5px}\n.section{margin-top:18px}.section-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px}.section-head h2{font-size:18px;margin:0}\n.table-wrap{overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px}.table{width:100%;border-collapse:collapse;min-width:780px}.table th,.table td{padding:10px 11px;border-bottom:1px solid var(--line);font-size:13px;text-align:left;vertical-align:middle}.table th{background:#f9fafb;color:#4b5563;font-size:12px;text-transform:uppercase;letter-spacing:.03em}.table tr:last-child td{border-bottom:0}.right{text-align:right!important}.pill{display:inline-block;padding:4px 8px;border-radius:999px;background:#f3f4f6;font-size:11px;font-weight:700}.pill.ok{background:#dcfce7;color:#166534}.pill.warn{background:#fef3c7;color:#92400e}.pill.blue{background:#dbeafe;color:#1e40af}\n.filters{display:flex;gap:9px;flex-wrap:wrap;margin-bottom:12px}.filters input,.filters select,.form input,.form select,.form textarea{border:1px solid #d1d5db;border-radius:8px;padding:10px;background:#fff;outline:none;width:100%}.filters input{width:260px}.form{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.form label{font-size:12px;font-weight:700;color:#4b5563;display:block;margin-bottom:5px}.form .full{grid-column:1\/-1}.modal{position:fixed;inset:0;background:rgba(17,24,39,.55);display:none;align-items:center;justify-content:center;padding:20px;z-index:50}.modal.open{display:flex}.modal-box{background:#fff;width:min(800px,100%);max-height:90vh;overflow:auto;border-radius:14px;padding:20px}.modal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.modal-head h3{margin:0}.close{border:0;background:#f3f4f6;border-radius:8px;padding:8px 11px}\n.view{display:none}.view.active{display:block}\n.alert{padding:12px 14px;border-radius:10px;background:#fff7ed;border:1px solid #fed7aa;color:#9a3412;font-size:13px;margin-bottom:14px}\n.progress{height:8px;background:#e5e7eb;border-radius:99px;overflow:hidden}.progress i{display:block;height:100%;background:var(--accent);border-radius:99px}\n.report{background:#fff;border:1px solid var(--line);border-radius:13px;padding:24px}.report h2{margin-top:0}.report .report-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:15px 0}.report-box{padding:14px;background:#f9fafb;border-radius:10px}.report-box b{font-size:21px;display:block;margin-top:4px}.report textarea{min-height:100px}\n.empty{text-align:center;color:var(--muted);padding:25px}.toast{position:fixed;right:20px;bottom:20px;background:#111827;color:#fff;padding:12px 15px;border-radius:9px;display:none;z-index:100}\n@media(max-width:950px){.side{width:70px;padding:14px 8px}.logo{font-size:0;text-align:center}.logo span{font-size:22px}.nav button{font-size:0;text-align:center}.nav button:before{font-size:18px}.nav button:nth-child(1):before{content:\"\u2302\"}.nav button:nth-child(2):before{content:\"\u25a6\"}.nav button:nth-child(3):before{content:\"\u2713\"}.nav button:nth-child(4):before{content:\"\u25a4\"}.nav button:nth-child(5):before{content:\"\u2699\"}.nav small{display:none}.grid{grid-template-columns:repeat(2,1fr)}}\n@media(max-width:620px){.main{padding:14px}.grid,.form,.report .report-grid{grid-template-columns:1fr}.top{align-items:flex-start;flex-direction:column}.filters input{width:100%}}\n.chart-grid{display:grid;grid-template-columns:2fr 1fr;gap:14px;margin-top:14px}\n.chart-card{background:#fff;border:1px solid var(--line);border-radius:13px;padding:16px;box-shadow:var(--shadow);min-width:0}\n.chart-card h3{margin:0 0 4px;font-size:15px}.chart-card p{margin:0 0 12px;color:var(--muted);font-size:12px}\n.chart-wrap{height:260px;position:relative}.chart-wrap canvas{width:100%!important;height:100%!important}\n.chart-full{grid-column:1\/-1}\n.quick-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:14px}\n.quick{border:1px solid var(--line);border-radius:10px;padding:12px;background:#fafafa}.quick b{display:block;font-size:18px;margin-top:4px}\n.edit-note{font-size:12px;color:var(--muted);background:#f9fafb;border:1px solid var(--line);border-radius:9px;padding:10px 12px}\n.edit-input{font-weight:600;background:#fffdf5!important;border:1px solid #f3d28b!important}\n.row-total{font-weight:800;background:#fafafa}\n.sticky-save{position:sticky;bottom:12px;z-index:10;display:flex;justify-content:flex-end;margin-top:12px}\n@media(max-width:900px){.chart-grid{grid-template-columns:1fr}.chart-full{grid-column:auto}.quick-grid{grid-template-columns:1fr}}\n@media print{.side,.actions,.filters,.no-print{display:none!important}.main{padding:0}.report{border:0}.view{display:none!important}.view.active{display:block}}\n<\/style>\n<\/head>\n<body>\n<div class=\"app\">\n<aside class=\"side\">\n  <div class=\"logo\">CRM <span>ITAL\u00cdNEA<\/span><\/div>\n  <div class=\"nav\">\n    <button class=\"active\" data-view=\"dashboard\">Dashboard<\/button>\n    <button data-view=\"acao\">A\u00e7\u00e3o Comercial<\/button>\n    <button data-view=\"liberacao\">Libera\u00e7\u00e3o Semanal<\/button>\n    <button data-view=\"relatorio\">Relat\u00f3rio Semanal<\/button>\n    <button data-view=\"cadastro\">Cadastros<\/button>\n    <small>Dados salvos neste navegador<\/small>\n  <\/div>\n<\/aside>\n\n<main class=\"main\">\n  <div class=\"top\">\n    <div><h1 id=\"pageTitle\">Dashboard Comercial<\/h1><p id=\"pageSub\">Acompanhamento das lojas e opera\u00e7\u00e3o comercial<\/p><\/div>\n    <div class=\"actions no-print\">\n      <button class=\"btn\" onclick=\"exportJSON()\">Backup<\/button>\n      <button class=\"btn primary\" onclick=\"openModal()\">+ Novo registro<\/button>\n    <\/div>\n  <\/div>\n\n  <section id=\"dashboard\" class=\"view active\">\n    <div class=\"grid\" id=\"metrics\"><\/div>\n\n    <div class=\"chart-grid\">\n      <div class=\"chart-card\">\n        <h3>Previs\u00e3o de vendas por dia<\/h3>\n        <p>Compara\u00e7\u00e3o do potencial informado para cada dia da semana.<\/p>\n        <div class=\"chart-wrap\"><canvas id=\"salesChart\"><\/canvas><\/div>\n      <\/div>\n      <div class=\"chart-card\">\n        <h3>Convers\u00e3o comercial<\/h3>\n        <p>Agendamentos x realizados.<\/p>\n        <div class=\"chart-wrap\"><canvas id=\"conversionChart\"><\/canvas><\/div>\n      <\/div>\n      <div class=\"chart-card\">\n        <h3>Ranking de lojas por previs\u00e3o<\/h3>\n        <p>As lojas com maior potencial de fechamento aparecem primeiro.<\/p>\n        <div class=\"chart-wrap\"><canvas id=\"storesChart\"><\/canvas><\/div>\n      <\/div>\n      <div class=\"chart-card\">\n        <h3>Libera\u00e7\u00e3o: meta x realizado<\/h3>\n        <p>Vis\u00e3o r\u00e1pida do atingimento da meta semanal.<\/p>\n        <div class=\"chart-wrap\"><canvas id=\"releaseChart\"><\/canvas><\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"section\">\n      <div class=\"section-head\"><h2>Resumo das lojas<\/h2><button class=\"btn\" onclick=\"go('acao')\">Abrir a\u00e7\u00e3o comercial<\/button><\/div>\n      <div class=\"table-wrap\"><table class=\"table\" id=\"dashTable\"><\/table><\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"acao\" class=\"view\">\n    <div class=\"filters no-print\">\n      <input id=\"acaoSearch\" placeholder=\"Pesquisar loja...\" oninput=\"renderAcao()\">\n      <select id=\"acaoDay\" onchange=\"renderAcao()\"><\/select>\n      <button class=\"btn\" onclick=\"addDay()\">+ Adicionar dia<\/button>\n      <button class=\"btn danger\" onclick=\"deleteSelectedDay()\">\ud83d\uddd1 Excluir dia<\/button>\n      <button class=\"btn primary\" onclick=\"saveAllAction()\">\u2713 Salvar altera\u00e7\u00f5es<\/button>\n    <\/div>\n    <div class=\"edit-note no-print\">Os campos <b>Ag.<\/b>, <b>Real.<\/b> e <b>Previs\u00e3o<\/b> est\u00e3o liberados para edi\u00e7\u00e3o. Voc\u00ea pode alterar os valores diretamente na tabela; o sistema salva automaticamente e o bot\u00e3o acima for\u00e7a o salvamento de todas as altera\u00e7\u00f5es.<\/div>\n    <div class=\"table-wrap\"><table class=\"table\" id=\"acaoTable\"><\/table><\/div>\n  <\/section>\n\n  <section id=\"liberacao\" class=\"view\">\n    <div class=\"filters no-print\">\n      <input id=\"libSearch\" placeholder=\"Pesquisar loja...\" oninput=\"renderLiberacao()\">\n      <button class=\"btn\" onclick=\"sortLiberacao()\">Ordenar por saldo<\/button>\n      <button class=\"btn primary\" onclick=\"saveAllLiberacao()\">\u2713 Salvar altera\u00e7\u00f5es<\/button>\n    <\/div>\n    <div class=\"edit-note no-print\">Os campos <b>Saldo a liberar<\/b>, <b>UVs liberadas<\/b>, <b>Meta di\u00e1ria<\/b> e <b>Meta semanal<\/b> est\u00e3o liberados para edi\u00e7\u00e3o. Altere diretamente na tabela e salve as altera\u00e7\u00f5es.<\/div>\n    <div class=\"table-wrap\"><table class=\"table\" id=\"libTable\"><\/table><\/div>\n  <\/section>\n\n  <section id=\"relatorio\" class=\"view\">\n    <div class=\"report\">\n      <div class=\"section-head\"><h2>Relat\u00f3rio Gerencial Semanal<\/h2><div class=\"actions no-print\"><button class=\"btn\" onclick=\"window.print()\">Imprimir \/ PDF<\/button><button class=\"btn dark\" onclick=\"copyReport()\">Copiar relat\u00f3rio<\/button><\/div><\/div>\n      <p id=\"reportDate\" style=\"color:#6b7280\"><\/p>\n      <div class=\"report-grid\" id=\"reportMetrics\"><\/div>\n      <h3>Resumo executivo<\/h3>\n      <textarea id=\"executive\" class=\"form-control\" style=\"width:100%;padding:12px;border:1px solid #d1d5db;border-radius:8px;min-height:110px\" oninput=\"saveReport()\"><\/textarea>\n      <h3>Principais pontos<\/h3>\n      <div id=\"reportPoints\"><\/div>\n    <\/div>\n  <\/section>\n\n  <section id=\"cadastro\" class=\"view\">\n    <div class=\"section-head\"><h2>Lojas cadastradas<\/h2><button class=\"btn primary no-print\" onclick=\"openModal('loja')\">+ Nova loja<\/button><\/div>\n    <div class=\"table-wrap\"><table class=\"table\" id=\"lojasTable\"><\/table><\/div>\n  <\/section>\n<\/main>\n<\/div>\n\n<div class=\"modal\" id=\"modal\">\n <div class=\"modal-box\">\n  <div class=\"modal-head\"><h3 id=\"modalTitle\">Novo registro<\/h3><button class=\"close\" onclick=\"closeModal()\">\u2715<\/button><\/div>\n  <form id=\"form\" class=\"form\" onsubmit=\"saveForm(event)\">\n    <input type=\"hidden\" id=\"recordType\" value=\"loja\">\n    <div><label>Tipo<\/label><select id=\"fType\" onchange=\"toggleForm()\"><option value=\"loja\">Loja<\/option><option value=\"acao\">A\u00e7\u00e3o Comercial<\/option><option value=\"lib\">Libera\u00e7\u00e3o<\/option><\/select><\/div>\n    <div><label>Loja<\/label><input id=\"fLoja\" required><\/div>\n    <div id=\"fieldDay\"><label>Dia<\/label><select id=\"fDay\"><option value=\"0\">20\/08 - Quinta<\/option><option value=\"1\">21\/08 - Sexta<\/option><option value=\"2\">22\/08 - S\u00e1bado<\/option><\/select><\/div>\n    <div id=\"fieldAg\"><label>Agendamentos<\/label><input id=\"fAg\" type=\"number\" min=\"0\" value=\"0\"><\/div>\n    <div id=\"fieldReal\"><label>Realizados<\/label><input id=\"fReal\" type=\"number\" min=\"0\" value=\"0\"><\/div>\n    <div id=\"fieldPrev\"><label>Previs\u00e3o de venda (R$)<\/label><input id=\"fPrev\" type=\"number\" min=\"0\" step=\"0.01\" value=\"0\"><\/div>\n    <div id=\"fieldSaldo\"><label>Saldo a liberar (UVs)<\/label><input id=\"fSaldo\" type=\"number\" min=\"0\" value=\"0\"><\/div>\n    <div id=\"fieldUvs\"><label>UVs liberadas<\/label><input id=\"fUvs\" type=\"number\" min=\"0\" value=\"0\"><\/div>\n    <div id=\"fieldMeta\"><label>Meta semanal (UVs)<\/label><input id=\"fMeta\" type=\"number\" min=\"0\" value=\"0\"><\/div>\n    <div class=\"full\" style=\"display:flex;justify-content:flex-end;gap:8px;margin-top:8px\"><button type=\"button\" class=\"btn\" onclick=\"closeModal()\">Cancelar<\/button><button class=\"btn primary\">Salvar<\/button><\/div>\n  <\/form>\n <\/div>\n<\/div>\n<div class=\"toast\" id=\"toast\"><\/div>\n\n<script>\nconst initialStores=[\n\"SO INTERIORES\",\"CAPPELLANI\",\"FGPLUS\",\"LUGUI CENTRO\",\"LUGUI YARA\",\"DIANA PRIME\",\"COELHO AREAN\",\"OLIVEIRA\",\"COMPORTT\",\"RAPOSO PRIME\",\"MOBILE D ARTE\",\"D&D\",\"AKIO\",\"EMBU\",\"MV DE LIMA\"\n];\nconst initialLiberacao=[\n[\"19467 - FG PLUS DESIGN\",800,0,33.3333333,200],[\"20356 - DIANA PLANEJADOS\",660,0,27.5,165],\n[\"19775 - LUGUI PROJETADOS\",550,0,22.9166667,137.5],[\"20155 - LUGUI AMBIENTES\",400,0,16.6666667,100],\n[\"16893 - MOBILE D ARTE\",305,0,12.7083333,76.25],[\"16508 - OLIVEIRA CABRAL\",305,0,12.7083333,76.25],\n[\"17558 - D&D COMERCIO\",290,0,12.0833333,72.5],[\"10386 - M. V. DE LIMA\",285,0,11.875,71.25],\n[\"11424 - SO INTERIORES\",275,0,11.4583333,68.75],[\"15308 - ADUKE COMERCIO\",250,0,10.4166667,62.5],\n[\"15474 - COMPORT MOVEIS\",250,0,10.4166667,62.5],[\"13905 - CAPPELLANI\",250,0,10.4166667,62.5],\n[\"6715 - COELHO AREAN\",305,0,12.7083333,76.25],[\"18747 - YARA DESIGN\",200,0,8.3333333,50],\n[\"21482 - RC DESIGN\",240,0,10,60]\n];\nlet data=JSON.parse(localStorage.getItem(\"crmItalinea\")||\"null\")||{\nstores:initialStores.map((name,i)=>({id:i+1,name})),\ndays:[\n{date:\"20\/08 - Quinta-feira\",rows:initialStores.map(name=>({name,ag:0,real:0,prev:0}))},\n{date:\"21\/08 - Sexta-feira\",rows:initialStores.map(name=>({name,ag:0,real:0,prev:0}))},\n{date:\"22\/08 - S\u00e1bado\",rows:initialStores.map(name=>({name,ag:0,real:0,prev:0}))}\n],\nlib:initialLiberacao.map((r,i)=>({id:i+1,name:r[0],saldo:r[1],uvs:r[2],metaDia:r[3],metaSemana:r[4]})),\nreport:{executive:\"\"}\n};\nfunction save(){localStorage.setItem(\"crmItalinea\",JSON.stringify(data));}\nconst brl=n=>Number(n||0).toLocaleString(\"pt-BR\",{style:\"currency\",currency:\"BRL\",maximumFractionDigits:0});\nconst num=n=>Number(n||0).toLocaleString(\"pt-BR\",{maximumFractionDigits:1});\nfunction toast(t){let x=document.getElementById(\"toast\");x.textContent=t;x.style.display=\"block\";setTimeout(()=>x.style.display=\"none\",2200)}\nfunction go(id){\n document.querySelectorAll(\".view\").forEach(x=>x.classList.remove(\"active\"));document.getElementById(id).classList.add(\"active\");\n document.querySelectorAll(\".nav button\").forEach(x=>x.classList.toggle(\"active\",x.dataset.view===id));\n const titles={dashboard:[\"Dashboard Comercial\",\"Vis\u00e3o geral da opera\u00e7\u00e3o\"],acao:[\"A\u00e7\u00e3o Comercial\",\"Agendamentos, realizados e previs\u00e3o de vendas\"],liberacao:[\"Libera\u00e7\u00e3o Semanal\",\"Controle de saldo e UVs por loja\"],relatorio:[\"Relat\u00f3rio Semanal\",\"Resumo gerencial pronto para apresenta\u00e7\u00e3o\"],cadastro:[\"Cadastros\",\"Lojas e dados b\u00e1sicos\"]};\n document.getElementById(\"pageTitle\").textContent=titles[id][0];document.getElementById(\"pageSub\").textContent=titles[id][1];\n renderAll();\n}\ndocument.querySelectorAll(\".nav button\").forEach(b=>b.onclick=()=>go(b.dataset.view));\n\nfunction renderDashboard(){\n let ag=0,real=0,prev=0;data.days.forEach(d=>d.rows.forEach(r=>{ag+=+r.ag;real+=+r.real;prev+=+r.prev}));\n let saldo=data.lib.reduce((s,r)=>s+ +r.saldo,0),uvs=data.lib.reduce((s,r)=>s+ +r.uvs,0),meta=data.lib.reduce((s,r)=>s+ +r.metaSemana,0);\n document.getElementById(\"metrics\").innerHTML=[\n  [\"Lojas\",data.stores.length,\"cadastradas\"],[\"Agendamentos\",ag,\"na semana\"],[\"Realizados\",real,\"na semana\"],[\"Previs\u00e3o de vendas\",brl(prev),\"valor informado\"],\n  [\"Saldo a liberar\",num(saldo),\"UVs\"],[\"UVs liberadas\",num(uvs),\"na semana\"],[\"Meta semanal\",num(meta),\"UVs\"],[\"Atingimento\",meta?(uvs\/meta*100).toFixed(1)+\"%\":\"0%\",\"libera\u00e7\u00e3o vs. meta\"]\n ].map(x=>`<div class=\"card metric\"><div class=\"label\">${x[0]}<\/div><div class=\"value\">${x[1]}<\/div><div class=\"sub\">${x[2]}<\/div><\/div>`).join(\"\");\n let rows=data.stores.map(s=>{let a=data.days.reduce((o,d)=>{let r=d.rows.find(x=>norm(x.name)==norm(s.name));if(r){o.ag+=+r.ag;o.real+=+r.real;o.prev+=+r.prev}return o},{ag:0,real:0,prev:0});return `<tr><td>${s.name}<\/td><td>${a.ag}<\/td><td>${a.real}<\/td><td>${brl(a.prev)}<\/td><td>${a.ag?`<span class=\"pill ${a.real\/a.ag>=.5?\"ok\":a.real\/a.ag>=.25?\"warn\":\"\"}\">${((a.real\/a.ag)*100).toFixed(0)}%<\/span>`:\"-\"}<\/td><\/tr>`}).join(\"\");\n document.getElementById(\"dashTable\").innerHTML=`<thead><tr><th>Loja<\/th><th>Agendamentos<\/th><th>Realizados<\/th><th>Previs\u00e3o<\/th><th>Convers\u00e3o<\/th><\/tr><\/thead><tbody>${rows}<\/tbody>`;\n}\nfunction norm(s){return String(s||\"\").toUpperCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g,\"\").trim()}\nfunction renderDaySelector(){\n let select=document.getElementById(\"acaoDay\");\n if(!select)return;\n let current=select.value;\n select.innerHTML='<option value=\"all\">Todos os dias<\/option>'+data.days.map((d,i)=>`<option value=\"${i}\">${d.date}<\/option>`).join(\"\");\n if([...select.options].some(o=>o.value===current)) select.value=current;\n else select.value=\"all\";\n}\nfunction deleteSelectedDay(){\n let select=document.getElementById(\"acaoDay\");\n let value=select ? select.value : \"all\";\n if(value===\"all\"){toast(\"Selecione um dia espec\u00edfico para excluir\");return;}\n let index=Number(value);\n if(!data.days[index])return;\n let dayName=data.days[index].date;\n if(data.days.length<=1){toast(\"\u00c9 necess\u00e1rio manter pelo menos um dia\");return;}\n if(!confirm(`Excluir o dia \"${dayName}\" e todos os seus lan\u00e7amentos?`))return;\n data.days.splice(index,1);\n save();\n renderDaySelector();\n if(document.getElementById(\"acaoDay\"))document.getElementById(\"acaoDay\").value=\"all\";\n renderAcao();\n renderDashboard();\n renderReport();\n drawCharts();\n toast(\"Dia exclu\u00eddo com sucesso\");\n}\nfunction renderAcao(){\n renderDaySelector();\n let q=norm(document.getElementById(\"acaoSearch\").value),day=document.getElementById(\"acaoDay\").value;\n let days=day===\"all\"?data.days:[data.days[+day]];\n let head=`<thead><tr><th>Loja<\/th>${days.map(d=>`<th colspan=\"3\">${d.date}<\/th>`).join(\"\")}<th>Total Prev.<\/th><\/tr><tr><th><\/th>${days.map(()=>\"<th>AG.<\/th><th>REAL.<\/th><th>PREVIS\u00c3O<\/th>\").join(\"\")}<th><\/th><\/tr><\/thead>`;\n let body=data.stores.filter(s=>!q||norm(s.name).includes(q)).map(s=>{\n   let total=0;\n   let cells=days.map(d=>{\n     let r=d.rows.find(x=>norm(x.name)==norm(s.name))||{ag:0,real:0,prev:0};\n     total+=+r.prev;\n     return `<td><input class=\"edit-input\" aria-label=\"Agendamentos\" style=\"width:70px;padding:8px;border-radius:6px\" type=\"number\" min=\"0\" value=\"${r.ag}\" oninput=\"updAcao('${esc(s.name)}','${esc(d.date)}','ag',this.value)\"><\/td>\n     <td><input class=\"edit-input\" aria-label=\"Realizados\" style=\"width:70px;padding:8px;border-radius:6px\" type=\"number\" min=\"0\" value=\"${r.real}\" oninput=\"updAcao('${esc(s.name)}','${esc(d.date)}','real',this.value)\"><\/td>\n     <td><input class=\"edit-input\" aria-label=\"Previs\u00e3o\" style=\"width:115px;padding:8px;border-radius:6px\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${r.prev}\" oninput=\"updAcao('${esc(s.name)}','${esc(d.date)}','prev',this.value)\"><\/td>`;\n   }).join(\"\");\n   return `<tr><td><b>${s.name}<\/b><\/td>${cells}<td class=\"row-total\">${brl(total)}<\/td><\/tr>`;\n }).join(\"\");\n document.getElementById(\"acaoTable\").innerHTML=head+\"<tbody>\"+body+\"<\/tbody>\";\n}\nfunction saveAllAction(){save();renderDashboard();renderReport();toast(\"Todas as altera\u00e7\u00f5es foram salvas\")}\nfunction esc(s){return String(s).replace(\/'\/g,\"\\\\'\")}\nfunction updAcao(name,date,key,val){let d=data.days.find(x=>x.date===date);let r=d.rows.find(x=>norm(x.name)===norm(name));if(!r){r={name,ag:0,real:0,prev:0};d.rows.push(r)}r[key]=Number(val)||0;save();renderDashboard();toast(\"Registro atualizado\")}\nfunction renderLiberacao(){\n let q=norm(document.getElementById(\"libSearch\").value);\n let rows=data.lib.filter(r=>!q||norm(r.name).includes(q));\n document.getElementById(\"libTable\").innerHTML=`<thead><tr>\n <th>Loja<\/th><th>Saldo a liberar<\/th><th>UVs liberadas<\/th><th>Meta di\u00e1ria<\/th><th>Meta semanal<\/th><th>Atingimento<\/th>\n <\/tr><\/thead><tbody>${rows.map((r)=>{\n   let pct=(Number(r.uvs)>0)?(Number(r.saldo)\/Number(r.uvs)*100):0;\n   return `<tr>\n    <td><b>${r.name}<\/b><\/td>\n    <td><input class=\"edit-input\" style=\"width:110px;padding:8px;border-radius:6px\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${r.saldo}\" oninput=\"updLiberacao(${r.id},'saldo',this.value)\"><\/td>\n    <td><input class=\"edit-input\" style=\"width:110px;padding:8px;border-radius:6px\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${r.uvs}\" oninput=\"updLiberacao(${r.id},'uvs',this.value)\"><\/td>\n    <td><input class=\"edit-input\" style=\"width:110px;padding:8px;border-radius:6px\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${r.metaDia}\" oninput=\"updLiberacao(${r.id},'metaDia',this.value)\"><\/td>\n    <td><input class=\"edit-input\" style=\"width:110px;padding:8px;border-radius:6px\" type=\"number\" min=\"0\" step=\"0.01\" value=\"${r.metaSemana}\" oninput=\"updLiberacao(${r.id},'metaSemana',this.value)\"><\/td>\n    <td style=\"min-width:170px\">\n      <div style=\"display:flex;justify-content:space-between;font-size:11px\"><span>${pct.toFixed(1)}%<\/span><span>${pct>=100?\"Meta atingida\":\"\"}<\/span><\/div>\n      <div class=\"progress\"><i style=\"width:${Math.min(pct,100)}%\"><\/i><\/div>\n    <\/td>\n   <\/tr>`;\n }).join(\"\")}<\/tbody>`;\n}\nfunction updLiberacao(id,key,val){\n let r=data.lib.find(x=>String(x.id)===String(id));\n if(!r)return;\n r[key]=Number(val)||0;\n save();\n \/\/ Atualiza os indicadores e relat\u00f3rio sem reconstruir a tabela, preservando o campo que est\u00e1 sendo editado.\n renderDashboard();\n renderReport();\n drawCharts();\n}\nfunction saveAllLiberacao(){save();renderDashboard();renderReport();drawCharts();toast(\"Todas as altera\u00e7\u00f5es de libera\u00e7\u00e3o foram salvas\")}\nfunction sortLiberacao(){data.lib.sort((a,b)=>b.saldo-a.saldo);save();renderLiberacao();toast(\"Ordenado por saldo\")}\nfunction renderReport(){\n let ag=0,real=0,prev=0;data.days.forEach(d=>d.rows.forEach(r=>{ag+=+r.ag;real+=+r.real;prev+=+r.prev}));\n let saldo=data.lib.reduce((s,r)=>s+ +r.saldo,0),uvs=data.lib.reduce((s,r)=>s+ +r.uvs,0),meta=data.lib.reduce((s,r)=>s+ +r.metaSemana,0);\n document.getElementById(\"reportDate\").textContent=\"Relat\u00f3rio gerado em \"+new Date().toLocaleString(\"pt-BR\");\n document.getElementById(\"reportMetrics\").innerHTML=[[\"Agendamentos\",ag],[\"Realizados\",real],[\"Previs\u00e3o\",brl(prev)],[\"Saldo a liberar\",num(saldo)+\" UVs\"],[\"UVs liberadas\",num(uvs)],[\"Meta semanal\",num(meta)+\" UVs\"]].map(x=>`<div class=\"report-box\"><span>${x[0]}<\/span><b>${x[1]}<\/b><\/div>`).join(\"\");\n document.getElementById(\"executive\").value=data.report.executive||\"\";\n let ranked=[...data.stores].map(s=>{let a={ag:0,real:0,prev:0};data.days.forEach(d=>{let r=d.rows.find(x=>norm(x.name)==norm(s.name));if(r){a.ag+=+r.ag;a.real+=+r.real;a.prev+=+r.prev}});return {...s,...a}}).sort((a,b)=>b.prev-a.prev);\n document.getElementById(\"reportPoints\").innerHTML=`<ul>${ranked.filter(x=>x.prev||x.ag||x.real).slice(0,8).map(x=>`<li><b>${x.name}<\/b>: ${x.ag} agendamento(s), ${x.real} realizado(s), previs\u00e3o de ${brl(x.prev)}.<\/li>`).join(\"\")||\"<li>Nenhum movimento informado ainda.<\/li>\"}<\/ul>`;\n}\nfunction saveReport(){data.report.executive=document.getElementById(\"executive\").value;save()}\nfunction copyReport(){let txt=document.querySelector(\".report\").innerText;navigator.clipboard?.writeText(txt);toast(\"Relat\u00f3rio copiado\")}\nfunction renderCadastros(){\n document.getElementById(\"lojasTable\").innerHTML=`<thead><tr><th>ID<\/th><th>Loja<\/th><th>A\u00e7\u00f5es<\/th><\/tr><\/thead><tbody>${data.stores.map((s,i)=>`<tr><td>${s.id||i+1}<\/td><td>${s.name}<\/td><td><button class=\"btn danger\" onclick=\"removeStore(${i})\">Excluir<\/button><\/td><\/tr>`).join(\"\")}<\/tbody>`;\n}\nfunction removeStore(i){if(!confirm(\"Excluir esta loja?\"))return;data.stores.splice(i,1);data.days.forEach(d=>d.rows=d.rows.filter(r=>norm(r.name)!==norm(data.stores[i]?.name)));save();renderAll();toast(\"Loja exclu\u00edda\")}\nfunction addDay(){let name=prompt(\"Nome do novo dia\/per\u00edodo:\");if(!name)return;data.days.push({date:name,rows:data.stores.map(s=>({name:s.name,ag:0,real:0,prev:0}))});save();renderAcao();toast(\"Dia adicionado\")}\nfunction openModal(type=\"loja\"){document.getElementById(\"modal\").classList.add(\"open\");document.getElementById(\"fType\").value=type;toggleForm()}\nfunction closeModal(){document.getElementById(\"modal\").classList.remove(\"open\")}\nfunction toggleForm(){\n let t=document.getElementById(\"fType\").value;let ac=t===\"acao\",lib=t===\"lib\";\n [\"fieldDay\",\"fieldAg\",\"fieldReal\",\"fieldPrev\"].forEach(id=>document.getElementById(id).style.display=ac?\"block\":\"none\");\n [\"fieldSaldo\",\"fieldUvs\",\"fieldMeta\"].forEach(id=>document.getElementById(id).style.display=lib?\"block\":\"none\");\n}\nfunction saveForm(e){\n e.preventDefault();let t=document.getElementById(\"fType\").value,name=document.getElementById(\"fLoja\").value.trim();\n if(t===\"loja\"){data.stores.push({id:Date.now(),name});data.days.forEach(d=>d.rows.push({name,ag:0,real:0,prev:0}));}\n if(t===\"acao\"){let d=data.days[+document.getElementById(\"fDay\").value]||data.days[0];d.rows.push({name,ag:+fAg.value||0,real:+fReal.value||0,prev:+fPrev.value||0});if(!data.stores.some(s=>norm(s.name)===norm(name)))data.stores.push({id:Date.now(),name});}\n if(t===\"lib\"){data.lib.push({id:Date.now(),name,saldo:+fSaldo.value||0,uvs:+fUvs.value||0,metaDia:(+fMeta.value||0)\/6,metaSemana:+fMeta.value||0});}\n save();closeModal();renderAll();toast(\"Registro salvo com sucesso\")}\n\nfunction drawCharts(){\n  const get=(id)=>document.getElementById(id);\n  const setup=(id)=>{const c=get(id); if(!c)return null; const d=devicePixelRatio||1; const rect=c.getBoundingClientRect(); c.width=rect.width*d; c.height=rect.height*d; const x=c.getContext(\"2d\"); x.setTransform(d,0,0,d,0,0); return {c,x,w:rect.width,h:rect.height};};\n  const line=(id,labels,values)=>{\n    const z=setup(id); if(!z)return; const {x,w,h}=z; x.clearRect(0,0,w,h);\n    const pad={l:42,r:15,t:18,b:34}, cw=w-pad.l-pad.r,ch=h-pad.t-pad.b, max=Math.max(...values,1);\n    x.strokeStyle=\"#e5e7eb\";x.lineWidth=1;x.font=\"11px Arial\";x.fillStyle=\"#6b7280\";\n    for(let i=0;i<=4;i++){let y=pad.t+ch-(ch*i\/4);x.beginPath();x.moveTo(pad.l,y);x.lineTo(w-pad.r,y);x.stroke();x.fillText((max*i\/4).toFixed(0),4,y+4)}\n    x.strokeStyle=\"#b91c1c\";x.lineWidth=3;x.beginPath();\n    values.forEach((v,i)=>{let px=pad.l+(cw*(i\/(values.length-1||1))),py=pad.t+ch-(v\/max)*ch;i?x.lineTo(px,py):x.moveTo(px,py);});\n    x.stroke();x.fillStyle=\"#b91c1c\";\n    values.forEach((v,i)=>{let px=pad.l+(cw*(i\/(values.length-1||1))),py=pad.t+ch-(v\/max)*ch;x.beginPath();x.arc(px,py,4,0,Math.PI*2);x.fill();x.fillStyle=\"#374151\";x.fillText(labels[i],Math.max(2,px-24),h-9);x.fillStyle=\"#b91c1c\";});\n  };\n  const bars=(id,labels,values,second)=>{\n    const z=setup(id);if(!z)return;const{x,w,h}=z;x.clearRect(0,0,w,h);const pad={l:42,r:12,t:18,b:48},cw=w-pad.l-pad.r,ch=h-pad.t-pad.b,max=Math.max(...(second?values.concat(second):values),1);\n    x.strokeStyle=\"#e5e7eb\";x.font=\"11px Arial\";x.fillStyle=\"#6b7280\";\n    for(let i=0;i<=4;i++){let y=pad.t+ch-(ch*i\/4);x.beginPath();x.moveTo(pad.l,y);x.lineTo(w-pad.r,y);x.stroke();x.fillText(Math.round(max*i\/4),5,y+4)}\n    const group=cw\/labels.length, bw=second?Math.min(22,group*.27):Math.min(34,group*.45);\n    labels.forEach((lab,i)=>{let base=pad.l+group*i+group\/2;let v=values[i]||0;let bh=v\/max*ch;x.fillStyle=\"#b91c1c\";x.fillRect(base-bw-(second?3:0),pad.t+ch-bh,bw,bh);\n      if(second){let v2=second[i]||0,bh2=v2\/max*ch;x.fillStyle=\"#64748b\";x.fillRect(base+3,pad.t+ch-bh2,bw,bh2)}\n      x.fillStyle=\"#374151\";x.save();x.translate(base+2,h-8);x.rotate(-.35);x.fillText(lab,-20,0);x.restore();\n    });\n    if(second){x.fillStyle=\"#b91c1c\";x.fillRect(w-120,12,9,9);x.fillStyle=\"#374151\";x.fillText(\"Realizado\",w-106,21);x.fillStyle=\"#64748b\";x.fillRect(w-55,12,9,9);x.fillStyle=\"#374151\";x.fillText(\"Meta\",w-42,21)}\n  };\n  const donut=(id,labels,values)=>{\n    const z=setup(id);if(!z)return;const{x,w,h}=z;x.clearRect(0,0,w,h);const total=Math.max(values.reduce((a,b)=>a+b,0),1),cx=w*.38,cy=h*.48,r=Math.min(w,h)*.28;\n    let a=-Math.PI\/2;const colors=[\"#b91c1c\",\"#64748b\",\"#9ca3af\"];\n    values.forEach((v,i)=>{let b=a+(v\/total)*Math.PI*2;x.beginPath();x.moveTo(cx,cy);x.arc(cx,cy,r,a,b);x.closePath();x.fillStyle=colors[i%colors.length];x.fill();a=b});\n    x.beginPath();x.fillStyle=\"#fff\";x.arc(cx,cy,r*.55,0,Math.PI*2);x.fill();x.fillStyle=\"#111827\";x.font=\"bold 20px Arial\";x.textAlign=\"center\";x.fillText(total,cx,cy+7);x.textAlign=\"left\";\n    labels.forEach((l,i)=>{let y=45+i*34;x.fillStyle=colors[i%colors.length];x.fillRect(w*.68,y-9,10,10);x.fillStyle=\"#374151\";x.font=\"12px Arial\";x.fillText(l+\" \"+values[i],w*.68+16,y)})\n  };\n\n  let daily=data.days.map(d=>d.rows.reduce((s,r)=>s+(+r.prev||0),0));\n  line(\"salesChart\",data.days.map(d=>d.date.split(\" - \")[0]),daily);\n\n  let ag=0,real=0;data.days.forEach(d=>d.rows.forEach(r=>{ag+=+r.ag||0;real+=+r.real||0}));\n  donut(\"conversionChart\",[\"Agendados\",\"Realizados\"],[Math.max(ag-real,0),real]);\n\n  let ranked=data.stores.map(s=>({name:s.name,prev:data.days.reduce((sum,d)=>{let r=d.rows.find(x=>norm(x.name)===norm(s.name));return sum+(r?+r.prev:0)},0)})).filter(x=>x.prev>0).sort((a,b)=>b.prev-a.prev).slice(0,6);\n  bars(\"storesChart\",ranked.map(x=>x.name.slice(0,14)),ranked.map(x=>x.prev));\n\n  let uvs=data.lib.reduce((s,r)=>s+(+r.uvs||0),0),meta=data.lib.reduce((s,r)=>s+(+r.metaSemana||0),0);\n  bars(\"releaseChart\",[\"Libera\u00e7\u00e3o\",\"Restante\"],[uvs,Math.max(meta-uvs,0)]);\n}\n\nfunction renderAll(){renderDaySelector();renderDashboard();renderAcao();renderLiberacao();renderReport();renderCadastros();drawCharts()}\nfunction exportJSON(){let blob=new Blob([JSON.stringify(data,null,2)],{type:\"application\/json\"}),a=document.createElement(\"a\");a.href=URL.createObjectURL(blob);a.download=\"backup-crm-italinea.json\";a.click();URL.revokeObjectURL(a.href)}\nrenderAll();\nwindow.addEventListener('resize',()=>{clearTimeout(window._crmResize);window._crmResize=setTimeout(drawCharts,180)});\n<\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>CRM Ital\u00ednea \u2022 Gest\u00e3o Comercial CRM ITAL\u00cdNEA Dashboard A\u00e7\u00e3o Comercial Libera\u00e7\u00e3o Semanal Relat\u00f3rio Semanal Cadastros Dados salvos neste navegador Dashboard Comercial Acompanhamento das lojas e opera\u00e7\u00e3o comercial Backup + Novo registro Previs\u00e3o de vendas por dia Compara\u00e7\u00e3o do potencial informado para cada dia da semana. Convers\u00e3o comercial Agendamentos x realizados. Ranking de lojas por previs\u00e3o [&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-139","page","type-page","status-publish","hentry"],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/pages\/139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/comments?post=139"}],"version-history":[{"count":16,"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/pages\/139\/revisions"}],"predecessor-version":[{"id":155,"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/pages\/139\/revisions\/155"}],"wp:attachment":[{"href":"https:\/\/cbsinfoshop.com.br\/home\/wp-json\/wp\/v2\/media?parent=139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}