{{ tituloTela }}

3aSystem — Painel de Licenças Administração
Painel› Visão geral
Total de clientes
{{ resumo.total || 0 }}
Ativos
{{ resumo.ativos || 0 }}
Bloqueados
{{ resumo.bloqueados || 0 }}
Vencendo (7 dias)
{{ resumo.vencendo || 0 }}
Expirados
{{ resumo.expirados || 0 }}
Acessos 24h
{{ resumo.acessos24h || 0 }}
Recebido no mês
{{ moeda(dash.kpi.recebido_mes) }}
{{ moeda(dash.kpi.recebido_12m) }} nos últimos 12 meses
A receber (30 dias)
{{ moeda(dash.kpi.a_receber_30d) }}
{{ moeda(dash.kpi.a_receber_total) }} em cobranças emitidas
Em atraso
{{ moeda(dash.kpi.em_atraso) }}
Média mensal recebida
{{ moeda(dash.kpi.recebido_3m / 3) }}
últimos 3 meses · contratado no cadastro {{ moeda(dash.kpi.mrr_contratado) }}
Ticket médio por cliente
{{ moeda(ticketMedio) }}
média mensal · {{ dash.kpi.pagantes_3m }} pagantes (3 meses)
Receita mês a mês — 12 meses anteriores + 6 à frente (meses futuros = cobranças já emitidas)
MêsRecebidoA receber Em atrasoNovos clientesLicenças vencendo
{{ rotuloMes(m.mes) }} (previsto) {{ moeda(m.recebido) }} {{ moeda(m.a_receber) }} {{ moeda(m.em_atraso) }} {{ m.novos_clientes }} {{ m.vencimentos }}
Receita por cliente — recebido nos últimos 12 meses
Novos clientes por mês
Licenças que vencem por mês — clientes ativos
Clientes ativos por plano
{{ p.plano === 'sem_plano' ? 'Sem plano (avulso)' : labelPlanoCurto(p.plano) }} {{ p.qtd }}
Sem clientes ativos
Clientes ativos por origem
{{ o.origem }} {{ o.qtd }}
Sem clientes ativos
{{ dashErro }}
Cadastros› Clientes {{ clientesOrdenados.length }}
Últimas versões publicadas — API Retag. {{ versoesPub.apiRetaguarda || '—' }} · API Fiscal {{ versoesPub.apiFiscal || '—' }} · Retaguarda {{ versoesPub.retaguarda || '—' }} · PDV {{ versoesPub.pdv || '—' }} verde = atualizado · amarelo = 1 versão atrás · vermelho = 2+ · cinza = nunca reportou
Ações 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
{{ clientes.filter(c => c.ativo).length }} ativos | {{ clientes.filter(c => !c.ativo).length }} bloqueados Duplo clique abre o cadastro
Clientes› {{ form.id ? (form.razaoSocial || 'Editar cliente') : 'Novo cliente' }} {{ form.ativo ? 'ATIVO' : 'BLOQUEADO' }}
{{ erroForm }}
Dados gerais
Licença
Tenant SaaS provisionado — ID {{ form.saasTenantId }} · banco dc_c_{{ (form.cnpj||'').replace(/\D/g,'') }} · em {{ form.saasProvisionadoEm ? new Date(form.saasProvisionadoEm).toLocaleString('pt-BR') : '—' }}
Plano contratado
Sem plano de revenda registrado (cadastro direto da 3aSystem ou módulos avulsos). O que está liberado está nos módulos abaixo.
Módulos liberados
Observação
Cliente {{ form.ativo ? 'ativo' : 'bloqueado' }} Novo registro
Clientes› Logs de acesso {{ logs.length }}
{{ 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
{{ logs.length }} registros
Comercial› Cláusulas do Contrato {{ clausulas.length }}
Cadastro das cláusulas que podem entrar nos contratos. Marque/desmarque em cada proposta.
Ações Ordem Código Título Padrão Sempre inclusa Condicional Ativa
{{ c.ordem }} {{ c.codigo }} {{ c.titulo }} {{ c.padrao ? '✓' : '—' }} — {{ c.condicional || '—' }} {{ c.ativa ? '✓' : '✗' }}
Nenhuma cláusula cadastrada.
{{ clausulas.filter(c => c.ativa).length }} ativas | {{ clausulas.length }} cadastradas
Cláusulas› {{ clausula.id ? 'Editar Cláusula' : 'Nova Cláusula' }}
{{ erroClausula }}
Dados da cláusula
Conteúdo (HTML — pode usar <b>, <u>, <i>)
Placeholders: {{prazoImplantacaoDias}} · {{valorMigracao}} · {{pctDescontoPontualidade}} · {{mensalCheia}} · {{mensalComDesconto}} · {{economiaMensal}} · {{economiaAnual}} · {{valorImplantacao}} · {{valorImplantacaoExtenso}}
Prévia
Ferramentas› Atualizar Cliente
{{ erroScript }}
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).
Passo 1
Abra o PowerShell como Administrador no PC do cliente.
Passo 2
Cole o script abaixo e pressione Enter.
Passo 3
Aguarde o resumo verde "Atualizacao concluida" no fim.
O que o script faz
  • Para os serviços 3aSystem.ApiRetaguarda, 3aSystem.ApiFiscal e 3aSystem.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, pasta Certificado/
  • Reinstala Tauri Retaguarda e PDV via setup silencioso (/S)
  • Reinicia os serviços e valida endpoints HTTP :5000 e :8001
atualizar-cliente.ps1
carregando... {{ scriptAtualizar.split('\n').length }} linhas
{{ scriptAtualizar }}
Carregando script...
Clique em "Recarregar" pra buscar o script.
Parâmetros opcionais
Salve o script como atualizar-cliente.ps1 e rode com flags pra controlar o que atualiza:
-Modo Auto|Servidor|TerminalDefault Auto — detecta pelo que está instalado. Use Terminal pra forçar só apps Tauri (PCs de operador sem API)
-PularApisNão atualiza as APIs (.NET) — só Tauri
-PularTauriNão atualiza apps Tauri — só APIs
-SemBackupNão cria backup das pastas (mais rápido)
-ServerUrl <url>URL do servidor de updates (default: https://www.updates.3asystem.com.br)
Ferramentas› Instalar TEF
{{ erroScriptTef }}
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.
Passo 1
Abra o PowerShell como Administrador no PC do caixa.
Passo 2
Cole o script abaixo. Depois refaça a INSTALACAO no pinpad (Menu TEF).
Passo 3
Cadastre o terminal na Retaguarda (aba TEF) e teste a 1ª venda.
O que o script faz — PayGo
  • Para serviço 3aSystem.ApiTef se estiver rodando
  • Backup em C:\3aSystem\ApiTef.backup_YYYYMMDD_HHMMSS
  • Baixa apitef-latest.zip do servidor de updates e extrai em C:\3aSystem\ApiTef\
  • Valida DinoCommerce.ApiTef.exe + PGWebLib.dll
  • Instala NSSM (se ausente) e registra 3aSystem.ApiTef como serviço Windows AutoStart
  • Abre porta 8787/tcp no firewall (WebSocket local pro PDV)
  • Preserva appsettings.json local ao atualizar
  • Inicia e valida ws://127.0.0.1:8787
CITEF / SiTef (SoftExpress)

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:

  1. Baixe em softwareexpress.com.br/downloads
  2. Instale como serviço (próximo → próximo → concluir). Escuta em 127.0.0.1:59002
  3. No Retaguarda → Terminais PDV → aba TEF: Provedor = CITEF, Ativo ✓
  4. No PDV → Config → aba CITEF → Testar Conexão
  5. Menu Admin SiTef → INSTALACAO → preencha Loja/Terminal/Endereço
instalar-tef.ps1
carregando... {{ scriptInstalarTef.split('\n').length }} linhas
{{ scriptInstalarTef }}
Carregando script...
Clique em "Recarregar" pra buscar o script.
Parâmetros opcionais
-Provedor PayGo|CITEF|AmbosDefault PayGo. Use CITEF pra abrir só a página da SoftExpress. Ambos instala PayGo + guia CITEF
-DesinstalarRemove serviço 3aSystem.ApiTef, pasta de instalação e regra de firewall
-PastaInstalacao <path>Default C:\3aSystem\ApiTef
-SemBackupNão cria backup da pasta anterior
-ServerUrl <url>Default https://www.updates.3asystem.com.br
Fiscal› Tabelas Fiscais {{ tfTipo }}
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
Carregando...
Nenhuma versão publicada ainda — faça o primeiro upload acima.
Ações Status Versão Ato Registros SQL Publicado em
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') }}
Vincular cliente a uma revenda
{{ vincCliente.razao_social }}
{{ formatarCnpj(vincCliente.cnpj) }}
{{ vincCliente.revenda_nome }} Venda direta 3aSystem

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.

{{ erroVinc }}
Canal› Revendas {{ revendas.length }}
{{ erroRev }}
Revendas
{{ revendas.length }}
Ativas
{{ revendas.filter(r=>r.ativo).length }}
Clientes no canal
{{ revendas.reduce((s,r)=>s+r.total_clientes,0) }}
Receita 3aSystem/mês
{{ moeda(revendas.reduce((s,r)=>s+Number(r.receita_3a),0)) }}
Ações 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.
{{ revendas.filter(r=>r.ativo).length }} ativas | {{ revendas.filter(r=>!r.ativo).length }} bloqueadas
Revendas› {{ rev.id ? 'Editar' : 'Nova' }} Revenda {{ rev.ativo ? 'ATIVA' : 'BLOQUEADA' }}
{{ erroRev }}
Dados gerais
{{ msgCnpjRev }}
Acordo comercial
Sobre o valor que a revenda vender
Usuário administrador da revenda
Criado junto com a revenda — é com ele que a revenda entra em /licenca/revenda
{{ erroRev }}
Revendas› Clientes de {{ revAtual?.razao_social }} {{ revClientes.length }} 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.
{{ revClientes.filter(c => c.ativo).length }} ativos | {{ revClientes.length }} clientes
Sistema› Servidor atualizado {{ new Date(monitor.agora).toLocaleTimeString('pt-BR') }} · auto-refresh 10s
Carregando...
CPU
{{ monitor.cpu.cores }} cores
{{ monitor.cpu.modelo }}
RAM
{{ monitor.ram.usadoGB }} / {{ monitor.ram.totalGB }} GB
{{ monitor.ram.percUsado }}% usado · livre {{ monitor.ram.livreGB }} GB
Disco {{ d.letra || '?' }}:
{{ d.usadoGB }} / {{ d.totalGB }} GB
{{ d.percUsado }}% · livre {{ d.livreGB }} GB
{{ d.erro }}
{{ pg.label || 'PostgreSQL' }}{{ pg.versao }}
{{ pg.conexoes.ativas }} conexões · shared_buffers {{ pg.config.shared_buffers }} · max_connections {{ pg.config.max_connections }}
Instância indisponível{{ pg.erro ? ': ' + pg.erro : '' }}
Uptime servidor
{{ formatarUptime(monitor.uptime.servidor) }}
Uptime licenca-server
{{ formatarUptime(monitor.uptime.processo) }}
{{ monitor.erro }}
Conta› Trocar senha
Senha de acesso

{{ msgSenha }}

Comercial› Leads & Prospecção {{ leadsLista.length }}
Total
{{ leadsTotais.total || 0 }}
Com WhatsApp
{{ leadsTotais.com_wa || 0 }}
Com CNPJ
{{ leadsTotais.com_cnpj || 0 }}
Contatados
{{ leadsTotais.contatados || 0 }}
Ações Nome UF Cidade CNPJ WhatsApp Tel/Email Status
{{ l.nome }} {{ l.uf || '—' }} {{ l.cidade || '—' }} {{ l.cnpj || '—' }} {{ l.whatsapp || '—' }} {{ l.telefone_fixo || l.email || '—' }} {{ l.status }}
Nenhum lead encontrado
{{ leadsLista.length }} leads listados
{{ leadEdit.nome || 'Novo lead' }}
Disparar mensagem
Destinatário: {{ disparoLead.nome }} — {{ disparoLead.cidade }}/{{ disparoLead.uf }} · 📱 {{ disparoLead.whatsapp }}
Escolha um modelo (opcional)
{{ modelosMsg.length }} modelos
{{ disparoPreview }}
Ao enviar, o status do lead vira "CONTATADO"
Comercial› WhatsApp {{ waSaude.ok ? '🟢 api_whatsapp online' : '🔴 api_whatsapp offline: ' + (waSaude.erro || '?') }}
Sessões WhatsApp
Aparelhos conectados para disparo.

Nenhuma sessão. Clique em "Nova" para gerar QR.

{{ s.descricao }}
{{ s.telefone || 'sem número ainda' }}
{{ s.status }}
QR Code

Escaneie no WhatsApp → Aparelhos conectados

Enviar mensagem de teste
Antes de rodar campanha, teste com seu número.
Campanhas de disparo
{{ waCampanhas.length }} campanhas
Ações Nome Status Alvos Enviados Erros Rate/dia
{{ c.nome }} {{ c.status }} {{ c.total_alvo }} {{ c.total_enviado }} {{ c.total_erro }} {{ c.rate_por_dia }}
Nenhuma campanha
Nova campanha
Modelo de mensagem
(clique pra usar){{ modelosMsg.length }} modelos
Boas práticas cold outreach WhatsApp B2B:
  • 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
Antes de ativar, gere os envios pra ver quantos alvos serão contatados. Recomendo teste com 1-2 leads primeiro.
Comercial› Pacotes de Licença Anual {{ pacotes.length }}
Cada pacote reserva N licenças anuais pra uma revenda. A revenda consome esse estoque ao cadastrar clientes. Boletos são gerados na venda (Asaas ativo em fase 2 — por ora baixa manual).
Ações 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.
{{ pacotes.length }} pacotes
Pacotes› {{ pacoteDetalhe.pacote.revenda_nome }} {{ fmtCnpj(pacoteDetalhe.pacote.revenda_cnpj) }} {{ pacoteDetalhe.pacote.status }}
Composição
{{ (pacoteDetalhe.itens || []).length }}
itens
Estoque total
{{ totalLicencasPacoteDetalhe }}
licenças
Ainda não usadas
{{ disponivelPacoteDetalhe }}
disp.
Valor negociado
R$ {{ Number(pacoteDetalhe.pacote.valor_total_negociado).toFixed(2) }}
{{ pacoteDetalhe.pacote.observacao }}
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 }})
Ações # 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
Adicionar plano ao pacote
{{ planoNovoItem.nome }} · mín R$ {{ Number(planoNovoItem.preco_minimo_3a).toFixed(2) }} · sug R$ {{ Number(planoNovoItem.preco_sugerido_revenda).toFixed(2) }} · inclui {{ planoNovoItem.limite_pdvs || '∞' }} PDVs / {{ planoNovoItem.limite_usuarios || '∞' }} usuários por licença
12 = licença anual padrão. Para bônus (ex.: 6 meses grátis) use Licenças 0, Bônus 5, Validade 6. A contagem só começa quando a revenda vincula a licença a um cliente.
PDVs extras — acima do que o plano inclui, herdados por cada licença
Add-on: {{ addonPdvNovoItem.nome }} · mín R$ {{ Number(addonPdvNovoItem.preco_minimo_3a_basico).toFixed(2) }}/PDV/ano · sug R$ {{ Number(addonPdvNovoItem.preco_basico).toFixed(2) }}
Usuários extras — acima do que o plano inclui
Add-on: {{ addonUserNovoItem.nome }} · mín R$ {{ Number(addonUserNovoItem.preco_minimo_3a_basico).toFixed(2) }}/user/ano · sug R$ {{ Number(addonUserNovoItem.preco_basico).toFixed(2) }}
Cada licença: R$ {{ precoUnitTotalNovoItem.toFixed(2) }} (plano + extras)
Subtotal deste item: R$ {{ subtotalNovoItem.toFixed(2) }}
Itens do pacote ({{ pacoteForm.itens.length }})

Nenhum item ainda — configure acima e clique "Adicionar ao pacote"

{{ it.quantidade }}×
{{ (it.planoCodigo || '').replace('_',' ') }} {{ it.modalidade === 'WEB' ? '🌐 Web' : '🖥 Desktop' }}
R$ {{ Number(it.precoUnitario).toFixed(2) }}/un + {{ it.quantidadeBonus }} licenças bônus 🎁 {{ it.mesesValidade }} meses
+{{ it.pdvsExtra }} PDVs (R$ {{ Number(it.precoPdvExtra).toFixed(2) }}) +{{ it.pdvsExtraBonus }} PDVs bônus 🎁 +{{ it.usuariosExtra }} usuários (R$ {{ Number(it.precoUsuarioExtra).toFixed(2) }}) +{{ it.usuariosExtraBonus }} usuários bônus 🎁
R$ {{ subtotalItem(it).toFixed(2) }}
{{ Number(it.quantidade) + Number(it.quantidadeBonus||0) }} licenças
Total: {{ totalLicencasPagas }} pagas + {{ totalLicencasBonus }} bônus = {{ totalLicencasPagas + totalLicencasBonus }} licenças
R$ {{ subtotalPacote.toFixed(2) }}
Condições de pagamento
Parcelas geradas ({{ pacoteBoletos.length }})
— edite valor/data à vontade; ao ajustar 1 valor a última se recalcula pra fechar
Ações # 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
Recebido este mês
R$ {{ (finTotais.recebido_mes||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
A receber
R$ {{ (finTotais.a_receber_total||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
Em atraso
R$ {{ (finTotais.atrasado_total||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
Revendas — situação financeira
Ações Revenda Recebido mês A receber Em atraso Dias máx Situação
{{ 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
Customer ASAAS: {{ modalVincularCust.nome || modalVincularCust.customerId }}
Ao vincular, todas as cobranças desse customer serão associadas à revenda escolhida. Também grava a referência no ASAAS pra próxima sync casar sozinha.
Extrato ASAAS
● ao vivo ○ manual
Recebidas
R$ {{ Number(asaasTotais.recebidas_valor||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
líquido R$ {{ Number(asaasTotais.recebidas_liquido||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }} · {{ asaasTotais.recebidas_qtd||0 }} cobranças
Confirmadas
R$ {{ Number(asaasTotais.confirmadas_valor||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
{{ asaasTotais.confirmadas_qtd||0 }} cobranças
Aguardando
R$ {{ Number(asaasTotais.aguardando_valor||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
{{ asaasTotais.aguardando_qtd||0 }} cobranças
Vencidas
R$ {{ Number(asaasTotais.vencidas_valor||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
{{ asaasTotais.vencidas_qtd||0 }} cobranças
{{ nfseSelecionadas.length }} selecionada(s) · R$ {{ totalSelecionadoNfse.toFixed(2) }}
Ações Vencimento Cliente Descrição Forma Valor Status
#{{ c.nfse_numero }} {{ 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') }}
Nenhuma cobrança encontrada. Clique em Sincronizar pra puxar do ASAAS.
Cobranças — {{ modalCobRev.nome_fantasia || modalCobRev.razao_social }}
Ação Cliente Compet. Venc. Valor devido Status
{{ 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
Status: {{ modalNfseDetalhe.status }}
cstat: {{ modalNfseDetalhe.cstat || '—' }}
Tomador: {{ modalNfseDetalhe.tomador_nome }} ({{ modalNfseDetalhe.tomador_cpfcnpj }})
Valor: R$ {{ Number(modalNfseDetalhe.valor).toFixed(2) }}
Chave: {{ modalNfseDetalhe.chave_acesso }}
Protocolo: {{ modalNfseDetalhe.protocolo }}
xMotivo: {{ modalNfseDetalhe.xmotivo }}
Payload enviado ao ApiFacilNFe
{{ JSON.stringify(modalNfseDetalhe.payload_envio, null, 2) }}
Resposta do provedor
{{ JSON.stringify(modalNfseDetalhe.resposta_provedor, null, 2) }}
Financeiro› Boletos de clientes
ASAAS não configurado no servidor — não é possível emitir boletos.
A vencer
{{ bolBRL(bolTotais.a_vencer) }}
Vencido
{{ bolBRL(bolTotais.vencido) }}
Recebido no mês
{{ bolBRL(bolTotais.recebido_mes) }}
Com erro de emissão
{{ bolTotais.com_erro || 0 }}
Boletos
{{ bolSelecionados.length }} selecionado(s)
Ações Cliente Descrição Parcela Vencimento Valor Situação Pagamento
Nenhum boleto.
{{ b.nome_fantasia || b.razao_social }}
{{ fmtCnpj(b.cnpj) }}
{{ b.descricao || 'Sistema de automação comercial' }}
{{ b.erro }}
{{ b.motivo_cancelamento }}
{{ b.parcela }}/{{ b.total_parcelas }} {{ bolData(b.vencimento) }} {{ bolBRL(b.valor) }} {{ bolSituacao(b).txt }} enviado {{ b.envios }}x —
Lançar boletos
{{ bolLanc.erro }}
Cliente
{{ bolLanc.cliente.nome_fantasia || bolLanc.cliente.razao_social }}
{{ fmtCnpj(bolLanc.cliente.cnpj) }} · {{ bolLanc.cliente.razao_social }} · WhatsApp {{ bolLanc.cliente.contato_fone }}
{{ c.nome_fantasia || c.razao_social }} {{ fmtCnpj(c.cnpj) }}
Lançamento

Após o vencimento: multa de 2% e juros de 1% ao mês (fixo). Boleto + PIX no mesmo documento.

Parcelas — ajuste datas e valores se precisar
Parcela Vencimento Dia Valor (R$)
{{ i+1 }}/{{ bolLanc.parcelas.length }} {{ bolDiaSemana(p.vencimento) }}
Soma das parcelas difere do total em {{ bolBRL(bolSomaParcelas - Number(bolLanc.total||0)) }} Total: {{ bolBRL(bolSomaParcelas) }}
{{ bolEdit.status==='ERRO' ? 'Corrigir e emitir boleto' : 'Alterar boleto' }} — parcela {{ bolEdit.parcela }}/{{ bolEdit.total_parcelas }}

A alteração vale no ASAAS também — reimprima o boleto depois (a linha digitável muda).

Dar baixa — parcela {{ bolBaixa.parcela }}/{{ bolBaixa.total_parcelas }}

Use quando o cliente pagou por fora do boleto (dinheiro, transferência...). O boleto deixa de poder ser pago no banco.

Carnê — {{ bolCarne.qtd }} boleto(s)
Montando carnê...
{{ bolCarne.erro }}
Folha A4 · 4 boletos por folha · recorte na linha pontilhada
Financeiro› NFS-e — Configurações
Status SEFAZ (ApiFacilNFe)
✓ Operante ⚠ Fora {{ nfseStatus.obtidoEm ? new Date(nfseStatus.obtidoEm).toLocaleString('pt-BR') : '' }}
{{ nfseStatus.mensagem || '—' }}
Clique em "Verificar agora" pra consultar
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.

Default: 65.405.093/0001-80 (3aSystem)
NFS-e emitidas
Mês da emissão:
Total no filtro
{{ nfseTotais.total_qtd || 0 }} notas
R$ {{ Number(nfseTotais.total_valor||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
Autorizadas
{{ nfseTotais.autorizada_qtd || 0 }} notas
R$ {{ Number(nfseTotais.autorizada_valor||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
Rejeitadas
{{ nfseTotais.rejeitada_qtd || 0 }} notas
R$ {{ Number(nfseTotais.rejeitada_valor||0).toLocaleString('pt-BR',{minimumFractionDigits:2}) }}
Ações # Tomador Valor Status Motivo Data
{{ 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') }}
Nenhuma NFS-e emitida ainda. Vá em Financeiro → Extrato ASAAS e clique em Emitir NFS-e numa cobrança paga.
Comercial› Planos & Preços
Ao salvar novos preços: vale a partir de HOJE para novos cadastros. Clientes existentes MANTÊM o preço atual — o snapshot foi congelado no cadastro.
Planos base
Ações Plano Sugerido revenda Mín 3aSystem SaaS+ Usuários PDVs Vigente desde
{{ 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)
Cliente informa a quantidade no cadastro (ex: 3 usuários extras). Preço mostrado é por unidade / mês.
Ações Add-on Limite Básico Standard Full Full Máx
R$/unMín R$/unMín R$/unMín R$/unMí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)
Preço 0 = já incluído no plano
Ações Add-on Básico Standard Full Full Máx
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 }}
Plano ANUAL {{ planoEdit.modalidade === 'WEB' ? '(Web)' : '(Desktop)' }} — preço em R$/ano
Ao salvar, cria uma NOVA versão vigente. Clientes já cadastrados mantêm o preço atual.
Editar add-on {{ addonEdit.nome }}
Quantidade
Preço revenda por plano-base (R$)
Mínimo 3aSystem por plano-base (R$)
Comercial› Propostas / Contratos {{ propostas.length }}
Ações 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".
{{ propostas.length }} propostas
Propostas› {{ prop.id ? 'Editar' : 'Nova' }} Proposta
Cliente
Plano & Valores (todos editáveis)
Terminais TEF
1º terminal cobra o valor cheio · demais mais baratos
1º: {{ moeda(precos.tefPaygo1Cliente) }} · demais: {{ moeda(precos.tefPaygoDemaisCliente) }} → {{ moeda(tefPaygoValor) }}/mês
1º: {{ moeda(precos.tefSmartTef1Cliente) }} · demais: {{ moeda(precos.tefSmartTefDemaisCliente) }} → {{ moeda(tefSmartTefValor) }}/mês
Subtotal TEF: {{ moeda(tefMensalTotal) }}/mês
Implantação & Condições
Cláusulas do Contrato
Cláusulas marcadas entram no PDF do contrato (ordem definida no cadastro). Condicionais auto-marcam quando o módulo está ativo.
Nenhuma cláusula cadastrada.
{{ totalSelecionadas }} cláusula(s) selecionada(s)
Anexos (contrato assinado, documentos)
Suba o contrato assinado e outros documentos. Pode enviar várias versões — todas ficam guardadas.
Salve a proposta primeiro para poder anexar arquivos.
Resumo
Mensalidade base{{ moeda(prop.valorMensalidade) }}
+ {{ usuariosExtra }} usuário(s){{ moeda(usuariosExtra*prop.valorUsuarioAdicional) }}
+ App{{ moeda(prop.valorApp) }}
+ {{ pdvsExtra }} PDV(s){{ moeda(pdvsExtra*prop.valorPdvAdicional) }}
+ Cardápio Digital{{ moeda(prop.valorCardapio) }}
+ Bot WhatsApp{{ moeda(prop.valorBotWhatsapp) }}
+ MDF-e{{ moeda(prop.valorMdfe) }}
+ TEF PayGo ({{ prop.tefPaygoQtd }} term.){{ moeda(tefPaygoValor) }}
+ TEF SmartTef ({{ prop.tefSmartTefQtd }} term.){{ moeda(tefSmartTefValor) }}
- Desconto-{{ moeda(prop.descontoMensal) }}

Mensal{{ moeda(totMensal) }}
≈ {{ pctSM(totMensal) }} do salário mínimo
Implantação + treino{{ prop.valorMigracaoDados>0 ? ' + migração' : '' }}{{ moeda(totInicial) }}
≈ {{ pctSM(totInicial) }} do salário mínimo
{{ erroProp }}
Preços dos terminais TEF
Custo = o que a 3aSystem paga (AC/Br). Cliente = o que você cobra. Salva pra proposta atual e novas propostas.
Custo (R$) Cliente (R$)
PayGo — 1º checkout
PayGo — demais
SmartTef — 1º checkout
SmartTef — demais