Diamond Patrimônio
& Almoxarifado
GX
Grupo X Telecom
Enterprise · 24 usuários · 6 cidades
JS
João Silva
Administrador
NotificaçõesMarcar tudo lido
Toner HP — CRÍTICO: apenas 3 unidadesagora
Mínimo: 5 · Estoque B2-P1-G1
Álcool isopropílico — CRÍTICO: 2 frascos15min
Mínimo: 10 · Estoque A2-P1-G4
Cautela vencida — Carlos Mendes1h
Multímetro Fluke 115 · venceu 06/05
3 divergências — auditoria Belém3h
Projetor, Nobreak, Switch
NF 004521 importada com sucessoontem
Staples Brasil · 50 resmas A4
JS
João Silva
Almoxarife Sênior · Belém
Meu perfil
Configurações
Imprimir
Sair do sistema
DiamondDashboard
Dashboard
Diamond Informática · visão geral consolidada · maio 2026
⚠ Alertas críticos — atenção imediata necessária4 alertas
Toner HP LaserJet — CRÍTICO: apenas 3 unidades (mín. 5)
Almoxarifado B2-P1-G1 · Fornecedor: HP Brasil · solicitar reposição urgente
Álcool isopropílico — CRÍTICO: apenas 2 frascos (mín. 10)
Almoxarifado A2-P1-G4 · QuimiLab Distribuidora
Bateria CR2032 — Abaixo do mínimo: 12 unidades (mín. 20)
Almoxarifado A3-P1-G1 · Duracell
Cautela vencida — Carlos Mendes com Multímetro Fluke 115
Macapá · Venceu 06/05/2026 · contatar responsável
Total de bens
1.247
↑ +34 este mês
Itens em estoque
312
89 categorias
Alertas estoque
4
↑ críticos
Cautelas ativas
8
ferramentas
Conformidade audit.
97,3%
↑ +1,2%
Valor do acervo
R$ 2,4M
deprec. R$ 1,7M
Status do patrimônioVer todos →
Em uso1.089 bens
Em estoque98 bens
Manutenção31 bens
Extraviados14 bens
Estoque crítico agoraAlmoxarifado →
AToner HP LaserJet ProBaixo3/5
CÁlcool isopropílico 1LCrítico2/10
CBateria CR2032Baixo12/20
Distribuição por cidade
Belém — PA
412
Manaus — AM
289
Santarém — PA
198
Macapá — AP
174
Marabá — PA
112
Atividade recenteVer histórico →
Entrada NF 004521 — 50 resmas papel A4
João Silva · XML importado · Estoque Central
8min
Requisição #89 aprovada — Toner HP
TI Belém · 2 unidades saíram
1h
Notebook Dell XPS tombado
GXT-BEL-NBK-2026-000154 · João Silva
2h
Divergência: Projetor Epson não localizado
Auditoria Belém · Sala Reuniões
3h
Cautela emitida — Furadeira Bosch GSB13
Carlos Mendes · Devolução 12/05/2026
ontem
Powered by Diamond Informática & Sistemas Comerciais · v4.0.0 grupox.diamondpatrimonio.com.br  ·  Online
'; var w=window.open('','_blank','width=900,height=700'); w.document.write(h);w.document.close(); setTimeout(function(){w.print();},600); showToast('PDF de conferência gerado!','gold',3000); } // Add entry item var itmC=1; function addItem(){ itmC++; var d=document.createElement('div'); d.style.cssText='padding:10px;background:var(--bg);border-radius:8px;margin-top:8px;border:1.5px solid var(--border)'; d.innerHTML='
' +'
Descrição *
' +'
Código
' +'
Unidade
' +'
Quantidade
' +'
Valor unit.
' +'
'; var btn=document.createElement('button'); btn.className='bs bsm';btn.style.cssText='color:var(--er);border-color:var(--er)';btn.textContent='× Remover'; btn.onclick=function(){this.closest('div').remove();}; d.appendChild(btn); var ei=document.getElementById('entry-items'); if(ei)ei.appendChild(d); } // ── DOCUMENT CONTENTS ──────────────────────────────────────────────── const DOCS_CONTENT = { eula: { title: 'Termos de Uso do Software (EULA)', sub: 'Diamond Informática & Sistemas Comerciais · Versão 1.0 · Maio/2026', filename: 'Diamond_EULA_Termos_de_Uso.txt', body: `TERMOS DE USO DO SOFTWARE — EULA Diamond Informática & Sistemas Comerciais CNPJ: XX.XXX.XXX/0001-XX Versão 1.0 — Maio de 2026 ═══════════════════════════════════════════════════════ LEIA ATENTAMENTE ANTES DE USAR O SOFTWARE Ao acessar ou usar o sistema Diamond Patrimônio & Almoxarifado, você (CONTRATANTE) concorda com os termos abaixo. 1. DO OBJETO 1.1 O presente instrumento regula o licenciamento de uso do software Diamond Patrimônio & Almoxarifado (doravante "Software"), desenvolvido e comercializado por Diamond Informática & Sistemas Comerciais, como Software como Serviço (SaaS). 1.2 O Software é fornecido exclusivamente para controle patrimonial, gestão de almoxarifado, rastreio de equipamentos e módulos correlatos, nos termos contratados. 2. DA LICENÇA DE USO 2.1 O CONTRATANTE recebe uma licença de uso não exclusiva, intransferível e limitada ao plano contratado. 2.2 É expressamente proibido: sublicenciar, vender, alugar, transferir, copiar, modificar ou fazer engenharia reversa do Software. 2.3 O número de usuários é limitado ao plano contratado. Usuários adicionais devem ser adquiridos junto à Diamond Informática. 3. DAS RESPONSABILIDADES DA DIAMOND INFORMÁTICA 3.1 Manter o sistema disponível conforme o SLA do plano contratado. 3.2 Proteger os dados da CONTRATANTE com medidas técnicas adequadas. 3.3 Notificar a CONTRATANTE em caso de incidente de segurança em até 72 horas, conforme LGPD art. 48. 3.4 Realizar backups automáticos diários dos dados. 4. DAS RESPONSABILIDADES DA CONTRATANTE 4.1 A CONTRATANTE é responsável pelo uso adequado do Software e pelo cumprimento da LGPD em relação a seus próprios funcionários. 4.2 A CONTRATANTE é responsável por obter os consentimentos ou fundamentar as bases legais adequadas para monitoramento de seus funcionários. 4.3 A CONTRATANTE deve manter confidencialidade das credenciais de acesso e responde por acessos indevidos originados de seus usuários. 5. DA LIMITAÇÃO DE RESPONSABILIDADE 5.1 A Diamond Informática não se responsabiliza por danos indiretos, lucros cessantes ou danos emergentes. 5.2 O valor máximo de indenização fica limitado ao valor pago nos últimos 12 meses de contrato. 5.3 A Diamond Informática não garante que o sistema estará livre de erros, mas se compromete a corrigir defeitos em prazo razoável. 6. DA PROPRIEDADE INTELECTUAL 6.1 Todo o código-fonte, design, algoritmos e know-how do Software são de propriedade exclusiva da Diamond Informática. 6.2 Os dados inseridos pela CONTRATANTE permanecem de sua propriedade e serão devolvidos/excluídos conforme solicitado. 7. DO BLOQUEIO E RESCISÃO 7.1 O acesso poderá ser suspenso automaticamente em caso de inadimplência superior a 15 (quinze) dias. 7.2 Após 30 dias de inadimplência, o contrato poderá ser rescindido e os dados excluídos após aviso prévio de 10 dias. 8. DA PROTEÇÃO DE DADOS — LGPD 8.1 A Diamond Informática atua como OPERADORA dos dados da CONTRATANTE, conforme LGPD art. 5º, VII. 8.2 O tratamento de dados é regido pelo DPA (Data Processing Agreement) anexo a este contrato. 9. DO FORO Fica eleito o foro da Comarca de Belém/PA para dirimir quaisquer conflitos oriundos deste instrumento. Diamond Informática & Sistemas Comerciais Weldo Santana — Sócio Proprietário contato@diamond.com.br` }, privacidade: { title: 'Política de Privacidade', sub: 'Diamond Patrimônio & Almoxarifado — Versão 1.0 — Maio/2026', filename: 'Diamond_Politica_Privacidade.txt', body: `POLÍTICA DE PRIVACIDADE Diamond Patrimônio & Almoxarifado Versão 1.0 — Maio de 2026 ═══════════════════════════════════════════════════════ 1. QUEM SOMOS Diamond Informática & Sistemas Comerciais, CNPJ XX.XXX.XXX/0001-XX, com sede em Belém/PA, é a empresa responsável pelo sistema Diamond Patrimônio & Almoxarifado. Nesta política, atuamos como OPERADORA de dados, processando informações por instrução das empresas CONTRATANTES (controladoras). 2. QUAIS DADOS COLETAMOS 2.1 Dados de cadastro: - Nome, email e cargo dos usuários do sistema - Dados da empresa (CNPJ, endereço, telefone) - Dados de bens patrimoniais e itens de estoque 2.2 Dados de uso: - Logs de acesso (IP, data/hora, ação realizada) - Registros de aceite do Diamond Track - Histórico de movimentações e alterações 2.3 Dados do Diamond Track Agent: - Endereço IP do equipamento na rede corporativa - Status de conexão (online/offline) - Identificador do hardware (serial/tombamento) - NÃO coletamos: arquivos, mensagens, histórico de navegação, localização GPS pessoal ou qualquer dado pessoal do usuário. 3. COMO USAMOS OS DADOS - Prestação dos serviços contratados - Geração de relatórios para a empresa contratante - Suporte técnico e melhoria do sistema - Cumprimento de obrigações legais 4. COM QUEM COMPARTILHAMOS Não vendemos dados. Compartilhamos apenas com: - Provedores de hospedagem (VPS) mediante contrato de sigilo - Autoridades públicas quando exigido por lei 5. POR QUANTO TEMPO GUARDAMOS - Dados cadastrais: enquanto durar o contrato + 5 anos - Logs de acesso: 1 ano (Marco Civil art. 15) - Logs de aceite Diamond Track: 5 anos (prazo trabalhista) - Backups: 90 dias após exclusão 6. SEUS DIREITOS (LGPD art. 18) Titulares de dados têm direito a: ✓ Confirmar existência do tratamento ✓ Acessar seus dados ✓ Corrigir dados incorretos ✓ Solicitar anonimização ou exclusão ✓ Revogar consentimento ✓ Opor-se ao tratamento Para exercer esses direitos: privacidade@diamond.com.br 7. SEGURANÇA Adotamos: criptografia SSL/TLS, senhas com bcrypt, tokens JWT, firewall, backups diários e monitoramento. 8. ENCARREGADO (DPO) Nome: Weldo Santana Email: dpo@diamond.com.br 9. ALTERAÇÕES Esta política pode ser atualizada. Notificaremos por email com 30 dias de antecedência sobre mudanças relevantes. Última atualização: Maio de 2026` }, dpa: { title: 'DPA — Data Processing Agreement', sub: 'Acordo de Processamento de Dados entre Diamond e empresa cliente', filename: 'Diamond_DPA_Processamento_Dados.txt', body: `DATA PROCESSING AGREEMENT — DPA Acordo de Processamento de Dados Pessoais Diamond Informática (Operadora) ↔ Empresa Contratante (Controladora) ═══════════════════════════════════════════════════════ PARTES: OPERADORA: Diamond Informática & Sistemas Comerciais CONTROLADORA: [Nome da empresa contratante] — CNPJ: [CNPJ] 1. OBJETO Este DPA regula o tratamento de dados pessoais pela Diamond Informática (Operadora), por conta e ordem da Controladora, conforme LGPD art. 37, 38 e 39. 2. INSTRUÇÕES DE TRATAMENTO A Operadora tratará dados pessoais apenas: a) Para prestação dos serviços contratados b) Conforme instrução documentada da Controladora c) Nunca para finalidade própria ou de terceiros 3. CATEGORIAS DE DADOS - Dados cadastrais de funcionários (nome, email, cargo) - Dados de equipamentos corporativos - Logs de acesso e rastreio patrimonial - Registros de aceite do Diamond Track 4. MEDIDAS DE SEGURANÇA (LGPD art. 46) A Operadora implementa: ✓ Criptografia em trânsito (TLS 1.3) e em repouso (AES-256) ✓ Controle de acesso por perfil e autenticação JWT ✓ Logs de auditoria de toda operação com dados ✓ Backups criptografados diários com retenção de 90 dias ✓ Firewall, Fail2ban e monitoramento de intrusão ✓ Plano de resposta a incidentes documentado 5. SUBOPERADORES A Operadora poderá contratar suboperadores (ex: provedores de VPS) mediante contrato com obrigações equivalentes a este DPA. Suboperadores atuais: [Provedor VPS — a definir] 6. DIREITOS DOS TITULARES A Operadora assistirá a Controladora no atendimento a direitos dos titulares (LGPD art. 18) no prazo de 5 dias úteis. 7. NOTIFICAÇÃO DE INCIDENTES Incidentes serão notificados à Controladora em até 72 horas. A Controladora decidirá sobre notificação à ANPD. 8. EXCLUSÃO DE DADOS Ao término do contrato: - Controladora tem 30 dias para exportar dados - Após 30 dias, todos os dados são excluídos definitivamente - Confirmação de exclusão enviada por email com hash 9. AUDITORIA A Controladora poderá solicitar evidências de conformidade com antecedência mínima de 15 dias úteis. 10. VIGÊNCIA Este DPA vigora enquanto durar o contrato principal SaaS. Assinado eletronicamente via aceite nos Termos de Uso.` }, contrato_saas: { title: 'Contrato de Prestação de Serviços SaaS', sub: 'Contrato comercial completo entre Diamond e empresa cliente', filename: 'Diamond_Contrato_SaaS.txt', body: `CONTRATO DE PRESTAÇÃO DE SERVIÇOS — SaaS Diamond Informática & Sistemas Comerciais CNPJ: XX.XXX.XXX/0001-XX ═══════════════════════════════════════════════════════ CONTRATADA: Diamond Informática & Sistemas Comerciais CONTRATANTE: [Nome da empresa] — CNPJ: [CNPJ] PLANO CONTRATADO: [Básico / Profissional / Enterprise] VALOR MENSAL: R$ [valor] VENCIMENTO: Todo dia [dia] do mês DATA DE INÍCIO: [data] 1. DO OBJETO Prestação de serviços de software SaaS para gestão patrimonial e almoxarifado por meio do sistema Diamond Patrimônio & Almoxarifado. 2. DOS SERVIÇOS INCLUÍDOS ✓ Acesso ao sistema via navegador (sem instalação) ✓ Módulos conforme plano contratado ✓ Backup diário automático ✓ Suporte técnico por email/WhatsApp ✓ Atualizações incluídas sem custo adicional ✓ SSL/HTTPS incluído ✓ Diamond Track Agent para rastreio patrimonial 3. DOS LIMITES DO PLANO - Básico: até 5 usuários, 500 bens cadastrados - Profissional: até 15 usuários, 2.000 bens - Enterprise: usuários e bens ilimitados, multi-filial 4. DO PAGAMENTO 4.1 Pagamento via PIX ou boleto até o vencimento. 4.2 Atraso de 1-15 dias: notificação por email. 4.3 Atraso de 16-30 dias: suspensão automática do acesso. 4.4 Atraso superior a 30 dias: rescisão e exclusão de dados após aviso prévio de 10 dias. 4.5 Reativação após suspensão: pagamento do débito em atraso mais taxa de reativação de R$ 50,00. 5. DO SLA — DISPONIBILIDADE - Plano Básico: 99% uptime/mês - Plano Profissional: 99,5% uptime/mês - Plano Enterprise: 99,9% uptime/mês - Manutenções programadas notificadas com 48h de antecedência. 6. DO SUPORTE - Email: suporte@diamond.com.br (resposta em 24h úteis) - WhatsApp: [número] (horário comercial) - Enterprise: atendimento prioritário 7. DA RESCISÃO 7.1 Qualquer parte pode rescindir com aviso de 30 dias. 7.2 Não há multa por rescisão após 12 meses de contrato. 7.3 Rescisão antes de 12 meses: multa equivalente a 3 mensalidades. 8. DO FORO Comarca de Belém/PA. Assinado eletronicamente via aceite nos Termos de Uso do sistema.` }, politica_ti: { title: 'Política Interna de Uso de Tecnologia e TI', sub: 'Modelo para empresa cliente adaptar e entregar aos funcionários', filename: 'Modelo_Politica_Interna_TI.txt', body: `POLÍTICA INTERNA DE USO DE TECNOLOGIA DA INFORMAÇÃO [NOME DA EMPRESA] — CNPJ: [CNPJ] Versão 1.0 — [Data] ═══════════════════════════════════════════════════════ APROVADA POR: [Nome do Diretor/RH] APLICÁVEL A: Todos os colaboradores, terceiros e estagiários 1. OBJETIVO Estabelecer regras para uso adequado dos recursos tecnológicos da empresa, proteger o patrimônio tecnológico e garantir conformidade com a LGPD e CLT. 2. ABRANGÊNCIA Esta política aplica-se a todos os equipamentos de propriedade de [Nome da Empresa], incluindo: computadores, notebooks, tablets, celulares corporativos, impressoras e qualquer equipamento cedido. 3. DO MONITORAMENTO PATRIMONIAL 3.1 Todos os equipamentos da empresa estão sujeitos a monitoramento patrimonial por meio do Diamond Track Agent. 3.2 O monitoramento coleta: IP na rede corporativa, status de conexão e identificação do equipamento. 3.3 NÃO são monitorados: arquivos pessoais, histórico de navegação, comunicações pessoais ou quaisquer dados pessoais do colaborador. 3.4 O colaborador será informado e deverá aceitar os termos de monitoramento ao receber o equipamento. 3.5 Base legal: legítimo interesse para controle patrimonial (LGPD art. 7º, IX) e cláusula contratual de trabalho (inc. V). 4. USO ACEITÁVEL ✓ Atividades profissionais da empresa ✓ Uso pessoal ocasional e moderado (sem prejudicar trabalho) ✓ Comunicações profissionais 5. USO PROIBIDO ✗ Instalação de software não autorizado ✗ Acesso a conteúdo ilegal ou impróprio ✗ Download de arquivos de procedência duvidosa ✗ Compartilhar credenciais de acesso ✗ Usar equipamento da empresa para fins comerciais pessoais ✗ Remover ou danificar o agente de monitoramento 6. DAS PENALIDADES Violações podem resultar em: advertência verbal, advertência escrita, suspensão ou demissão por justa causa, conforme gravidade e reincidência — CLT art. 482. 7. DA DEVOLUÇÃO O colaborador deve devolver o equipamento em perfeito estado ao término do vínculo empregatício, sob pena de desconto em rescisão ou ação de ressarcimento. 8. VIGÊNCIA Esta política entra em vigor na data de assinatura. ___________________________ ___________________________ Colaborador RH / Gestor Data: ___/___/______` }, clausula_clt: { title: 'Cláusula para Contrato de Trabalho — Monitoramento', sub: 'Texto pronto para inserir no contrato de trabalho ou aditivo', filename: 'Modelo_Clausula_Contrato_Trabalho.txt', body: `CLÁUSULA ADICIONAL — CESSÃO E MONITORAMENTO DE EQUIPAMENTOS (Para inserir no Contrato de Trabalho ou como Aditivo) ═══════════════════════════════════════════════════════ CLÁUSULA __ª — DO USO E MONITORAMENTO DE EQUIPAMENTOS §1º O EMPREGADOR poderá ceder ao EMPREGADO equipamentos de sua propriedade (computadores, notebooks, tablets, celulares corporativos e outros) para uso exclusivamente profissional, nos termos da política interna de TI. §2º Os equipamentos cedidos permanecem sob propriedade do EMPREGADOR e estão sujeitos a monitoramento patrimonial por meio de software específico (Diamond Track Agent), o qual registra: endereço IP na rede corporativa, status de conexão à rede e identificação do equipamento. §3º O monitoramento tem por finalidade exclusiva o controle patrimonial do equipamento, fundamentado no legítimo interesse do EMPREGADOR (LGPD art. 7º, IX) e na relação contratual de trabalho (LGPD art. 7º, V; CLT art. 456-A). §4º Declara o EMPREGADO ter sido informado clara e previamente sobre o monitoramento, reconhecendo que o equipamento cedido é bem patrimonial da empresa e não é de uso pessoal. §5º O EMPREGADO se compromete a: (a) não remover, desativar ou interferir no agente de monitoramento; (b) comunicar imediatamente qualquer irregularidade no equipamento; (c) devolvê-lo em perfeito estado ao término do contrato. §6º O descumprimento das obrigações desta cláusula poderá ensejar demissão por justa causa, nos termos do art. 482 da Consolidação das Leis do Trabalho. ___________________________ ___________________________ Empregado — Assinatura Empregador — Assinatura CPF: CNPJ: Data: ___/___/______` }, termo_entrega: { title: 'Termo de Entrega e Responsabilidade de Equipamento', sub: 'Assinar ao entregar qualquer equipamento ao funcionário', filename: 'Modelo_Termo_Entrega_Equipamento.txt', body: `TERMO DE ENTREGA E RESPONSABILIDADE DE EQUIPAMENTO [NOME DA EMPRESA] — CNPJ: [CNPJ] ═══════════════════════════════════════════════════════ DADOS DO EQUIPAMENTO: Nome/Descrição: ________________________________________ Marca / Modelo: ________________________________________ Número de série: _______________________________________ Tombamento: ____________________________________________ Configuração: __________________________________________ Valor patrimonial: R$ __________________________________ Condição na entrega: ( ) Novo ( ) Bom ( ) Regular ACESSÓRIOS INCLUÍDOS: ( ) Carregador/Fonte ( ) Bag/Mochila ( ) Mouse ( ) Teclado ( ) Cabo HDMI ( ) Outros: _____ DADOS DO RESPONSÁVEL: Nome completo: _________________________________________ CPF: ___________________________________________________ Cargo: _________________________________________________ Filial/Cidade: _________________________________________ Data de entrega: ___/___/______ DECLARAÇÃO: Declaro ter recebido o equipamento descrito acima em perfeito estado de funcionamento e me comprometo a: 1. Usar exclusivamente para atividades profissionais; 2. Zelar pela conservação e segurança do equipamento; 3. Não instalar softwares não autorizados; 4. Comunicar imediatamente qualquer dano, perda ou furto; 5. Devolver em perfeito estado ao término do vínculo; 6. Aceitar o monitoramento patrimonial conforme política de TI; 7. Responder por danos causados por uso inadequado. Em caso de perda, furto ou dano por negligência, o valor será descontado conforme lei e acordo prévio. ___________________________ ___________________________ Colaborador — Assinatura Gestor / RH — Assinatura Data: ___/___/______` }, track_aceite: { title: 'Termo de Ciência de Monitoramento — Diamond Track', sub: 'Exibido na instalação do agente — aceite registrado com hash', filename: 'Diamond_Track_Termo_Ciencia.txt', body: `TERMO DE CIÊNCIA DE MONITORAMENTO DE EQUIPAMENTO Diamond Track Agent — Versão 1.0 ═══════════════════════════════════════════════════════ Este equipamento é de propriedade de [NOME DA EMPRESA] e está sendo cedido para uso exclusivamente profissional. 1. DO MONITORAMENTO O Diamond Track Agent será instalado e operará neste dispositivo para fins de controle patrimonial. O agente registra: ✓ Endereço IP na rede corporativa ✓ Status de conexão (online/offline) ✓ Identificador do equipamento (serial/tombamento) ✓ Data e hora dos registros NÃO são coletados: ✗ Arquivos ou documentos pessoais ✗ Histórico de navegação na internet ✗ Mensagens, emails ou comunicações pessoais ✗ Fotos, vídeos ou dados pessoais ✗ Localização GPS pessoal 2. BASE LEGAL — LGPD Este monitoramento está fundamentado em: • Legítimo interesse da empresa para controle patrimonial (LGPD art. 7º, inciso IX) • Execução de contrato de trabalho (LGPD art. 7º, inciso V) • Política interna de TI assinada pelo colaborador 3. SEUS DIREITOS (LGPD art. 18) Você tem direito a: • Confirmar a existência do monitoramento (já informado aqui) • Acessar os dados coletados sobre este equipamento • Solicitar correção de dados incorretos • Opor-se ao tratamento — neste caso, o equipamento deverá ser devolvido à empresa Para exercer esses direitos: [email do DPO da empresa] 4. RESPONSÁVEL PELO SOFTWARE Diamond Informática & Sistemas Comerciais CNPJ: XX.XXX.XXX/0001-XX — dpo@diamond.com.br Atua como OPERADORA conforme LGPD art. 5º, VII 5. REGISTRO DE ACEITE Ao aceitar este termo, serão registrados automaticamente: • Seu nome de usuário no sistema • Data e hora exata do aceite • Endereço IP do equipamento • Número de série do equipamento • Hash SHA-256 deste aceite (prova criptográfica) Este registro é armazenado por 5 anos conforme prazo trabalhista e poderá ser apresentado em caso de disputa. [ ] Li e compreendi o Termo de Ciência de Monitoramento [ ] Estou ciente que este equipamento pertence à empresa e será monitorado para fins patrimoniais [RECUSAR] [ACEITAR E CONTINUAR]` }, retencao_dados: { title: 'Política de Retenção de Dados — Diamond Track', sub: 'LGPD art. 15-16 — por quanto tempo e como os dados são guardados', filename: 'Diamond_Track_Politica_Retencao.txt', body: `POLÍTICA DE RETENÇÃO E DESCARTE DE DADOS Diamond Track Agent — Diamond Informática ═══════════════════════════════════════════════════════ 1. DADOS COLETADOS E PRAZOS DE RETENÇÃO | Tipo de dado | Prazo | Fundamento | |---------------------------|-------------|-------------------| | Log de aceite do termo | 5 anos | Prazo trabalhista | | IP e status do equipamento| 12 meses | Marco Civil art.15| | Identificação do bem | Contrato +5a| Código Civil | | Logs de acesso ao sistema | 12 meses | Marco Civil art.15| | Registros patrimoniais | 5 anos | Legislação fiscal | 2. APÓS O TÉRMINO DO CONTRATO 2.1 A empresa tem 30 dias para exportar seus dados. 2.2 Após 30 dias, todos os dados são excluídos definitivamente. 2.3 Diamond Informática emite confirmação de exclusão com hash criptográfico como prova de descarte. 3. APÓS TÉRMINO DO VÍNCULO DO FUNCIONÁRIO 3.1 Dados do funcionário são anonimizados no sistema. 3.2 Logs de aceite do Diamond Track permanecem por 5 anos para fins de defesa em eventuais ações trabalhistas. 3.3 Demais dados vinculados ao funcionário são excluídos. 4. COMO OS DADOS SÃO PROTEGIDOS • Armazenados em servidor com criptografia AES-256 • Acesso restrito ao administrador da empresa • Backups criptografados com retenção de 90 dias • Transferência apenas via HTTPS/TLS 1.3 5. DIREITO AO ESQUECIMENTO (LGPD art. 18, IV) O titular pode solicitar exclusão antecipada dos dados, exceto quando necessários para: • Cumprimento de obrigação legal ou regulatória • Exercício regular de direitos em processo judicial • Defesa em ações trabalhistas Solicitações: privacidade@diamond.com.br Prazo de resposta: 15 dias úteis` }, solicitacao_lgpd: { title: 'Formulário de Solicitação de Direitos LGPD (art. 18)', sub: 'Para titulares de dados solicitarem acesso, correção ou exclusão', filename: 'Formulario_Solicitacao_LGPD.txt', body: `FORMULÁRIO DE SOLICITAÇÃO DE DIREITOS DO TITULAR Lei Geral de Proteção de Dados — LGPD art. 18 ═══════════════════════════════════════════════════════ ENVIAR PARA: privacidade@[empresa].com.br PRAZO DE RESPOSTA: 15 dias úteis (LGPD art. 19) DADOS DO SOLICITANTE: Nome completo: _________________________________________ CPF: ___________________________________________________ Email para resposta: ____________________________________ Vínculo com a empresa: ( ) Funcionário ativo ( ) Ex-funcionário ( ) Prestador ( ) Outro: ___________ TIPO DE SOLICITAÇÃO (marque uma ou mais): ( ) Confirmar existência de tratamento dos meus dados ( ) Acessar cópia dos meus dados coletados ( ) Corrigir dados incompletos ou incorretos ( ) Anonimizar, bloquear ou eliminar dados desnecessários ( ) Portabilidade — receber dados em formato estruturado ( ) Revogar consentimento dado anteriormente ( ) Informação sobre compartilhamento de dados ( ) Oposição ao tratamento DESCRIÇÃO DA SOLICITAÇÃO: _______________________________________________________ _______________________________________________________ _______________________________________________________ DOCUMENTAÇÃO ANEXADA: ( ) Documento de identidade (RG ou CNH) ( ) Comprovante de vínculo com a empresa ( ) Outros: ____________________________________________ PARA USO INTERNO — CONTROLE DA EMPRESA: Data de recebimento: ___/___/______ Protocolo: #______________ Responsável pelo atendimento: __________________________ Data de resposta: ___/___/______ Ação tomada: ___________________________________________ ___________________________ Assinatura do solicitante Data: ___/___/______` }, aviso_adesivo: { title: 'Aviso de Monitoramento — Adesivo / Tela de Boot', sub: 'Texto curto para equipamento físico ou tela de inicialização', filename: 'Aviso_Monitoramento_Adesivo.txt', body: `═══════════════════════════════════════════════════════ TEXTOS PRONTOS PARA AVISO DE MONITORAMENTO ═══════════════════════════════════════════════════════ OPÇÃO 1 — ADESIVO PEQUENO (para notebook/monitor): ┌─────────────────────────────────────┐ │ ⚠ EQUIPAMENTO MONITORADO │ │ Propriedade de [EMPRESA] │ │ Uso exclusivamente profissional │ │ Diamond Track Ativo │ └─────────────────────────────────────┘ OPÇÃO 2 — TELA DE BOOT / LOGIN (Windows / Linux): "ATENÇÃO: Este equipamento é propriedade de [NOME DA EMPRESA] e está sujeito a monitoramento patrimonial conforme política interna de TI e LGPD. Uso exclusivamente profissional. Em caso de dúvidas: ti@empresa.com.br" OPÇÃO 3 — MENSAGEM DE BOAS-VINDAS DO SISTEMA: "Bem-vindo, [usuário]. Este é um equipamento corporativo de [EMPRESA]. O Diamond Track Agent está ativo para controle patrimonial conforme você foi informado e aceitou nos termos de uso. Bom trabalho!" OPÇÃO 4 — EMAIL PARA NOVO FUNCIONÁRIO: Assunto: Equipamento corporativo e política de TI Prezado(a) [Nome], Você está recebendo o equipamento [descrição], tombamento [código]. Este equipamento possui o Diamond Track Agent instalado para controle patrimonial. Você receberá uma tela de aceite no primeiro uso. Leia atentamente antes de aceitar. Política de TI em anexo. [Assinatura RH/TI]` } }; // ── DOCS FUNCTIONS ──────────────────────────────────────────────────── function filterDocs(cat){ document.querySelectorAll('.doc-card').forEach(el=>{ el.style.display=(cat==='all'||el.dataset.cat===cat)?'flex':'none'; }); } function previewDoc(key){ const d=DOCS_CONTENT[key]; if(!d)return; document.getElementById('doc-preview-title').textContent=d.title; document.getElementById('doc-preview-sub').textContent=d.sub; document.getElementById('doc-preview-content').textContent=d.body; const btn=document.getElementById('doc-dl-btn'); btn.onclick=()=>downloadDoc(key,d.filename); document.getElementById('mo-doc').classList.add('open'); } function downloadDoc(key,filename){ const d=DOCS_CONTENT[key]; if(!d)return; const blob=new Blob([d.body],{type:'text/plain;charset=utf-8'}); const url=URL.createObjectURL(blob); const a=document.createElement('a');a.href=url;a.download=filename||key+'.txt'; document.body.appendChild(a);a.click();document.body.removeChild(a); URL.revokeObjectURL(url); showToast('Documento baixado: '+filename,'success'); } document.addEventListener('click',function(e){ if(e.target===document.getElementById('mo-doc')) document.getElementById('mo-doc').classList.remove('open'); }); // ── ANEXOS DATA + FUNCTIONS ─────────────────────────────────────────── const ANX_DATA=[ {id:1,name:'Foto_frontal_Notebook_Dell_XPS.jpg',tipo:'foto',cat:'bem',tomb:'GXT-BEL-NBK-2026-000154',size:'2,4 MB',data:'05/05/2026',mime:'image',color:'#2563EB',icon:'🖼️', url:'data:image/svg+xml;utf8,💻Notebook Dell XPS 15'}, {id:2,name:'Foto_lateral_Notebook_Dell_XPS.jpg',tipo:'foto',cat:'bem',tomb:'GXT-BEL-NBK-2026-000154',size:'1,8 MB',data:'05/05/2026',mime:'image',color:'#2563EB',icon:'🖼️', url:'data:image/svg+xml;utf8,💻Lateral — Dell XPS 15'}, {id:3,name:'NF_004521_Staples_Brasil.xml',tipo:'nf',cat:'nf',tomb:'EST-0001',size:'48 KB',data:'07/05/2026',mime:'xml',color:'#16A34A',icon:'📄'}, {id:4,name:'NF_004521_DANFE.pdf',tipo:'nf',cat:'nf',tomb:'EST-0001',size:'124 KB',data:'07/05/2026',mime:'pdf',color:'#DC2626',icon:'📋'}, {id:5,name:'Laudo_tecnico_Nobreak_APC.pdf',tipo:'laudo',cat:'manutencao',tomb:'GXT-MAN-TI-2025-000043',size:'312 KB',data:'02/04/2026',mime:'pdf',color:'#D97706',icon:'🔧'}, {id:6,name:'Foto_Switch_Cisco_rack.jpg',tipo:'foto',cat:'bem',tomb:'GXT-BEL-NET-2025-000089',size:'3,1 MB',data:'10/03/2026',mime:'image',color:'#16A34A',icon:'🖼️', url:'data:image/svg+xml;utf8,🔀Switch Cisco 24p'}, {id:7,name:'Comprovante_pagamento_HP.pdf',tipo:'comprovante',cat:'nf',tomb:'EST-0002',size:'88 KB',data:'01/04/2026',mime:'pdf',color:'#7C3AED',icon:'💳'}, {id:8,name:'Foto_plaqueta_tombamento.jpg',tipo:'foto',cat:'bem',tomb:'GXT-MAC-TAB-2026-000012',size:'0,9 MB',data:'08/05/2026',mime:'image',color:'#C9A84C',icon:'🖼️', url:'data:image/svg+xml;utf8,🏷️GXT-MAC-TAB-2026-000012Plaqueta tombamento'}, ]; let filteredAnx=[...ANX_DATA]; function renderAnexos(){ const grid=document.getElementById('anx-grid'); if(!grid)return; grid.innerHTML=filteredAnx.map(a=>`
${a.mime==='image'&&a.url ?''+a.name+'' :'
'+a.icon+'
' }
${a.name}
${a.size} · ${a.data}
${a.tomb}
`).join(''); } function filterAnexos(){ const tipo=document.getElementById('anx-filter-tipo').value; const cat=document.getElementById('anx-filter-cat').value; const q=(document.getElementById('anx-search').value||'').toLowerCase(); filteredAnx=ANX_DATA.filter(a=> (!tipo||a.tipo===tipo)&& (!cat||a.cat===cat)&& (!q||a.name.toLowerCase().includes(q)||a.tomb.toLowerCase().includes(q)) ); renderAnexos(); } function openLB(id){ const a=ANX_DATA.find(x=>x.id===id); if(!a||!a.url)return; document.getElementById('lb-img').src=a.url; document.getElementById('lb-info').textContent=a.name+' · '+a.tomb+' · '+a.size; document.getElementById('lb').classList.add('open'); } function closeLB(){document.getElementById('lb').classList.remove('open');} function downloadAnx(id){ const a=ANX_DATA.find(x=>x.id===id); if(!a)return; if(a.url){ const link=document.createElement('a');link.href=a.url;link.download=a.name; document.body.appendChild(link);link.click();document.body.removeChild(link); showToast('Baixando: '+a.name,'success'); }else{ showToast(a.name+' — download disponível na VPS','info'); } } function deleteAnx(id){ const idx=ANX_DATA.findIndex(x=>x.id===id); if(idx>=0){ANX_DATA.splice(idx,1);filterAnexos();showToast('Arquivo removido','warn',2000);} } function handleUpload(inp){ if(!inp.files.length)return; Array.from(inp.files).forEach((file,i)=>{ setTimeout(()=>{ const id=Date.now()+i; const isImg=file.type.startsWith('image/'); const newFile={ id,name:file.name,tipo:isImg?'foto':'outro',cat:'bem', tomb:'—',size:(file.size/1024).toFixed(0)+' KB', data:new Date().toLocaleDateString('pt-BR'), mime:isImg?'image':'doc',color:'#6B7280',icon:'📎' }; if(isImg){ const r=new FileReader(); r.onload=e=>{newFile.url=e.target.result;ANX_DATA.unshift(newFile);filterAnexos();}; r.readAsDataURL(file); }else{ ANX_DATA.unshift(newFile);filterAnexos(); } showToast('Arquivo adicionado: '+file.name,'success',2500); },i*200); }); inp.value=''; } function handleDrop(ev){ ev.preventDefault(); document.getElementById('upload-zone').classList.remove('drag'); const dt=ev.dataTransfer; if(dt.files.length){ const inp={files:dt.files}; handleUpload(inp); } } // Init anexos page function initAnexosPage(){renderAnexos();} // ── MOBILE MENU ────────────────────────────────────────────────── function toggleMobMenu(){ var sb=document.getElementById('sidebar'); var ov=document.getElementById('mob-overlay'); var fab=document.getElementById('mob-fab'); if(!sb)return; var open=sb.classList.contains('mob-open'); if(open){ sb.classList.remove('mob-open'); sb.style.cssText='display:none !important;width:0 !important;height:0 !important;position:absolute !important;left:-9999px !important;overflow:hidden !important'; if(ov)ov.classList.remove('active'); if(fab){fab.textContent='\u2630';fab.style.background='var(--gold)';} }else{ sb.classList.add('mob-open'); sb.style.cssText='display:flex !important;flex-direction:column !important;position:fixed !important;top:0 !important;left:0 !important;width:260px !important;height:100vh !important;z-index:500 !important;overflow-y:auto !important;overflow-x:hidden !important;padding:8px 0 !important;box-shadow:4px 0 32px rgba(0,0,0,.55) !important;background:var(--sidebar) !important'; if(ov)ov.classList.add('active'); if(fab){fab.textContent='\u00d7';fab.style.background='#DC2626';} } } function closeMobMenu(){ var sb=document.getElementById('sidebar'); var ov=document.getElementById('mob-overlay'); var fab=document.getElementById('mob-fab'); if(sb){ sb.classList.remove('mob-open'); if(window.innerWidth<=600){ setTimeout(function(){ if(window._fixMobileSidebar) window._fixMobileSidebar(); }, 10); } } if(ov)ov.classList.remove('active'); if(fab){fab.textContent='\u2630';fab.style.background='var(--gold)';} } // Close on nav click on mobile (function(){ document.querySelectorAll('.ni').forEach(function(el){ el.addEventListener('click',function(){ if(window.innerWidth<=600)closeMobMenu(); }); }); })(); // ── MOBILE SIDEBAR INIT ────────────────────────────────────────── (function(){ function fixMobileSidebar(){ var sb = document.getElementById('sidebar'); if(!sb) return; if(window.innerWidth <= 600){ // Force hide with inline style - beats all CSS specificity sb.setAttribute('style', 'display:none !important;' + 'visibility:hidden !important;' + 'width:0 !important;' + 'height:0 !important;' + 'min-height:0 !important;' + 'max-height:0 !important;' + 'min-width:0 !important;' + 'max-width:0 !important;' + 'overflow:hidden !important;' + 'padding:0 !important;' + 'margin:0 !important;' + 'border:none !important;' + 'position:fixed !important;' + 'top:-9999px !important;' + 'left:-9999px !important;' + 'opacity:0 !important;' + 'pointer-events:none !important;' + 'flex:none !important;' + 'flex-shrink:0 !important;' ); } else if(!sb.classList.contains('mob-open')) { sb.removeAttribute('style'); } } // Run immediately (sync - before paint) fixMobileSidebar(); // Run after DOM ready if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', fixMobileSidebar); } // Run after everything loads window.addEventListener('load', fixMobileSidebar); // Run on resize window.addEventListener('resize', function(){ var sb = document.getElementById('sidebar'); if(!sb) return; if(window.innerWidth > 600){ // Restore sidebar on desktop if(!sb.classList.contains('sb-collapsed')){ sb.removeAttribute('style'); } } else if(!sb.classList.contains('mob-open')) { fixMobileSidebar(); } }); // Expose for closeMobMenu window._fixMobileSidebar = fixMobileSidebar; })(); // ── CONFIG PAGE ────────────────────────────────────────────────────── var _cfgTab = 'aparencia'; function cfgTab(name){ document.querySelectorAll('.cfg-tab').forEach(function(t){t.classList.remove('active');}); document.querySelectorAll('.cfg-sec').forEach(function(s){s.style.display='none';s.classList.remove('active');}); var btn = document.getElementById('ctab-'+name); var sec = document.getElementById('csec-'+name); if(btn) btn.classList.add('active'); if(sec){sec.style.display='block';sec.classList.add('active');} _cfgTab = name; if(name === 'usuarios') renderCfgUsers(); if(name === 'aparencia') renderPermMatrix(); } // ── LOGO UPLOAD ─────────────────────────────────────────────────────── function handleLogoFile(inp){ if(!inp.files||!inp.files[0])return; readLogoFile(inp.files[0]); } function handleLogoDrop(e){ e.preventDefault(); document.getElementById('logo-drop').classList.remove('drag'); var f = e.dataTransfer.files[0]; if(f && f.type.startsWith('image/')) readLogoFile(f); } function readLogoFile(file){ var r = new FileReader(); r.onload = function(e){ var src = e.target.result; document.getElementById('logo-preview-img').src = src; document.getElementById('logo-preview-wrap').style.display = 'block'; document.getElementById('logo-drop-placeholder').style.display = 'none'; document.getElementById('logo-preview-name').textContent = file.name + ' · ' + (file.size/1024).toFixed(0) + ' KB'; // Topbar preview var timg = document.getElementById('topbar-logo-img'); timg.src = src; timg.style.display = 'block'; document.getElementById('topbar-logo-text').style.display = 'none'; // Actually apply to real topbar applyLogoToTopbar(src); showToast('Logo carregada! Clique em "Salvar logo".','gold'); }; r.readAsDataURL(file); } function applyLogoToTopbar(src){ // Find brand div in real topbar and add/update logo img var brand = document.querySelector('.brand'); if(!brand) return; var existing = document.getElementById('brand-logo-img'); if(existing){ existing.src = src; } else { var img = document.createElement('img'); img.id = 'brand-logo-img'; img.src = src; img.style.cssText = 'height:32px;max-width:100px;object-fit:contain;border-radius:4px'; img.alt = 'Logo'; brand.insertBefore(img, brand.firstChild); } } function removeLogo(){ document.getElementById('logo-preview-wrap').style.display = 'none'; document.getElementById('logo-drop-placeholder').style.display = 'block'; document.getElementById('topbar-logo-img').style.display = 'none'; document.getElementById('topbar-logo-text').style.display = ''; var existing = document.getElementById('brand-logo-img'); if(existing) existing.remove(); showToast('Logo removida','info',2000); } function saveLogo(){ showToast('Logo salva e aplicada ao sistema!','success'); } // ── COLOR THEME ─────────────────────────────────────────────────────── function applyColor(varName, value){ var map = {gold:'--gold', sidebar:'--sidebar', bg:'--bg'}; document.documentElement.style.setProperty(map[varName]||'--'+varName, value); var swatch = document.getElementById('swatch-'+varName); var code = document.getElementById('code-'+varName); if(swatch) swatch.style.background = value; if(code) code.textContent = value; // Also update sidebar2/3 derived from sidebar if(varName==='sidebar'){ document.getElementById('pick-sidebar').value = value; } } function saveAppearance(){ showToast('Identidade visual salva e aplicada!','success'); } function applyTheme(name){ var themes = { diamond:{gold:'#C9A84C',sidebar:'#1C1C1E',bg:'#F2F0EC'}, dark:{gold:'#C9A84C',sidebar:'#0D0D0F',bg:'#111113'}, corporate:{gold:'#1565C0',sidebar:'#1565C0',bg:'#F0F4FF'}, verde:{gold:'#43A047',sidebar:'#1B5E20',bg:'#F1F8F1'}, }; var t = themes[name]||themes.diamond; Object.keys(t).forEach(function(k){ applyColor(k, t[k]); }); showToast('Tema '+name+' aplicado!','gold',2000); } // ── EMPRESA ─────────────────────────────────────────────────────────── function saveEmpresa(){ var nome = document.getElementById('emp-fantasia').value || document.getElementById('emp-razao').value; // Update topbar company name if element exists var tn = document.querySelector('.tcn'); if(tn && nome) tn.textContent = nome; showToast('Dados da empresa salvos com sucesso!','success'); } function saveTombamento(){ var prefix = document.getElementById('tomb-prefix').value; var city = document.getElementById('tomb-city').value; var next = document.getElementById('tomb-next').value; var preview = document.getElementById('tomb-preview'); if(preview) preview.textContent = prefix+'-'+city+'-TI-2026-'+String(next).padStart(6,'0'); showToast('Configuração de tombamento salva!','success'); } // Live preview for tombamento document.addEventListener('input', function(e){ if(['tomb-prefix','tomb-city','tomb-next'].includes(e.target.id)){ var prefix = (document.getElementById('tomb-prefix')||{value:'GXT'}).value; var city = (document.getElementById('tomb-city')||{value:'BEL'}).value; var next = (document.getElementById('tomb-next')||{value:'1248'}).value; var preview = document.getElementById('tomb-preview'); if(preview) preview.textContent = prefix+'-'+city+'-TI-2026-'+String(next).padStart(6,'0'); } }); // ── SMTP ────────────────────────────────────────────────────────────── function testSMTP(){ showToast('Email de teste enviado para o gestor!','info'); } function saveSMTP(){ showToast('SMTP configurado e salvo!','success'); } // ── PASSWORD ───────────────────────────────────────────────────────── function changePassword(){ var a = document.getElementById('pass-atual').value; var n = document.getElementById('pass-nova').value; var c = document.getElementById('pass-conf').value; if(!a||!n){showToast('Preencha todos os campos','error');return;} if(n!==c){showToast('As senhas não conferem','error');return;} if(n.length<10){showToast('Senha deve ter mínimo 10 caracteres','warn');return;} showToast('Senha alterada com sucesso!','success'); document.getElementById('pass-atual').value=''; document.getElementById('pass-nova').value=''; document.getElementById('pass-conf').value=''; } // ── USERS IN CONFIG ─────────────────────────────────────────────────── var CFG_USERS = [ {id:1,nome:'Weldo Santana',email:'weldo@diamond.com.br',cargo:'Proprietário Diamond',perfil:'master',cidade:'Belém',ativo:true,cor:'#C9A84C'}, {id:2,nome:'João Silva',email:'joao@grupox.com.br',cargo:'Almoxarife Sênior',perfil:'admin',cidade:'Belém',ativo:true,cor:'#1565C0'}, {id:3,nome:'Maria Costa',email:'maria@grupox.com.br',cargo:'Técnica de Rede',perfil:'operador',cidade:'Santarém',ativo:true,cor:'#28A745'}, {id:4,nome:'Carlos Mendes',email:'carlos@grupox.com.br',cargo:'Técnico de Campo',perfil:'operador',cidade:'Macapá',ativo:true,cor:'#E65100'}, {id:5,nome:'Ana Ferreira',email:'ana@grupox.com.br',cargo:'Assistente Admin',perfil:'operador',cidade:'Manaus',ativo:true,cor:'#6A1B9A'}, {id:6,nome:'Pedro Lima',email:'pedro@grupox.com.br',cargo:'Supervisor TI',perfil:'admin',cidade:'Belém',ativo:true,cor:'#0277BD'}, {id:7,nome:'Luiza Santos',email:'luiza@grupox.com.br',cargo:'Estagiária',perfil:'leitura',cidade:'Belém',ativo:false,cor:'#757575'}, {id:8,nome:'Rafael Nunes',email:'rafael@grupox.com.br',cargo:'Contador',perfil:'leitura',cidade:'Belém',ativo:true,cor:'#AD1457'}, ]; var PERFL = {master:'badge-master',admin:'badge-admin',operador:'badge-op',leitura:'badge-view'}; var PERFN = {master:'★ Master',admin:'Admin',operador:'Operador',leitura:'Leitura'}; function renderCfgUsers(){ var el = document.getElementById('cfg-users-list'); if(!el) return; el.innerHTML = CFG_USERS.map(function(u){ var ini = u.nome.split(' ').map(function(n){return n[0];}).slice(0,2).join(''); return '
' +'
'+ini+'
' +'
' +'
'+u.nome+(u.ativo?'':' Inativo')+'
' +'
'+u.email+' · '+u.cidade+'
' +'
' +''+PERFN[u.perfil]+'' +'
' +'' +(u.perfil!=='master'?'':'') +'
' +'
'; }).join(''); } function toggleCfgUser(id){ var u=CFG_USERS.find(function(x){return x.id===id;}); if(u&&u.perfil!=='master'){u.ativo=!u.ativo;renderCfgUsers();showToast(u.nome+' '+(u.ativo?'ativado':'bloqueado')+'!',u.ativo?'success':'warn');} } // ── PERMISSIONS MATRIX ──────────────────────────────────────────────── var PERM_DATA = [ ['Dashboard',true,true,true,true], ['Cadastrar / editar bens',true,true,true,false], ['Movimentações',true,true,true,false], ['Auditoria',true,true,false,false], ['Estoque (visualizar)',true,true,true,true], ['Entradas NF/XML',true,true,true,false], ['Requisições (criar)',true,true,true,false], ['Requisições (aprovar)',true,true,false,false], ['Cautelas (emitir)',true,true,true,false], ['Exportar PDF/Excel',true,true,true,false], ['Relatórios',true,true,true,true], ['Usuários e permissões',true,false,false,false], ['Configurações da empresa',true,true,false,false], ['Painel Master SaaS',true,false,false,false], ]; function renderPermMatrix(){ var tb = document.getElementById('perm-matrix'); if(!tb) return; tb.innerHTML = PERM_DATA.map(function(row){ var mod = row[0]; var cols = [ '', ''+(row[2]?'':'')+'', ''+(row[3]?'':'')+'', ''+(row[4]?'':'')+'', ]; return ''+mod+''+cols.join('')+''; }).join(''); } // ── MODAL: NOVO USUARIO ─────────────────────────────────────────────── MODS['novoUsuario'] = '
Novo usuário
Defina acesso, perfil e senha
' +'
' +'
Nome completo *
' +'
E-mail / login *
' +'
Senha inicial *
' +'
Confirmar senha
' +'
Perfil de acesso *
' +'
Cidade / filial
' +'
Cargo / função
' +'
' +'
'; MODS['addFilial'] = '
Nova filial / cidade
Adicione uma unidade da empresa
' +'
' +'
Cidade *
' +'
Estado *
' +'
Código (tombamento)
' +'
Tipo
' +'
' +'
'; // ═══════════════════════════════════════════════════════════════ // PAINEL MASTER SAAS // ═══════════════════════════════════════════════════════════════ var EMPRESAS = [ {id:1,nome:'Grupo X Telecom',short:'GX',emoji:'📡',plano:'enterprise',valor:1800,usuarios:24,bens:1247,status:'ativo',venc:'15/06/2026',email:'admin@grupox.com.br',cnpj:'12.345.678/0001-90',cidade:'Belém — PA',cor:'#1565C0',adminNome:'João Silva',adminEmail:'joao@grupox.com.br',criado:'01/01/2026'}, {id:2,nome:'TechNorte Sistemas',short:'TN',emoji:'💻',plano:'profissional',valor:900,usuarios:8,bens:342,status:'ativo',venc:'20/06/2026',email:'contato@technorte.com.br',cnpj:'98.765.432/0001-10',cidade:'Manaus — AM',cor:'#28A745',adminNome:'Ana Lima',adminEmail:'ana@technorte.com.br',criado:'15/02/2026'}, {id:3,nome:'Agro Pará Ltda',short:'AP',emoji:'🌾',plano:'basico',valor:500,usuarios:5,bens:89,status:'ativo',venc:'10/06/2026',email:'ti@agropara.com.br',cnpj:'11.222.333/0001-44',cidade:'Santarém — PA',cor:'#E65100',adminNome:'Carlos Souza',adminEmail:'carlos@agropara.com.br',criado:'10/03/2026'}, {id:4,nome:'Construtora Maragogi',short:'CM',emoji:'🏗️',plano:'profissional',valor:900,usuarios:10,bens:0,status:'bloqueado',venc:'01/05/2026',email:'financeiro@maragogi.com.br',cnpj:'55.666.777/0001-88',cidade:'Belém — PA',cor:'#D32F2F',adminNome:'Pedro Alves',adminEmail:'pedro@maragogi.com.br',criado:'20/11/2025'}, {id:5,nome:'LogSul Transportes',short:'LS',emoji:'🚛',plano:'basico',valor:500,usuarios:3,bens:45,status:'trial',venc:'25/06/2026',email:'ti@logsul.com.br',cnpj:'33.444.555/0001-66',cidade:'Marabá — PA',cor:'#6A1B9A',adminNome:'Márcia Ferreira',adminEmail:'marcia@logsul.com.br',criado:'11/05/2026'}, ]; var _empFilter = {q:'', status:'', plano:''}; function go_master(){ renderMasterStats(); renderEmpresas(); } function renderMasterStats(){ var ativas = EMPRESAS.filter(function(e){return e.status==='ativo';}).length; var bloq = EMPRESAS.filter(function(e){return e.status==='bloqueado';}).length; var users = EMPRESAS.reduce(function(s,e){return s+e.usuarios;},0); var bens = EMPRESAS.reduce(function(s,e){return s+e.bens;},0); var mrr = EMPRESAS.filter(function(e){return e.status==='ativo'||e.status==='trial';}).reduce(function(s,e){return s+e.valor;},0); var el=function(id,v){var e=document.getElementById(id);if(e)e.textContent=v;}; el('m-ativas',ativas); el('m-bloq',bloq); el('m-users',users); el('m-bens',bens.toLocaleString('pt-BR')); el('m-mrr','R$'+mrr.toLocaleString('pt-BR')); } function renderEmpresas(){ var grid = document.getElementById('master-grid'); if(!grid) return; var list = EMPRESAS.filter(function(e){ var q = _empFilter.q.toLowerCase(); var matchQ = !q || e.nome.toLowerCase().includes(q) || e.cnpj.includes(q) || e.email.toLowerCase().includes(q); var matchS = !_empFilter.status || e.status===_empFilter.status; var matchP = !_empFilter.plano || e.plano===_empFilter.plano; return matchQ && matchS && matchP; }); var planBadge = {basico:'Básico',profissional:'Pro',enterprise:'Enterprise'}; var stBadge = {ativo:'● Ativo',bloqueado:'🔒 Bloqueado',trial:'⏱ Trial'}; grid.innerHTML = list.map(function(e){ var mrr = 'R$'+e.valor.toLocaleString('pt-BR')+'/mês'; return '
' +'
' +'' +'
' +'
'+e.nome+'
' +'
'+planBadge[e.plano]+stBadge[e.status]+''+mrr+'
' +'
'+e.cidade+' · CNPJ: '+e.cnpj+'
' +'
' +'
' +'
' +'
Admin: '+e.adminNome+' · '+e.adminEmail+'
' +'
Criado: '+e.criado+' · Vence: '+e.venc+'
' +'
' +'
' +'
'+e.usuarios+'
Usuários
' +'
'+e.bens.toLocaleString('pt-BR')+'
Bens
' +'
'+e.venc+'
Vencimento
' +'
' +'
' +'' +'' +'' +(e.status==='ativo'||e.status==='trial' ?'' :'') +'
' +'
'; }).join(''); if(list.length===0){ grid.innerHTML='
🔍
Nenhuma empresa encontrada
'; } } function filterEmpresas(q){ _empFilter.q=q; renderEmpresas(); } function filterEmpresaStatus(s){ _empFilter.status=s; renderEmpresas(); } function filterEmpresaPlano(p){ _empFilter.plano=p; renderEmpresas(); } function acessarEmpresa(id){ var e=EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; if(e.status==='bloqueado'){showToast(e.nome+' está bloqueada. Desbloqueie primeiro.','error');return;} showToast('Acessando painel de '+e.nome+'...','gold'); } function editarEmpresa(id){ var e=EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; openModal('editEmpresa_'+id); } function verUsuariosEmpresa(id){ var e=EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; MODS['usersEmpresa_'+id] = '
👥 Usuários — '+e.nome+'
' +'
Admin principal: '+e.adminNome+' · Total: '+e.usuarios+' usuários
' +'
' +'
Usuário administrador principal
' +'
' +'
'+e.adminNome.split(' ').map(function(n){return n[0];}).slice(0,2).join('')+'
' +'
'+e.adminNome+'
'+e.adminEmail+'
' +'Admin' +'
' +'
' +'
+ mais '+(e.usuarios-1)+' usuários gerenciados pela própria empresa
' +'
' +'
'; openModal('usersEmpresa_'+id); } function bloquearEmpresa(id){ var e=EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; MODS['confirmaBloquear_'+id]='
🔒 Bloquear acesso?
' +'
'+e.nome+'
' +'
' +'⚠️ O acesso será suspenso imediatamente. Todos os usuários serão deslogados. Os dados são mantidos.
' +'
' +'
'; openModal('confirmaBloquear_'+id); } function _confirmBloquear(id){ var e=EMPRESAS.find(function(x){return x.id===id;}); if(e){e.status='bloqueado';renderEmpresas();renderMasterStats();showToast(e.nome+' bloqueada. E-mail enviado.','warn');} } function desbloquearEmpresa(id){ var e=EMPRESAS.find(function(x){return x.id===id;}); if(e){e.status='ativo';renderEmpresas();renderMasterStats();showToast(e.nome+' desbloqueada!','success');} } // Patch go() to init master page var _origGo = go; go = function(pg){ _origGo(pg); if(pg==='master') go_master(); }; // ── MODAL: NOVA EMPRESA ──────────────────────────────────────────────── MODS['novaEmpresa'] = '
+ Nova empresa cliente
' +'
Cadastre um novo cliente no SaaS Diamond. O usuário admin receberá as credenciais por e-mail.
' +'
' +'
Razão social / Nome da empresa *
' +'
CNPJ
' +'
Cidade — Estado
' +'
Plano *
' +'
Dia de vencimento
' +'
👤 Usuário administrador principal
' +'
Nome completo *
' +'
E-mail (será o login) *
' +'
Telefone / WhatsApp
' +'
Trial gratuito
' +'
' +'
' +'✅ Ao cadastrar: o sistema cria automaticamente o acesso, gera uma senha inicial segura e envia as credenciais por e-mail para o admin da empresa.
' +'
' +'
'; function cadastrarNovaEmpresa(){ var nome = document.getElementById('new-emp-nome').value.trim(); var email = document.getElementById('new-adm-email').value.trim(); var admNome = document.getElementById('new-adm-nome').value.trim(); var plano = document.getElementById('new-emp-plano').value; if(!nome||!email||!admNome){showToast('Preencha: nome da empresa, admin e email','error');return;} var valores = {basico:500,profissional:900,enterprise:1800}; var short = nome.split(' ').map(function(w){return w[0];}).join('').toUpperCase().slice(0,2); var emojis = ['🏢','🏭','🚀','💼','⚙️','🌟']; var novo = { id: Date.now(), nome: nome, short: short, emoji: emojis[EMPRESAS.length % emojis.length], plano: plano, valor: valores[plano], usuarios: 1, bens: 0, status: document.getElementById('new-emp-trial').value>'0' ? 'trial' : 'ativo', venc: document.getElementById('new-emp-venc').value+'/'+('0'+(new Date().getMonth()+2)).slice(-2)+'/2026', email: email, cnpj: document.getElementById('new-emp-cnpj').value, cidade: document.getElementById('new-emp-cidade').value||'—', cor: ['#1565C0','#28A745','#E65100','#6A1B9A','#0277BD'][EMPRESAS.length % 5], adminNome: admNome, adminEmail: email, criado: new Date().toLocaleDateString('pt-BR'), }; EMPRESAS.push(novo); closeModal(); renderEmpresas(); renderMasterStats(); showToast('✅ '+nome+' cadastrada! E-mail com credenciais enviado para '+email,'success',5000); } // ── MODAL: EDITAR EMPRESA ───────────────────────────────────────────── EMPRESAS.forEach(function(e){ MODS['editEmpresa_'+e.id] = '
✏️ Editar — '+e.nome+'
CNPJ: '+e.cnpj+'
' +'
' +'
Nome da empresa
' +'
Plano
' +'
Status
' +'
Dia de vencimento
' +'
E-mail da empresa
' +'
Admin principal — nome
' +'
Admin principal — e-mail / login
' +'
' +'
'; MODS['addUserEmpresa_'+e.id] = '
+ Usuário para '+e.nome+'
O usuário receberá as credenciais por e-mail
' +'
' +'
Nome completo *
' +'
E-mail / login *
' +'
Perfil
' +'
Cargo
' +'
' +'
'; }); MODS['masterRelatorio'] = '
📊 Relatório geral SaaS
Visão consolidada de todas as empresas
' +'
' +'
'+EMPRESAS.filter(function(e){return e.status==="ativo";}).length+'
ATIVAS
' +'
R$'+EMPRESAS.reduce(function(s,e){return s+(e.status==="ativo"?e.valor:0);},0).toLocaleString("pt-BR")+'
MRR
' +'
' +'
'; // ══════════════════════════════════════════════════════════════════ // EDITOR DE APARÊNCIA TOTAL — aba Aparência aprimorada // ══════════════════════════════════════════════════════════════════ function initAppearanceEditor(){ // Sync color pickers with current CSS vars var root = getComputedStyle(document.documentElement); var vars = {gold:'--gold',sidebar:'--sidebar',bg:'--bg'}; Object.keys(vars).forEach(function(k){ var val = root.getPropertyValue(vars[k]).trim(); var pick = document.getElementById('pick-'+k); var swatch = document.getElementById('swatch-'+k); var code = document.getElementById('code-'+k); if(pick && val) pick.value = val.length===7?val:'#C9A84C'; if(swatch && val) swatch.style.background = val; if(code && val) code.textContent = val; }); } // Patch cfgTab to init editor on aparencia tab var _origCfgTab = cfgTab; cfgTab = function(name){ _origCfgTab(name); if(name === 'aparencia') setTimeout(initAppearanceEditor, 50); }; // Realtime system name editor function updateSysName(val){ // Update brand name in topbar var bn = document.querySelector('.bn'); if(bn && val){ var parts = val.split(' '); if(parts.length >= 2){ bn.innerHTML = ''+parts[0]+' '+parts.slice(1).join(' '); } else { bn.innerHTML = ''+val+''; } } var bs = document.querySelector('.bs2'); var sub = document.getElementById('sys-sub-inp'); if(bs && sub) bs.textContent = sub.value || '& Almoxarifado'; } function updateSysSub(val){ var bs = document.querySelector('.bs2'); if(bs) bs.textContent = val || '& Almoxarifado'; } function applyFontSize(val){ document.body.style.fontSize = val+'px'; var el = document.getElementById('fs-val'); if(el) el.textContent = val+'px'; } function applyRadius(val){ ['--r4','--r6','--r8','--r10','--r12','--r14','--r16'].forEach(function(r,i){ document.documentElement.style.setProperty(r, Math.max(0,parseInt(r.replace('--r','')) * val / 100)+'px'); }); var el = document.getElementById('radius-val'); if(el) el.textContent = val+'%'; } function applyColorAdv(varName, value, swatchId){ document.documentElement.style.setProperty(varName, value); var sw = document.getElementById(swatchId); if(sw) sw.style.background = value; } function applyTopbarColor(val){ var tb = document.querySelector('.topbar'); if(tb) tb.style.background = val; var sw = document.getElementById('sw-topbar'); if(sw) sw.style.background = val; } function applyFont(font, btn){ document.documentElement.style.setProperty('--fn', "'"+font+"', system-ui, sans-serif"); document.body.style.fontFamily = "'"+font+"', system-ui, sans-serif"; document.querySelectorAll('.font-opt').forEach(function(b){ b.classList.remove('sel'); }); if(btn) btn.classList.add('sel'); showToast('Fonte '+font+' aplicada!','gold',2000); } // ══════════════════════════════════════════════════════ // PAINEL MASTER SaaS // ══════════════════════════════════════════════════════ var MST_EMPRESAS = [ {id:1, nome:'Grupo X Telecom', fantasia:'Grupo X', cnpj:'12.345.678/0001-90', plano:'enterprise', status:'ativo', venc:'15/06/2026', valor:1800, usuarios:24, bens:1247, admin_nome:'João Silva', admin_email:'joao@grupox.com.br', cor:'#1565C0', emoji:'📡', criado:'01/01/2026'}, {id:2, nome:'TechNorte Sistemas Ltda', fantasia:'TechNorte', cnpj:'23.456.789/0001-01', plano:'profissional', status:'ativo', venc:'20/06/2026', valor:900, usuarios:8, bens:342, admin_nome:'Ana Souza', admin_email:'ana@technorte.com.br', cor:'#28A745', emoji:'💻', criado:'15/02/2026'}, {id:3, nome:'Agro Pará Ltda', fantasia:'AgroPará', cnpj:'34.567.890/0001-02', plano:'basico', status:'ativo', venc:'10/06/2026', valor:500, usuarios:5, bens:89, admin_nome:'Carlos Rocha', admin_email:'carlos@agropara.com.br', cor:'#E65100', emoji:'🌾', criado:'01/03/2026'}, {id:4, nome:'Construtora Maragogi S.A.', fantasia:'C. Maragogi', cnpj:'45.678.901/0001-03', plano:'profissional', status:'bloqueado', venc:'01/05/2026', valor:900, usuarios:10, bens:0, admin_nome:'Roberto Melo', admin_email:'roberto@maragogi.com.br', cor:'#D32F2F', emoji:'🏗️', criado:'01/11/2025'}, ]; function renderMstEmpresas(list) { var g = document.getElementById('mst-empresas-grid'); if(!g) return; if(!list) list = MST_EMPRESAS; // Update stats var ativas = list.filter(function(e){return e.status==='ativo';}).length; var bloq = list.filter(function(e){return e.status==='bloqueado';}).length; var totalU = list.reduce(function(a,e){return a+e.usuarios;},0); var totalB = list.reduce(function(a,e){return a+e.bens;},0); var mrr = list.filter(function(e){return e.status==='ativo';}).reduce(function(a,e){return a+e.valor;},0); if(document.getElementById('mst-ativas')) document.getElementById('mst-ativas').textContent=ativas; if(document.getElementById('mst-bloq')) document.getElementById('mst-bloq').textContent=bloq; if(document.getElementById('mst-users')) document.getElementById('mst-users').textContent=totalU; if(document.getElementById('mst-bens')) document.getElementById('mst-bens').textContent=totalB.toLocaleString('pt-BR'); if(document.getElementById('mst-mrr')) document.getElementById('mst-mrr').textContent='R$'+mrr.toLocaleString('pt-BR'); g.innerHTML = list.map(function(e) { var statusPill = e.status==='ativo' ? '● Ativa' : e.status==='trial' ? '◑ Trial' : '🔒 Bloqueada'; var planoLbl = {basico:'Básico',profissional:'Profissional',enterprise:'Enterprise'}[e.plano]||e.plano; return '
' +'
' +'
'+e.emoji+'
' +'
' +'
'+e.fantasia||e.nome+'
' +'
'+planoLbl+' · R$'+e.valor.toLocaleString('pt-BR')+'/mês
' +'
' +statusPill +'
' +'
' +'
'+e.usuarios+'
Usuários
' +'
'+e.bens.toLocaleString('pt-BR')+'
Bens
' +'
'+e.venc+'
Vencimento
' +'
' +'
' +'' +(e.status==='ativo' ? '' : '') +'' +'
' +'
'; }).join(''); } function filterEmpresas() { var q = (document.getElementById('mst-search')||{value:''}).value.toLowerCase(); var st = (document.getElementById('mst-filter')||{value:''}).value; var pl = (document.getElementById('mst-plano-filter')||{value:''}).value; var filtered = MST_EMPRESAS.filter(function(e){ return (!q || e.nome.toLowerCase().includes(q) || e.fantasia.toLowerCase().includes(q) || e.cnpj.includes(q)) && (!st || e.status===st) && (!pl || e.plano===pl); }); renderMstEmpresas(filtered); } function bloquearEmpresa(id) { var e=MST_EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; e.status='bloqueado'; renderMstEmpresas(); showToast(e.fantasia+' bloqueada — acesso suspenso','warn'); } function desbloquearEmpresa(id) { var e=MST_EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; e.status='ativo'; renderMstEmpresas(); showToast(e.fantasia+' desbloqueada com sucesso!','success'); } function acessarEmpresa(id) { var e=MST_EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; showToast('Acessando painel de '+e.fantasia+'...','info'); } function exportMasterReport(){ showToast('Gerando relatório geral...','gold'); } function openEmpresaDetail(id) { var e = MST_EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; var planos = ['basico','profissional','enterprise']; var planoLbls = {'basico':'Básico — R$500/mês','profissional':'Profissional — R$900/mês','enterprise':'Enterprise — R$1.800/mês'}; var mc = document.getElementById('mc-emp-detail'); if(!mc)return; mc.innerHTML = '
' +'
'+e.emoji+'
' +'
'+e.nome+'
' +'
'+e.cnpj+' · desde '+e.criado+'
' +'
'+(e.status==='ativo'?'Ativa':e.status==='trial'?'Trial':'Bloqueada')+'
' +'
' // Tabs +'
' +'' +'' +'' +'
' +'
' +'
' +'
Razão social
' +'
Nome fantasia
' +'
CNPJ
' +'
Vencimento
' +'
' +'
' +'' +'' +'
' +'' +'' +'
'; document.getElementById('mo-emp-detail').classList.add('op'); } function detTab(name, id) { ['dados','plano','admin'].forEach(function(t){ var btn=document.getElementById('det-tab-'+t); var sec=document.getElementById('det-sec-'+t); if(btn) btn.classList.toggle('active', t===name); if(sec) sec.style.display = t===name ? 'block' : 'none'; }); } function closeMstDetail(){ var mo = document.getElementById('mo-emp-detail'); if(mo) mo.classList.remove('op'); } function saveEmpresaDetail(id){ var e=MST_EMPRESAS.find(function(x){return x.id===id;}); if(!e)return; var nomeEl=document.getElementById('det-nome-'+id); var fantEl=document.getElementById('det-fantasia-'+id); var planoEl=document.getElementById('det-plano-'+id); var statusEl=document.getElementById('det-status-'+id); var adminNEl=document.getElementById('det-admin-nome-'+id); var adminEEl=document.getElementById('det-admin-email-'+id); if(nomeEl) e.nome=nomeEl.value; if(fantEl) e.fantasia=fantEl.value; if(planoEl) e.plano=planoEl.value; if(statusEl) e.status=statusEl.value; if(adminNEl) e.admin_nome=adminNEl.value; if(adminEEl) e.admin_email=adminEEl.value; renderMstEmpresas(); closeMstDetail(); showToast('Empresa atualizada com sucesso!','success'); } // Init master page var _mstInited = false; function initMaster(){ if(!_mstInited){ renderMstEmpresas(); _mstInited=true; } } // Nova empresa modal MODS['novaEmpresa'] = '
Nova empresa cliente
Cadastre e crie o acesso do administrador
' +'
' +'
Razão social *
' +'
Nome fantasia
' +'
CNPJ
' +'
Plano
' +'
Vencimento (dia)
' +'
Trial gratuito
' +'
' +'
' +'
👤 Usuário administrador (acesso principal)
' +'
' +'
Nome do administrador *
' +'
E-mail de login *
' +'
Senha inicial *
' +'
Confirmar senha
' +'
' +'
' +'📧 Ao cadastrar, o sistema enviará automaticamente o login e senha para o e-mail do administrador.' +'
' +'
' +'
' +'' +'' +'
'; function salvarNovaEmpresa(){ var nome=document.getElementById('ne-nome').value; var fantasia=document.getElementById('ne-fantasia').value||nome; var cnpj=document.getElementById('ne-cnpj').value; var plano=document.getElementById('ne-plano').value; var adminNome=document.getElementById('ne-admin-nome').value; var adminEmail=document.getElementById('ne-admin-email').value; var pass=document.getElementById('ne-admin-pass').value; var pass2=document.getElementById('ne-admin-pass2').value; if(!nome||!adminNome||!adminEmail||!pass){showToast('Preencha todos os campos obrigatórios','error');return;} if(pass!==pass2){showToast('As senhas não conferem','error');return;} if(pass.length<10){showToast('Senha mínimo 10 caracteres','warn');return;} var cores=['#1565C0','#28A745','#E65100','#6A1B9A','#0277BD','#AD1457','#00695C']; var emojis=['🏢','💼','🏭','🌐','🔧','📦','🏗️','🌾','💊','🎓']; var newEmp={ id:Date.now(), nome:nome, fantasia:fantasia, cnpj:cnpj||'—', plano:plano, status:'ativo', venc:'15/07/2026', valor:{basico:500,profissional:900,enterprise:1800}[plano]||500, usuarios:1, bens:0, admin_nome:adminNome, admin_email:adminEmail, cor:cores[MST_EMPRESAS.length%cores.length], emoji:emojis[MST_EMPRESAS.length%emojis.length], criado:new Date().toLocaleDateString('pt-BR') }; MST_EMPRESAS.push(newEmp); renderMstEmpresas(); closeModal(); showToast('Empresa "'+fantasia+'" cadastrada! Acesso enviado para '+adminEmail,'success',5000); } // ══════════════════════════════════════════════════════ // APPEARANCE FULL CONTROL // ══════════════════════════════════════════════════════ var COLOR_VARS = { gold: {css:'--gold', sw:'swatch-gold', cd:'code-gold', pk:'pick-gold'}, sidebar:{css:'--sidebar',sw:'swatch-sidebar',cd:'code-sidebar',pk:'pick-sidebar'}, bg: {css:'--bg', sw:'swatch-bg', cd:'code-bg', pk:'pick-bg'}, card: {css:'--card', sw:'swatch-card', cd:'code-card', pk:'pick-card'}, text: {css:'--text', sw:'swatch-text', cd:'code-text', pk:'pick-text'}, border: {css:'--border', sw:'swatch-border', cd:'code-border', pk:'pick-border'}, }; function applyColor(varName, value){ var v = COLOR_VARS[varName]; if(!v) return; document.documentElement.style.setProperty(v.css, value); var sw=document.getElementById(v.sw); if(sw) sw.style.background=value; var cd=document.getElementById(v.cd); if(cd) cd.textContent=value; var pk=document.getElementById(v.pk); if(pk) pk.value=value; // Sync preview syncPreview(); } function syncPreview(){ var style = getComputedStyle(document.documentElement); var get = function(v){return style.getPropertyValue(v).trim();}; var ps = document.getElementById('prev-sidebar'); if(ps) ps.style.background=get('--sidebar'); var pc = document.getElementById('prev-content'); if(pc) pc.style.background=get('--bg'); var pt = document.getElementById('prev-topbar'); if(pt) pt.style.background=get('--card'); var pk = document.getElementById('prev-card1'); if(pk){pk.style.background=get('--card');pk.style.borderColor=get('--border');} var pb = document.getElementById('prev-btn1'); if(pb) pb.style.background=get('--gold'); var pai= document.getElementById('prev-active-ni'); if(pai){pai.style.background=get('--gold')+'33';} var pbn= document.getElementById('prev-brand-text');if(pbn) pbn.style.color=get('--text'); var pn2= document.getElementById('prev-nome2'); if(pn2) pn2.style.color=get('--gold'); // footer var pft= document.getElementById('prev-footer-txt'); if(pft) pft.textContent='Powered by '+(document.getElementById('sys-footer')||{value:'Diamond Informática'}).value; } var DEFAULT_COLORS = { gold:'#C9A84C', sidebar:'#1C1C1E', bg:'#F2F0EC', card:'#FFFFFF', text:'#1C1C1E', border:'#E4E0D8' }; function resetColors(){ Object.keys(DEFAULT_COLORS).forEach(function(k){ applyColor(k, DEFAULT_COLORS[k]); }); showToast('Cores resetadas para o padrão Diamond','gold',2000); } function saveAppearance(){ showToast('Identidade visual salva e aplicada!','success'); } var THEMES_FULL = { diamond: {gold:'#C9A84C',sidebar:'#1C1C1E',bg:'#F2F0EC',card:'#FFFFFF',text:'#1C1C1E',border:'#E4E0D8'}, dark: {gold:'#C9A84C',sidebar:'#0D0D0F',bg:'#111113',card:'#1C1C1F',text:'#F0F0F0',border:'#2A2A2E'}, corporate:{gold:'#1565C0',sidebar:'#1565C0',bg:'#F0F4FF',card:'#FFFFFF',text:'#1A237E',border:'#C5D8F5'}, verde: {gold:'#43A047',sidebar:'#1B5E20',bg:'#F1F8F1',card:'#FFFFFF',text:'#1B5E20',border:'#C8E6C9'}, roxo: {gold:'#9C27B0',sidebar:'#4A148C',bg:'#F8F0FF',card:'#FFFFFF',text:'#2E0854',border:'#E1BEE7'}, vermelho: {gold:'#E53935',sidebar:'#B71C1C',bg:'#FFF5F5',card:'#FFFFFF',text:'#B71C1C',border:'#FFCDD2'}, }; function applyTheme(name){ var t = THEMES_FULL[name]||THEMES_FULL.diamond; Object.keys(t).forEach(function(k){ applyColor(k, t[k]); }); showToast('Tema "'+name+'" aplicado!','gold',2000); } function applyFont(val){ document.documentElement.style.setProperty('--fn', val); var fp=document.getElementById('font-preview-title'); var fb=document.getElementById('font-preview-body'); if(fp) fp.style.fontFamily=val; if(fb) fb.style.fontFamily=val; } function applyFontSize(val){ document.body.style.fontSize = val+'px'; var fv=document.getElementById('font-size-val'); if(fv) fv.textContent=val+'px'; } function saveSysName(){ var nome=document.getElementById('sys-nome').value||'Diamond Patrimônio'; var sub=document.getElementById('sys-sub').value||'& Almoxarifado'; var footer=document.getElementById('sys-footer').value; // Apply to real topbar var bnMain=document.querySelector('.brand-main'); var bnSub=document.querySelector('.brand-sub'); if(bnMain) bnMain.textContent=nome; if(bnSub) bnSub.textContent=sub; // Update page title document.title=nome; // Update preview var pn=document.getElementById('prev-nome'); if(pn) pn.textContent=nome.split(' ')[0]||nome; var pn2=document.getElementById('prev-nome2'); if(pn2) pn2.textContent=nome.split(' ').slice(1).join(' ')||''; // Update footer var wlb=document.querySelector('.wlb .wlt em'); if(wlb && footer) wlb.textContent=footer; syncPreview(); showToast('Nome e identidade aplicados!','success'); } // Patch go() to init master var _origGo = window.go || function(){}; window.go = function(pg){ _origGo(pg); if(pg==='master') initMaster(); }; // Init color swatches on load (function(){ function initSwatches(){ var style = getComputedStyle(document.documentElement); var vars = {gold:'--gold',sidebar:'--sidebar',bg:'--bg',card:'--card',text:'--text',border:'--border'}; Object.keys(vars).forEach(function(k){ var val = style.getPropertyValue(vars[k]).trim(); var sw = document.getElementById('swatch-'+k); var cd = document.getElementById('code-'+k); var pk = document.getElementById('pick-'+k); if(sw) sw.style.background = val; if(cd) cd.textContent = val; if(pk) pk.value = val.length===7 ? val : '#C9A84C'; }); } window.addEventListener('load', initSwatches); })(); // ── MISSING MODALS ──────────────────────────────────────────────────── MODS['req'] = '
Nova requisição de saída
Solicite item do almoxarifado — passa por aprovação
' +'
' +'
Item solicitado *
' +'
Quantidade *
' +'
Urgência
' +'
Justificativa
' +'
' +'
'; MODS['cau'] = '
Emitir cautela de ferramenta
Registre o empréstimo de equipamento ou ferramenta
' +'
' +'
Bem / ferramenta *
' +'
Colaborador responsável *
' +'
Data de saída
' +'
Data de devolução *
' +'
Finalidade / observações
' +'
' +'
'; MODS['mov'] = '
Nova movimentação
Transferência, empréstimo, manutenção ou baixa
' +'
' +'
Bem *
' +'
Tipo de movimentação *
' +'
Origem
' +'
Destino / setor
' +'
Responsável
' +'
Data
' +'
Motivo / observações
' +'
' +'
'; MODS['resp'] = '
Cadastrar responsável
Defina quem responde por bens e setores
' +'
' +'
Nome completo *
' +'
Cargo
' +'
Departamento
' +'
Cidade / filial
' +'
E-mail
' +'
Telefone
' +'
' +'
'; MODS['forn'] = '
Cadastrar fornecedor
Empresa fornecedora de materiais e equipamentos
' +'
' +'
Razão social *
' +'
Nome fantasia
' +'
CNPJ
' +'
Categoria
' +'
E-mail de contato
' +'
Telefone
' +'
Prazo de entrega (dias)
' +'
' +'
'; MODS['loc'] = '
Nova localização
Cadastre um endereçamento do almoxarifado
' +'
' +'
Corredor
' +'
Prateleira
' +'
Gaveta / posição
' +'
Filial
' +'
Descrição
' +'
' +'
Código gerado: A1-P1-G1
' +'
'; MODS['camp'] = '
Nova campanha de auditoria
Inicie uma contagem de inventário
' +'
' +'
Nome da campanha *
' +'
Filial / cidade
' +'
Tipo
' +'
Data início
' +'
Data fim
' +'
Responsável pela auditoria
' +'
' +'
'; MODS['shortcuts'] = '
Atalhos de teclado
Navegue mais rápido no sistema
' +'
' +[['D','Dashboard'],['B','Bens'],['E','Estoque'],['N','Entradas NF'], ['R','Requisições'],['C','Cautelas'],['A','Auditoria'],['L','Lembretes'], ['M','Master SaaS'],['Ctrl+K','Busca global'],['Esc','Fechar painel'],['?','Atalhos'] ].map(function(item){ return '
' +''+item[1]+'' +''+item[0]+'' +'
'; }).join('') +'
' +'
'; // ── LEMBRETES ───────────────────────────────────────────────────────── var LEMBRETES = [ {id:1,titulo:'Auditoria semestral Belém',desc:'Conferir todos os bens TI',prioridade:'alta',venc:'15/05/2026',concluido:false}, {id:2,titulo:'Renovar contrato Grupo X',desc:'Plano Enterprise vence em junho',prioridade:'urgente',venc:'01/06/2026',concluido:false}, {id:3,titulo:'Calibrar multímetros',desc:'Laboratório de medição',prioridade:'normal',venc:'20/05/2026',concluido:false}, {id:4,titulo:'Solicitar toners HP',desc:'Estoque crítico',prioridade:'urgente',venc:'11/05/2026',concluido:false}, {id:5,titulo:'Treinamento almoxarife Manaus',desc:'Sistema novo',prioridade:'normal',venc:'30/05/2026',concluido:false}, ]; function renderLembretes(){ var el=document.getElementById('lemb-list'); if(!el)return; var ativos=LEMBRETES.filter(function(l){return !l.concluido;}); var prClr={urgente:['var(--red-l)','var(--red-b)'],alta:['var(--amber-l)','var(--amber-b)'],normal:['var(--bg2)','var(--text3)']}; el.innerHTML=ativos.map(function(l){ var c=prClr[l.prioridade]||prClr.normal; return '
' +'
' +'
' +'
'+l.titulo+'
' +'
'+l.desc+'
' +'
' +'
' +''+l.prioridade.toUpperCase()+'' +''+l.venc+'' +'
' +'' +'
'; }).join('')||'
Nenhum lembrete ativo
'; if(document.getElementById('lemb-total')) document.getElementById('lemb-total').textContent=ativos.length; } function concluirLembrete(id){ var l=LEMBRETES.find(function(x){return x.id===id;}); if(l){l.concluido=true;renderLembretes();showToast('Lembrete concluído!','success',2000);} } function addLembrete(){ openModal('lembrete'); } MODS['lembrete'] = '
Novo lembrete
Adicione uma tarefa ou alerta
' +'
' +'
Título *
' +'
Prioridade
' +'
Vencimento
' +'
Observações
' +'
' +'
' +'
'; // ── SCAN DE REDE ────────────────────────────────────────────────────── var NET_DEVS = [ {nome:'Switch Cisco SG350',ip:'192.168.1.1',mac:'00:1A:2B:3C:4D:5E',tipo:'Switch',icon:'🔀',st:'online',lat:'1ms',tomb:'GXT-BEL-NET-2025-000089'}, {nome:'Servidor Dell R340',ip:'192.168.1.10',mac:'00:2B:3C:4D:5E:6F',tipo:'Servidor',icon:'🖥️',st:'online',lat:'2ms',tomb:'GXT-BEL-SRV-2024-000012'}, {nome:'Notebook João Silva',ip:'192.168.1.42',mac:'A0:B1:C2:D3:E4:F5',tipo:'Notebook',icon:'💻',st:'online',lat:'4ms',tomb:'GXT-BEL-NBK-2026-000154'}, {nome:'Impressora HP M428',ip:'192.168.1.50',mac:'B1:C2:D3:E4:F5:A0',tipo:'Impressora',icon:'🖨️',st:'online',lat:'8ms',tomb:'GXT-BEL-IMP-2023-000033'}, {nome:'AP Ubiquiti UAP-AC',ip:'192.168.1.3',mac:'C2:D3:E4:F5:A0:B1',tipo:'AP Wi-Fi',icon:'📡',st:'online',lat:'3ms',tomb:'—'}, {nome:'Nobreak APC 1500VA',ip:'192.168.1.55',mac:'—',tipo:'Nobreak',icon:'🔋',st:'unknown',lat:'—',tomb:'GXT-MAN-TI-2025-000043'}, {nome:'Câmera AXIS P3245',ip:'192.168.1.70',mac:'D3:E4:F5:A0:B1:C2',tipo:'Câmera IP',icon:'📷',st:'online',lat:'6ms',tomb:'GXT-BEL-CAM-2022-000007'}, {nome:'Tablet Samsung A8',ip:'—',mac:'E4:F5:A0:B1:C2:D3',tipo:'Tablet',icon:'📱',st:'offline',lat:'—',tomb:'GXT-MAC-TAB-2026-000012'}, ]; var _scanRunning = false; function startScan(){ if(_scanRunning) return; _scanRunning = true; var prog = document.getElementById('scan-prog'); var fill = document.getElementById('scan-fill'); var lbl = document.getElementById('scan-lbl'); var pct = document.getElementById('scan-pct'); if(prog) prog.style.display = 'block'; var grid = document.getElementById('net-grid'); if(grid) grid.innerHTML = '
Escaneando rede...
'; var p = 0; var iv = setInterval(function(){ p += Math.random()*8+5; if(p>100) p=100; if(fill) fill.style.width=p+'%'; if(pct) pct.textContent=Math.round(p)+'%'; if(lbl) lbl.textContent='Verificando '+Math.round(p/2)+' IPs...'; if(p>=100){ clearInterval(iv); setTimeout(function(){ _scanRunning=false; if(prog) prog.style.display='none'; renderNetDevs(); var on=NET_DEVS.filter(function(d){return d.st==='online';}).length; var off=NET_DEVS.filter(function(d){return d.st==='offline';}).length; var unk=NET_DEVS.filter(function(d){return d.st==='unknown';}).length; if(document.getElementById('scan-online')) document.getElementById('scan-online').textContent=on; if(document.getElementById('scan-offline')) document.getElementById('scan-offline').textContent=off; if(document.getElementById('scan-unknown')) document.getElementById('scan-unknown').textContent=unk; if(document.getElementById('scan-last')) document.getElementById('scan-last').textContent=new Date().toLocaleTimeString('pt-BR',{hour:'2-digit',minute:'2-digit'}); showToast('Scan concluído — '+NET_DEVS.length+' dispositivos encontrados','success'); },300); } },100); } function renderNetDevs(){ var grid=document.getElementById('net-grid'); if(!grid)return; var stClr={online:'var(--green)',offline:'var(--red)',unknown:'var(--amber)'}; var stBg ={online:'var(--green-l)',offline:'var(--red-l)',unknown:'var(--amber-l)'}; var stTxt={online:'Online',offline:'Offline',unknown:'Sem resposta'}; grid.innerHTML=NET_DEVS.map(function(d){ return '
' +'
'+d.icon+'
' +'
' +'
'+d.nome+'
' +'
'+d.ip+(d.lat!=='—'?' · '+d.lat:'')+'
' +'
'+stTxt[d.st]+'
' +'
' +(d.tomb&&d.tomb!=='—'?'
'+d.tomb.split('-').slice(0,3).join('-')+'
':'') +'
'; }).join(''); } function showNetDetail(el, ds){ var d = JSON.parse(ds); var dp=document.getElementById('dp'); var dpc=document.getElementById('dp-c'); if(!dp||!dpc)return; var stClr={online:'var(--green)',offline:'var(--red)',unknown:'var(--amber)'}; dpc.innerHTML='
'+d.icon+'
' +'
'+d.nome+'
' +''+d.st.charAt(0).toUpperCase()+d.st.slice(1)+'' +'
' +[['IP',d.ip||'—'],['MAC',d.mac],['Tipo',d.tipo],['Latência',d.lat],['Tombamento',d.tomb||'—']].map(function(r){ return '
' +''+r[0]+'' +''+r[1]+'' +'
'; }).join('') +'
' +'
' +'' +'' +'
'; dp.classList.add('op'); } // Keyboard shortcut for '?' document.addEventListener('keydown', function(e){ if(['INPUT','TEXTAREA','SELECT'].includes(e.target.tagName)) return; if(e.key==='?') openModal('shortcuts'); if(e.key==='l'||e.key==='L') go('lemb'); }); // ══════════════════════════════════════════════════════════════════════ // MASTER SAAS PANEL + APARÊNCIA COMPLETA // ══════════════════════════════════════════════════════════════════════ var EMPRESAS_DB=[ {id:1,nome:'Grupo X Telecom',fantasia:'Grupo X',cnpj:'12.345.678/0001-90',plano:'enterprise',status:'ativo',valor:1800,vencDia:15,usuarios:24,bens:1247,cor:'#1565C0',emoji:'📡',adminNome:'João Silva',adminEmail:'admin@grupox.com.br',cidade:'Belém — PA'}, {id:2,nome:'TechNorte Sistemas',fantasia:'TechNorte',cnpj:'98.765.432/0001-10',plano:'profissional',status:'ativo',valor:900,vencDia:20,usuarios:8,bens:342,cor:'#28A745',emoji:'💻',adminNome:'Ana Silveira',adminEmail:'admin@technorte.com.br',cidade:'Manaus — AM'}, {id:3,nome:'Agro Pará Ltda',fantasia:'AgroPará',cnpj:'11.222.333/0001-44',plano:'basico',status:'ativo',valor:500,vencDia:10,usuarios:5,bens:89,cor:'#E65100',emoji:'🌾',adminNome:'Roberto Campos',adminEmail:'admin@agropara.com.br',cidade:'Santarém — PA'}, {id:4,nome:'Construtora Maragogi',fantasia:'Maragogi',cnpj:'44.555.666/0001-77',plano:'profissional',status:'bloqueado',valor:900,vencDia:1,usuarios:10,bens:0,cor:'#D32F2F',emoji:'🏗️',adminNome:'Sérgio Maragogi',adminEmail:'admin@maragogi.com.br',cidade:'Belém — PA'}, {id:5,nome:'Saúde Norte Clínicas',fantasia:'SaúdeNorte',cnpj:'77.888.999/0001-11',plano:'enterprise',status:'trial',valor:0,vencDia:25,usuarios:3,bens:45,cor:'#00838F',emoji:'🏥',adminNome:'Dra. Carla Lima',adminEmail:'admin@saudenorte.com.br',cidade:'Macapá — AP'}, ]; var PLANOS_DEF=[ {nome:'Básico',key:'basico',valor:500,color:'#8E8E93',features:['5 usuários','500 bens','Suporte email']}, {nome:'Profissional',key:'profissional',valor:900,color:'#1565C0',features:['15 usuários','2.000 bens','Suporte prioritário','5 filiais']}, {nome:'Enterprise',key:'enterprise',valor:1800,color:'#C9A84C',features:['Ilimitado','White-label','API','Suporte 24/7']}, ]; function masterTab(n){ ['empresas','financeiro','sistema'].forEach(function(t){ document.getElementById('msec-'+t).style.display=t===n?'block':'none'; var b=document.getElementById('mtab-'+t); if(b)b.classList.toggle('active',t===n); }); if(n==='financeiro')renderFinanceiro(); if(n==='sistema')renderPlanos(); } function initMaster(){ var a=EMPRESAS_DB.filter(function(e){return e.status==='ativo';}).length; var b=EMPRESAS_DB.filter(function(e){return e.status==='bloqueado';}).length; var u=EMPRESAS_DB.reduce(function(s,e){return s+e.usuarios;},0); var bens=EMPRESAS_DB.reduce(function(s,e){return s+e.bens;},0); var mrr=EMPRESAS_DB.filter(function(e){return e.status!=='bloqueado';}).reduce(function(s,e){return s+e.valor;},0); var el=function(id,v){var e=document.getElementById(id);if(e)e.textContent=v;}; el('ms-ativas',a);el('ms-bloq',b);el('ms-users',u); el('ms-bens',bens.toLocaleString('pt-BR')); el('ms-mrr','R$ '+mrr.toLocaleString('pt-BR')); renderEmpresas(); } function renderEmpresas(){ var grid=document.getElementById('master-empresas-grid'); var cnt=document.getElementById('master-count'); if(!grid)return; var q=((document.getElementById('master-search')||{}).value||'').toLowerCase(); var fs=((document.getElementById('master-filter')||{}).value||''); var fp=((document.getElementById('master-plano')||{}).value||''); var list=EMPRESAS_DB.filter(function(e){ return(!q||e.nome.toLowerCase().includes(q)||e.cnpj.includes(q)) &&(!fs||e.status===fs)&&(!fp||e.plano===fp); }); if(cnt)cnt.textContent=list.length+' empresa'+(list.length!==1?'s':''); var ST={ativo:'● Ativa', bloqueado:'🔒 Bloqueada', trial:'⏳ Trial'}; var PL={basico:'Básico',profissional:'Profissional',enterprise:'⭐ Enterprise'}; grid.innerHTML=list.map(function(e){ return '
' +'
' +'
' +'
'+e.emoji+'
' +'
'+e.fantasia+'
'+e.cnpj+'
' +ST[e.status] +'
' +'
' +'
' +'
' +'
'+e.usuarios+'
Usuários
' +'
'+e.bens.toLocaleString('pt-BR')+'
Bens
' +'
'+(e.valor>0?'R$'+e.valor.toLocaleString('pt-BR'):'Trial')+'
Mensalidade
' +'
' +'
'+PL[e.plano]+' · Admin: '+e.adminNome+' · vence dia '+e.vencDia+'
' +'
' +'' +'' +'' +(e.status!=='bloqueado' ?'' :'') +'
' +'
' +'
'; }).join(''); } function bloquearEmpresa(id){var e=EMPRESAS_DB.find(function(x){return x.id===id;});if(e){e.status='bloqueado';renderEmpresas();initMaster();showToast(e.fantasia+' bloqueada!','warn');}} function desbloquearEmpresa(id){var e=EMPRESAS_DB.find(function(x){return x.id===id;});if(e){e.status='ativo';renderEmpresas();initMaster();showToast(e.fantasia+' desbloqueada!','success');}} function renderFinanceiro(){ var rl=document.getElementById('receita-lista'); if(rl){ var totais={}; EMPRESAS_DB.filter(function(e){return e.status!=='bloqueado';}).forEach(function(e){totais[e.plano]=(totais[e.plano]||0)+e.valor;}); var total=Object.values(totais).reduce(function(a,b){return a+b;},0); rl.innerHTML=PLANOS_DEF.map(function(p){ var t=totais[p.key]||0;var pct=total>0?Math.round(t/total*100):0; var cnt=EMPRESAS_DB.filter(function(e){return e.plano===p.key&&e.status!=='bloqueado';}).length; return '
'+p.nome+'R$ '+t.toLocaleString('pt-BR')+'/mês · '+cnt+' cli.
' +'
'; }).join(''); } var vl=document.getElementById('vencimentos-lista'); if(vl){ var sorted=EMPRESAS_DB.filter(function(e){return e.status==='ativo';}).sort(function(a,b){return a.vencDia-b.vencDia;}); vl.innerHTML=sorted.map(function(e){ var hoje=new Date().getDate();var diff=e.vencDia-hoje;var urgente=diff>=0&&diff<=5; return '
' +'
'+e.fantasia+'
'+e.plano+' · dia '+e.vencDia+'
' +'
dia '+e.vencDia+'
'+(urgente?'
'+diff+' dias
':'')+'
' +'
'; }).join(''); } var mc=document.getElementById('mrr-chart'); var ml=document.getElementById('mrr-labels'); if(mc){ var meses=['Dez','Jan','Fev','Mar','Abr','Mai']; var vals=[2800,3100,3100,3700,4200,4200]; var maxV=Math.max.apply(null,vals); mc.innerHTML=vals.map(function(v,i){return '
';}).join(''); if(ml)ml.innerHTML=meses.map(function(m){return ''+m+'';}).join(''); } var fr=document.getElementById('fin-resumo'); if(fr){ var mrr=EMPRESAS_DB.filter(function(e){return e.status!=='bloqueado';}).reduce(function(a,e){return a+e.valor;},0); var items=[['MRR','R$ '+mrr.toLocaleString('pt-BR'),'var(--gold-d)'],['ARR','R$ '+(mrr*12).toLocaleString('pt-BR'),'var(--green)'],['Ticket médio','R$ '+Math.round(mrr/Math.max(1,EMPRESAS_DB.filter(function(e){return e.valor>0;}).length)).toLocaleString('pt-BR'),'var(--text)'],['Pagantes',EMPRESAS_DB.filter(function(e){return e.valor>0&&e.status!=='bloqueado';}).length+'','var(--blue)']]; fr.innerHTML=items.map(function(it){return '
'+it[0]+''+it[1]+'
';}).join(''); } } function renderPlanos(){ var el=document.getElementById('planos-lista'); if(!el)return; el.innerHTML=PLANOS_DEF.map(function(p){ var cnt=EMPRESAS_DB.filter(function(e){return e.plano===p.key;}).length; return '
' +'
'+p.nome+'R$ '+p.valor.toLocaleString('pt-BR')+'/mês
' +'
'+cnt+' cliente'+(cnt!==1?'s':'')+' ativos
' +'
'+p.features.map(function(f){return ''+f+'';}).join('')+'
' +'
'; }).join(''); } // ── MODAIS MASTER ───────────────────────────────────────────────────── MODS['novaEmpresa']='
Nova empresa cliente
' +'
Cadastre e crie o acesso do administrador principal
' +'
' +'
Razão social *
' +'
Nome fantasia *
' +'
CNPJ
' +'
Plano *
' +'
Vencimento (dia)
' +'
Trial gratuito
' +'
' +'
👤 Usuário administrador principal
' +'
' +'
Nome completo *
' +'
E-mail / login *
' +'
Senha inicial *
' +'
Cargo
' +'
' +'
' +'
' +'
'; function criarEmpresa(){ var razao=(document.getElementById('ne-razao')||{}).value||''; var fantasia=(document.getElementById('ne-fantasia')||{}).value||''; var adminNome=(document.getElementById('ne-admin-nome')||{}).value||''; var adminEmail=(document.getElementById('ne-admin-email')||{}).value||''; var adminSenha=(document.getElementById('ne-admin-senha')||{}).value||''; if(!razao||!fantasia||!adminNome||!adminEmail||!adminSenha){showToast('Preencha todos os campos obrigatórios (*)','error');return;} if(adminSenha.length<10){showToast('Senha mínimo 10 caracteres','warn');return;} var plano=(document.getElementById('ne-plano')||{}).value||'basico'; var venc=parseInt(((document.getElementById('ne-venc')||{}).value)||10); var trial=parseInt(((document.getElementById('ne-trial')||{}).value)||0); var cores=['#1565C0','#28A745','#E65100','#6A1B9A','#00838F','#AD1457']; var emojis=['🏢','💼','🔧','📦','🏭','📡']; EMPRESAS_DB.push({ id:Date.now(),nome:razao,fantasia:fantasia, cnpj:(document.getElementById('ne-cnpj')||{}).value||'—', plano:plano,status:trial>0?'trial':'ativo', valor:{basico:500,profissional:900,enterprise:1800}[plano]||500, vencDia:venc,usuarios:1,bens:0, cor:cores[EMPRESAS_DB.length%cores.length], emoji:emojis[EMPRESAS_DB.length%emojis.length], adminNome:adminNome,adminEmail:adminEmail,cidade:'—' }); closeModal();renderEmpresas();initMaster(); showToast('✅ '+fantasia+' cadastrada! E-mail enviado para '+adminEmail,'success',5000); } MODS['exportMaster']='
Exportar relatório master
Dados de todas as empresas
' +'
' +'' +'' +'' +'
'; // ── APARÊNCIA: color pickers init ───────────────────────────────────── var COLOR_DEFS=[ {id:'gold', label:'Acento / dourada', sub:'Botões, links, destaques', v:'--gold', def:'#C9A84C'}, {id:'sidebar', label:'Sidebar (menu)', sub:'Fundo do menu lateral', v:'--sidebar', def:'#1C1C1E'}, {id:'bg', label:'Fundo principal', sub:'Área de conteúdo', v:'--bg', def:'#F2F0EC'}, {id:'card', label:'Fundo dos cards', sub:'Superfície dos painéis', v:'--card', def:'#FFFFFF'}, {id:'text', label:'Texto principal', sub:'Títulos e conteúdo', v:'--text', def:'#1C1C1E'}, {id:'text3', label:'Texto secundário', sub:'Labels e informações aux.', v:'--text3', def:'#8E8E93'}, {id:'border', label:'Bordas', sub:'Separadores e contornos', v:'--border', def:'#E4E0D8'}, {id:'green', label:'Cor de sucesso', sub:'Status OK, confirmações', v:'--green', def:'#28A745'}, {id:'red', label:'Cor de erro', sub:'Alertas críticos, erros', v:'--red', def:'#D32F2F'}, ]; function initColorPickers(){ var el=document.getElementById('color-pickers');if(!el)return; el.innerHTML=COLOR_DEFS.map(function(c){ var cur=getComputedStyle(document.documentElement).getPropertyValue(c.v).trim()||c.def; return '
' +'
'+c.label+'
'+c.sub+'
' +'
' +'
' +''+cur+'' +'' +'' +'
'; }).join(''); } function applyColorVar(id,cssVar,value){ document.documentElement.style.setProperty(cssVar,value); var sw=document.getElementById('sw-'+id);var cd=document.getElementById('cd-'+id); if(sw)sw.style.background=value;if(cd)cd.textContent=value; if(id==='gold'){document.documentElement.style.setProperty('--gold-d',value);} if(id==='sidebar'){document.documentElement.style.setProperty('--sidebar2',value);} } function saveAllColors(){showToast('Cores salvas!','success');} function applyContrast(val){document.getElementById('contrast-val').textContent=val+'%';} function applyAccentIntensity(val){document.getElementById('accent-val').textContent=val+'%';} function applyFont(val){document.documentElement.style.setProperty('--fn',val);} function applyFontSize(val){document.body.style.fontSize=val+'px';} function previewSysName(){ var n1=(document.getElementById('sys-nome1')||{value:'Diamond'}).value; var n2=(document.getElementById('sys-nome2')||{value:'Patrimônio'}).value; var sub=(document.getElementById('sys-sub')||{value:'& Almoxarifado'}).value; var pn=document.getElementById('preview-nome');var ps=document.getElementById('preview-sub'); if(pn)pn.innerHTML=''+n1+' '+n2; if(ps)ps.textContent=sub; } function saveSysName(){ var n1=(document.getElementById('sys-nome1')||{value:'Diamond'}).value; var n2=(document.getElementById('sys-nome2')||{value:'Patrimônio'}).value; var sub=(document.getElementById('sys-sub')||{value:'& Almoxarifado'}).value; var bn=document.querySelector('.brand-name');var bs=document.querySelector('.brand-sub'); if(bn)bn.innerHTML=''+n1+' '+n2;if(bs)bs.textContent=sub; document.title=n1+' '+n2; showToast('Nome do sistema atualizado!','success'); } function resetTheme(){ COLOR_DEFS.forEach(function(c){applyColorVar(c.id,c.v,c.def);}); document.documentElement.style.removeProperty('--fn'); document.body.style.fontSize=''; showToast('Tema Diamond restaurado!','gold'); setTimeout(initColorPickers,100); } var THEMES_EXT={ diamond:{gold:'#C9A84C',sidebar:'#1C1C1E',bg:'#F2F0EC',card:'#FFFFFF',text:'#1C1C1E'}, dark:{gold:'#C9A84C',sidebar:'#0D0D0F',bg:'#111113',card:'#1C1C1F',text:'#F0F0F0'}, corporate:{gold:'#1565C0',sidebar:'#1565C0',bg:'#EEF4FF',card:'#FFFFFF',text:'#0D1B2A'}, verde:{gold:'#43A047',sidebar:'#1B5E20',bg:'#F1F8F1',card:'#FFFFFF',text:'#1B2E1B'}, roxo:{gold:'#CE93D8',sidebar:'#4A148C',bg:'#F3E5F5',card:'#FFFFFF',text:'#1A0033'}, vermelho:{gold:'#EF9A9A',sidebar:'#B71C1C',bg:'#FFEBEE',card:'#FFFFFF',text:'#2D0000'}, }; function applyTheme(name){ var t=THEMES_EXT[name]||THEMES_EXT.diamond; COLOR_DEFS.forEach(function(c){if(t[c.id])applyColorVar(c.id,c.v,t[c.id]);}); setTimeout(initColorPickers,50); showToast('Tema "'+name+'" aplicado!','gold',2000); } function updateTombPreview(){ var p=(document.getElementById('tomb-prefix')||{value:'GXT'}).value; var c=(document.getElementById('tomb-city')||{value:'BEL'}).value; var n=(document.getElementById('tomb-next')||{value:'1248'}).value; var y=(document.getElementById('tomb-year')||{value:'2026'}).value; var el=document.getElementById('tomb-preview'); if(el)el.textContent=p+'-'+c+'-TI-'+y+'-'+String(n).padStart(6,'0'); } function saveEmpresa(){ var nome=(document.getElementById('emp-fantasia')||{}).value; var tn=document.querySelector('.tcn');if(tn&&nome)tn.textContent=nome; showToast('Dados da empresa salvos!','success'); } function saveTombamento(){updateTombPreview();showToast('Tombamento salvo!','success');} MODS['addFilial']='
Nova filial / cidade
Adicione uma unidade
' +'
Cidade *
' +'
Estado
' +'
Código (tombamento)
' +'
Tipo
' +'
'; // Hook go() for master and cfg init var _goOrig=go; go=function(pg){ _goOrig(pg); if(pg==='master')setTimeout(initMaster,50); if(pg==='cfg')setTimeout(function(){ var apar=document.getElementById('csec-aparencia'); if(apar&&(apar.style.display!=='none'||apar.classList.contains('active')))initColorPickers(); },80); }; var _cfgTabOrig=cfgTab; cfgTab=function(name){ _cfgTabOrig(name); if(name==='aparencia')setTimeout(initColorPickers,80); if(name==='usuarios')setTimeout(renderCfgUsers,50); };