$

DinoCommerce

Painel de Licenças

{{ erroLogin }}

Visão geral

{{ resumo.total || 0 }}
Total
{{ resumo.ativos || 0 }}
Ativos
{{ resumo.bloqueados || 0 }}
Bloqueados
{{ resumo.vencendo || 0 }}
Vencendo (7d)
{{ resumo.expirados || 0 }}
Expirados
{{ resumo.acessos24h || 0 }}
Acessos 24h

Clientes

Últimas versões publicadas
API Retag: {{ versoesPub.apiRetaguarda || '—' }}
API Fiscal: {{ versoesPub.apiFiscal || '—' }}
Retaguarda: {{ versoesPub.retaguarda || '—' }}
PDV: {{ versoesPub.pdv || '—' }}
🟢 atualizado · 🟡 1 release atrás · 🔴 2+ releases atrás · ⚪ nunca reportou
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' }}


☁️ Tenant SaaS provisionado
Tenant ID: {{ form.saasTenantId }}
Banco: dc_c_{{ (form.cnpj||'').replace(/\D/g,'') }}
Provisionado em: {{ form.saasProvisionadoEm ? new Date(form.saasProvisionadoEm).toLocaleString('pt-BR') : '—' }}

📦 Plano contratado (definido pela revenda) {{ form.planoSnapshot.plano.nome || form.planoCodigo }}

Cobra do cliente
{{ moeda(form.planoSnapshot.total_cliente) }}/mês
Revenda paga 3a
{{ moeda(form.planoSnapshot.total_minimo_3a) }}/mês
Usuários
{{ form.planoSnapshot.plano.limite_usuarios != null ? form.planoSnapshot.plano.limite_usuarios : '∞' }}
PDVs
{{ form.planoSnapshot.plano.limite_pdvs != null ? form.planoSnapshot.plano.limite_pdvs : '∞' }}
Add-ons: {{ a.nome || a.codigo }} ×{{ a.quantidade }} · {{ moeda(a.preco) }}
Congelado em {{ form.planoSnapshot.versao_criada_em ? new Date(form.planoSnapshot.versao_criada_em).toLocaleDateString('pt-BR') : '—' }} — mudanças futuras de preço não afetam este cliente. O que está liberado está nos módulos abaixo (já vêm do plano + add-ons).
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

{{ 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' }}

Placeholders: {{prazoImplantacaoDias}} · {{valorMigracao}} · {{pctDescontoPontualidade}} · {{mensalCheia}} · {{mensalComDesconto}} · {{economiaMensal}} · {{economiaAnual}}
{{ erroClausula }}
PRÉVIA

🚀 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).

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
{{ erroScript }}
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)

💳 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.

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
{{ erroScriptTef }}
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

🏷️ 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

Carregando...
Nenhuma versão publicada ainda — faça o primeiro upload acima.
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') }}
Vincular cliente a uma revenda
Cliente
{{ vincCliente.razao_social }}
{{ formatarCnpj(vincCliente.cnpj) }}
Origem atual
🤝 {{ 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 }}

🤝 Revendas

{{ 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)) }}
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

{{ erroRev }}

{{ 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 }}

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

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 }}

Trocar senha

{{ msgSenha }}

🎯 Leads & Prospecção

Total
{{ leadsTotais.total || 0 }}
Com WhatsApp
{{ leadsTotais.com_wa || 0 }}
Com CNPJ
{{ leadsTotais.com_cnpj || 0 }}
Contatados
{{ leadsTotais.contatados || 0 }}
NomeUFCidadeCNPJWhatsAppTel/EmailStatusAções
{{ l.nome }} {{ l.uf || '—' }} {{ l.cidade || '—' }} {{ l.cnpj || '—' }} {{ l.whatsapp || '—' }} {{ l.telefone_fixo || l.email || '—' }} {{ l.status }}

{{ leadEdit.nome || 'Novo lead' }}

💬 Disparar mensagem

Destinatário: {{ disparoLead.nome }} — {{ disparoLead.cidade }}/{{ disparoLead.uf }}
📱 {{ disparoLead.whatsapp }}
📝 Escolha um modelo (opcional) {{ modelosMsg.length }} modelos
Ao enviar, o status do lead vira "CONTATADO"

💬 WhatsApp

{{ waSaude.ok ? '🟢 api_whatsapp online' : '🔴 api_whatsapp offline: ' + (waSaude.erro || '?') }}

📱 Sessões WhatsApp

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

NomeStatusAlvosEnviadosErrosRate/dia
{{ c.nome }} {{ c.status }} {{ c.total_alvo }} {{ c.total_enviado }} {{ c.total_erro }} {{ c.rate_por_dia }}

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.

📦 Pacotes de Licença Anual

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).
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 }}

{{ fmtCnpj(pacoteDetalhe.pacote.revenda_cnpj) }}
{{ pacoteDetalhe.pacote.status }}
{{ (pacoteDetalhe.itens || []).length }} itens
Composição
{{ totalLicencasPacoteDetalhe }} licenças
Estoque total
{{ disponivelPacoteDetalhe }} disp.
Ainda não usadas
R$ {{ Number(pacoteDetalhe.pacote.valor_total_negociado).toFixed(2) }}
Valor negociado
{{ 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 }})

# 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
💻 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.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) }}
# 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

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

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) }}
📄 Ir pra NFS-e →
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 }}

ClienteCompet.Venc.Valor devidoStatusAçã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

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) }}

📄 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

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}) }}
# 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

⚠ 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

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)

Cliente informa a quantidade no cadastro (ex: 3 usuários extras). Preço mostrado é por unidade / mês.
Add-on Limite Básico Standard Full Full Máx Ações
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
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 }}

📆 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 }}

Preço revenda por plano-base (R$)
Mínimo 3aSystem por plano-base (R$)

📄 Propostas / Contratos

Cliente PlanoMensal StatusData
{{ 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

Cliente
buscando... {{ msgCnpjProp }}
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

📜 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