Visão geral
Clientes
| CNPJ | Razão social | Revenda | Status | API | Fiscal | Retag. | PDV | Liberado até | Último acesso | |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ formatarCnpj(c.cnpj) }} |
{{ c.razao_social }}
☁️ SaaS
📦 {{ labelPlanoCurto(c.plano_codigo) }}
{{ c.nome_fantasia }}
|
BLOQ EXP VENC OK | {{ c.versao_api_retaguarda || '—' }} | {{ c.versao_api_fiscal || '—' }} | {{ c.versao_retaguarda || '—' }} | {{ c.versao_pdv || '—' }} | {{ c.liberado_ate ? formatarData(c.liberado_ate) : '—' }} | {{ c.ultimo_acesso ? formatarDataHora(c.ultimo_acesso) : 'nunca' }} | ||
| Nenhum cliente cadastrado | ||||||||||
{{ form.id ? 'Editar cliente' : 'Novo cliente' }}
📦 Plano contratado (definido pela revenda) {{ form.planoSnapshot.plano.nome || form.planoCodigo }}
Módulos liberados
Cadastre servidor, terminais, caixas — dados de SSH ficam cifrados no banco.
Anotações livres sobre o cliente (suporta texto/markdown).
{{ d.conteudo }}
{{ erroForm }}
Logs de acesso
{{ logsCliente?.razao_social }} ({{ formatarCnpj(logsCliente?.cnpj) }})
| Data | App | Versão | IP | Hostname | Resultado |
|---|---|---|---|---|---|
| {{ formatarDataHora(l.data_consulta) }} | {{ l.app }} | {{ l.versao || '—' }} | {{ l.ip || '—' }} | {{ l.hostname || '—' }} | {{ l.resultado }} |
| Sem registros | |||||
📜 Cláusulas do Contrato
Cadastro das cláusulas que podem entrar nos contratos. Marque/desmarque em cada proposta.
| Ordem | Código | Título | Padrão | Sempre inclusa | Condicional | Ativa | Ações |
|---|---|---|---|---|---|---|---|
| {{ c.ordem }} | {{ c.codigo }} | {{ c.titulo }} | {{ c.padrao ? '✓' : '—' }} | {{ c.sempre_inclusa ? '🔒' : '—' }} | {{ c.condicional || '—' }} | {{ c.ativa ? '✓' : '✗' }} | |
| Nenhuma cláusula cadastrada. | |||||||
{{ clausula.id ? 'Editar Cláusula' : 'Nova Cláusula' }}
{{prazoImplantacaoDias}} · {{valorMigracao}} · {{pctDescontoPontualidade}} · {{mensalCheia}} · {{mensalComDesconto}} · {{economiaMensal}} · {{economiaAnual}}
🚀 Atualizar Cliente
Script PowerShell que atualiza todos os componentes do cliente para a última versão publicada.
Detecta automaticamente se está rodando no servidor (atualiza APIs + Tauri) ou em um terminal (só atualiza apps Tauri — terminal não tem API instalada).
- Para os serviços
3aSystem.ApiRetaguarda,3aSystem.ApiFiscale3aSystem.Agente - Faz backup das pastas das APIs com timestamp (
_backup_YYYYMMDD_HHMMSS) - Baixa as últimas versões direto do servidor de updates e extrai sobrescrevendo
- Preserva configurações locais:
appsettings.json,conf.ini, pastaCertificado/ - Reinstala Tauri Retaguarda e PDV via setup silencioso (
/S) - Reinicia os serviços e valida endpoints HTTP
:5000e:8001
{{ scriptAtualizar }}
Parâmetros opcionais
Salve o script como atualizar-cliente.ps1 e rode com flags pra controlar o que atualiza:
| -Modo Auto|Servidor|Terminal | Default Auto — detecta pelo que está instalado. Use Terminal pra forçar só apps Tauri (PCs de operador sem API) |
| -PularApis | Não atualiza as APIs (.NET) — só Tauri |
| -PularTauri | Não atualiza apps Tauri — só APIs |
| -SemBackup | Não cria backup das pastas (mais rápido) |
| -ServerUrl <url> | URL do servidor de updates (default: https://www.updates.3asystem.com.br) |
💳 Instalar TEF
Script PowerShell que instala/atualiza o serviço TEF PayGo (nossa API local
3aSystem.ApiTef + DLL PGWebLib) e/ou guia a instalação do Agente CliSiTef
da Software Express.
Instale só onde tem pinpad físico conectado. Não precisa nos terminais que só consomem NFC-e.
- Para serviço
3aSystem.ApiTefse estiver rodando - Backup em
C:\3aSystem\ApiTef.backup_YYYYMMDD_HHMMSS - Baixa
apitef-latest.zipdo servidor de updates e extrai emC:\3aSystem\ApiTef\ - Valida
DinoCommerce.ApiTef.exe+PGWebLib.dll - Instala NSSM (se ausente) e registra
3aSystem.ApiTefcomo serviço Windows AutoStart - Abre porta
8787/tcpno firewall (WebSocket local pro PDV) - Preserva
appsettings.jsonlocal ao atualizar - Inicia e valida
ws://127.0.0.1:8787
O CITEF/SiTef usa o Agente CliSiTef da Software Express — pacote de 3º, não redistribuído pela 3aSystem. O script abre a página oficial de downloads e mostra os passos manuais:
- Baixe em softwareexpress.com.br/downloads
- Instale como serviço (próximo → próximo → concluir). Escuta em
127.0.0.1:59002 - No Retaguarda → Terminais PDV → aba TEF: Provedor = CITEF, Ativo ✓
- No PDV → Config → aba CITEF → Testar Conexão
- Menu Admin SiTef → INSTALACAO → preencha Loja/Terminal/Endereço
{{ scriptInstalarTef }}
Parâmetros opcionais
| -Provedor PayGo|CITEF|Ambos | Default PayGo. Use CITEF pra abrir só a página da SoftExpress. Ambos instala PayGo + guia CITEF |
| -Desinstalar | Remove serviço 3aSystem.ApiTef, pasta de instalação e regra de firewall |
| -PastaInstalacao <path> | Default C:\3aSystem\ApiTef |
| -SemBackup | Não cria backup da pasta anterior |
| -ServerUrl <url> | Default https://www.updates.3asystem.com.br |
🏷️ Tabelas Fiscais
📤 Publicar nova versão {{ tfTipo }}
Faça upload do arquivo ncm_oficial_seed.sql gerado por
scripts/importar_ncm.py. Será ativado automaticamente
após o upload — clientes baixam na próxima checagem.
📋 Versões publicadas
| Status | Versão | Ato | Registros | SQL | Publicado em | Ações |
|---|---|---|---|---|---|---|
| ATIVA — | {{ v.versao }} | {{ v.ato_padrao || '—' }} | {{ (v.qtd_registros || 0).toLocaleString('pt-BR') }} | {{ formatarKB(v.sql_tamanho) }} | {{ new Date(v.criado_em).toLocaleString('pt-BR') }} |
A troca é imediata: o cliente sai do painel da revenda atual e passa a aparecer no painel da revenda escolhida. O histórico fica registrado nos dois lados.
🤝 Revendas
| Revenda | CNPJ | Status | Clientes | % | Vendas/mês | Receita 3a | |
|---|---|---|---|---|---|---|---|
|
{{ r.razao_social }}
{{ r.nome_fantasia }}
|
{{ r.cnpj }} | Ativa Bloqueada | {{ r.clientes_ativos }}/{{ r.total_clientes }} | {{ Number(r.percentual_repasse).toFixed(2) }}% | {{ moeda(r.faturamento_revenda) }} | {{ moeda(r.receita_3a) }} | |
| Nenhuma revenda cadastrada. | |||||||
{{ rev.id ? 'Editar' : 'Nova' }} Revenda
{{ msgCnpjRev }}
Sobre o valor que a revenda vender
Criado junto com a revenda — é com ele que a revenda entra em /licenca/revenda
Clientes de {{ revAtual?.razao_social }}
repasse {{ Number(revAtual?.percentual_repasse||0).toFixed(2) }}%| CNPJ | Razão social | Status | Liberado até | Mensalidade | Receita 3a |
|---|---|---|---|---|---|
| {{ c.cnpj }} | {{ c.razao_social }} | Ativo Pendente Bloqueado | {{ c.liberado_ate ? new Date(c.liberado_ate).toLocaleDateString('pt-BR') : '—' }} | {{ moeda(c.valor_mensalidade) }} | {{ moeda(c.receita_3a) }} |
| Esta revenda ainda não cadastrou clientes. | |||||
🖥️ Servidor
atualizado {{ new Date(monitor.agora).toLocaleTimeString('pt-BR') }} · auto-refresh 10s
🐘 {{ pg.label || 'PostgreSQL' }} {{ pg.versao }}
{{ pg.conexoes.ativas }} conexões · shared_buffers {{ pg.config.shared_buffers }} · max_connections {{ pg.config.max_connections }}Bancos ({{ pg.bancos.length }})
Trocar senha
{{ msgSenha }}
🎯 Leads & Prospecção
| Nome | UF | Cidade | CNPJ | Tel/Email | Status | Ações | |
|---|---|---|---|---|---|---|---|
| {{ l.nome }} | {{ l.uf || '—' }} | {{ l.cidade || '—' }} | {{ l.cnpj || '—' }} | {{ l.whatsapp || '—' }} | {{ l.telefone_fixo || l.email || '—' }} | {{ l.status }} |
{{ leadEdit.nome || 'Novo lead' }}
💬 Disparar mensagem
📱 Sessões WhatsApp
Escaneie no WhatsApp → Aparelhos conectados
🧪 Enviar mensagem de teste
📢 Campanhas de disparo
| Nome | Status | Alvos | Enviados | Erros | Rate/dia | |
|---|---|---|---|---|---|---|
| {{ c.nome }} | {{ c.status }} | {{ c.total_alvo }} | {{ c.total_enviado }} | {{ c.total_erro }} | {{ c.rate_por_dia }} |
Nova campanha
- Curta (2-4 linhas). Se precisar mais, quebra em duas mensagens
- Sem link no primeiro contato — WhatsApp reduz alcance
- Termine com pergunta aberta (não CTA agressivo)
- Sem emoji em excesso — parece spam
- Personalize {{nome}} e {{cidade}} sempre
📦 Pacotes de Licença Anual
| Revenda | Itens | Licenças | Usadas | Valor total | Boletos | Status | |
|---|---|---|---|---|---|---|---|
|
{{ p.revenda_nome || '—' }}
{{ fmtCnpj(p.revenda_cnpj) }}
|
{{ p.total_itens || 0 }} | {{ p.total_licencas || 0 }} | {{ p.total_usadas || 0 }} | R$ {{ Number(p.valor_total_negociado).toFixed(2) }} | {{ p.boletos_pagos }}✓ / {{ p.boletos_pendentes }}⌛ | {{ p.status }} | |
| Nenhum pacote vendido ainda. | |||||||
{{ pacoteDetalhe.pacote.revenda_nome }}
Composição
Estoque total
Ainda não usadas
Valor negociado
Itens negociados ({{ (pacoteDetalhe.itens || []).length }})
| Plano | Modalidade | Pagas | Bônus | Usadas | Disp. | Preço unit | Subtotal |
|---|---|---|---|---|---|---|---|
| {{ it.plano_codigo }} | {{ it.modalidade === 'WEB' ? '🌐 Web' : '🖥 Desktop' }} | {{ it.quantidade_paga }} | {{ it.quantidade_bonus }} | {{ it.quantidade_usada }} | {{ it.quantidade_disponivel }} | R$ {{ Number(it.preco_unitario).toFixed(2) }} | R$ {{ (Number(it.quantidade_paga) * Number(it.preco_unitario)).toFixed(2) }} |
| Pacote legado (sem itens detalhados) | |||||||
Boletos ({{ pacoteDetalhe.boletos.length }})
| # | Descrição | Valor | Vencimento | Status | |
|---|---|---|---|---|---|
| {{ b.sequencia }} | {{ b.descricao }} | R$ {{ Number(b.valor).toFixed(2) }} | {{ new Date(b.vencimento).toLocaleDateString('pt-BR') }} | {{ b.status }} |
Clientes vinculados ({{ pacoteDetalhe.clientes.length }})
| Razão social | CNPJ | Validade | Status |
|---|---|---|---|
| {{ c.razao_social }} | {{ fmtCnpj(c.cnpj) }} | {{ c.licenca_valida_ate ? new Date(c.licenca_valida_ate).toLocaleDateString('pt-BR') : '—' }} | {{ c.status_comercial }} |
| Nenhum cliente consumiu esse pacote ainda. | |||
Vender pacote de licenças
| # | Descrição | Valor (R$) | Vencimento | |
|---|---|---|---|---|
| {{ i }} | ||||
| Nenhuma parcela — preencha os campos acima e clique Recalcular | ||||
| Soma dos boletos: | R$ {{ somaBoletos.toFixed(2) }} | ✓ Bate Difere R$ {{ (valorTotalPacote - somaBoletos).toFixed(2) }} | ||
💵 Financeiro — Revendas
Revendas — situação financeira
| Revenda | Recebido mês | A receber | Em atraso | Dias máx | Situação | Ações |
|---|---|---|---|---|---|---|
|
{{ r.nome_fantasia || r.razao_social }}
{{ r.cnpj }}
|
{{ Number(r.recebido_mes).toFixed(2) }} | {{ Number(r.a_receber).toFixed(2) }} | {{ Number(r.em_atraso).toFixed(2) }} | {{ r.dias_atraso_max || '—' }} | 💤 Pausada até {{ new Date(r.acordo_pausado_ate).toLocaleDateString('pt-BR') }} 🚫 Cortada ⚠ Bloq. novos Inativa OK |
🔗 Vincular customer ASAAS
💳 Extrato ASAAS
● ao vivo ○ manual| Vencimento | Cliente | Descrição | Forma | Valor | Status | Ações |
|---|---|---|---|---|---|---|
| {{ c.vencimento ? new Date(c.vencimento).toLocaleDateString('pt-BR') : '—' }} +{{ c.dias_atraso }}d |
{{ c.customer_nome }}
customer {{ (c.customer_id||'').slice(-8) }}
{{ c.customer_cpfcnpj || '' }}
🤝 {{ c.revenda_casada_nome }}
|
{{ c.descricao || '—' }}
|
{{ c.billing_type }} |
R$ {{ Number(c.valor).toFixed(2) }}
líq {{ Number(c.valor_liquido).toFixed(2) }}
|
{{ c.status }}
{{ new Date(c.pago_em).toLocaleDateString('pt-BR') }}
|
🔗 Abrir 📄 #{{ c.nfse_numero }} PDF XML |
| Nenhuma cobrança encontrada. Clique em 🔄 Sincronizar pra puxar do ASAAS. | ||||||
Cobranças — {{ modalCobRev.nome_fantasia || modalCobRev.razao_social }}
| Cliente | Compet. | Venc. | Valor devido | Status | Ação |
|---|---|---|---|---|---|
| {{ c.razao_social || '—' }} {{ c.cnpj }} |
{{ c.competencia }} | {{ new Date(c.vencimento).toLocaleDateString('pt-BR') }} | R$ {{ Number(c.valor_devido).toFixed(2) }} | {{ c.status }}{{ c.dias_atraso>0 ? ' (+'+c.dias_atraso+'d)' : '' }} |
🔍 NFS-e #{{ modalNfseDetalhe.numero_nfse }} — debug
📤 Payload enviado ao ApiFacilNFe
{{ JSON.stringify(modalNfseDetalhe.payload_envio, null, 2) }}
📥 Resposta do provedor
{{ JSON.stringify(modalNfseDetalhe.resposta_provedor, null, 2) }}
📄 NFS-e — Configurações
🛰️ Status SEFAZ (ApiFacilNFe)
🔐 Upload de Certificado Digital A1 (.pfx)
O certificado é enviado direto pra ApiFacilNFe e fica associado ao CNPJ do emitente. Não guardamos cópia local.
📋 NFS-e emitidas
| # | Tomador | Valor | Status | Motivo | Data | Ações |
|---|---|---|---|---|---|---|
| {{ n.numero_nfse }} |
{{ n.tomador_nome || '—' }}
{{ n.tomador_cpfcnpj }}
|
R$ {{ Number(n.valor).toFixed(2) }} | {{ n.status }} | {{ (n.xmotivo||'').substring(0,60) }} | {{ new Date(n.autorizado_em || n.criado_em).toLocaleDateString('pt-BR') }} | 📥 XML 📄 DANFE |
| Nenhuma NFS-e emitida ainda. Vá em Financeiro → Extrato ASAAS e clique em 📄 Emitir NFS-e numa cobrança paga. | ||||||
💰 Planos & Preços
Planos base
| Plano | Sugerido revenda | Mín 3aSystem | SaaS+ | Usuários | PDVs | Vigente desde | Ações |
|---|---|---|---|---|---|---|---|
| {{ p.nome }} | R$ {{ Number(p.preco_sugerido_revenda).toFixed(2) }} | R$ {{ Number(p.preco_minimo_3a).toFixed(2) }} | R$ {{ Number(p.adicional_saas).toFixed(2) }} | {{ p.limite_usuarios ?? '∞' }} | {{ p.limite_pdvs ?? '∞' }} | {{ new Date(p.vigencia_inicio).toLocaleDateString('pt-BR') }} |
👤💻 Extras quantitativos (cobra por unidade)
| Add-on | Limite | Básico | Standard | Full | Full Máx | Ações | ||||
|---|---|---|---|---|---|---|---|---|---|---|
| R$/un | Mín | R$/un | Mín | R$/un | Mín | R$/un | Mín | |||
| {{ a.nome }} | até {{ a.quantidade_maxima || '∞' }} | {{ Number(a.preco_basico).toFixed(2) }} | {{ Number(a.preco_minimo_3a_basico).toFixed(2) }} | {{ Number(a.preco_standard).toFixed(2) }} | {{ Number(a.preco_minimo_3a_standard).toFixed(2) }} | {{ Number(a.preco_full).toFixed(2) }} | {{ Number(a.preco_minimo_3a_full).toFixed(2) }} | {{ Number(a.preco_full_max).toFixed(2) }} | {{ Number(a.preco_minimo_3a_full_max).toFixed(2) }} | |
➕ Add-ons de módulos (1 unidade, ativa/desativa)
| Add-on | Básico | Standard | Full | Full Máx | Ações | ||||
|---|---|---|---|---|---|---|---|---|---|
| R$ | Mín | R$ | Mín | R$ | Mín | R$ | Mín | ||
| {{ a.nome }} | {{ Number(a.preco_basico).toFixed(2) }} | {{ Number(a.preco_minimo_3a_basico).toFixed(2) }} | {{ Number(a.preco_standard).toFixed(2) }} | {{ Number(a.preco_minimo_3a_standard).toFixed(2) }} | {{ Number(a.preco_full).toFixed(2) }} | {{ Number(a.preco_minimo_3a_full).toFixed(2) }} | {{ Number(a.preco_full_max).toFixed(2) }} | {{ Number(a.preco_minimo_3a_full_max).toFixed(2) }} | |
Editar plano {{ planoEdit.nome }}
Editar add-on {{ addonEdit.nome }}
📄 Propostas / Contratos
| Nº | Cliente | Plano | Mensal | Status | Data | |
|---|---|---|---|---|---|---|
| {{ p.numero }} | {{ p.nome_fantasia || p.razao_social }} {{ formatarCnpj(p.cnpj) }} |
{{ p.modulo }} · {{ p.hospedagem==='NUVEM'?'Nuvem':'Servidor cliente' }} · {{ p.usuarios }} usr | {{ moeda(p.mensal_total) }} | {{ p.status }} | {{ formatarData(p.criado_em) }} |
|
| Nenhuma proposta. Clique em "Nova Proposta". | ||||||
{{ prop.id ? 'Editar' : 'Nova' }} Proposta
Cláusulas marcadas entram no PDF do contrato (ordem definida no cadastro). Condicionais auto-marcam quando o módulo está ativo.
Suba o contrato assinado e outros documentos. Pode enviar várias versões — todas ficam guardadas.