{{ toast.initials }}
{{ toast.title }}
{{ toast.text }}

Aguardando Aprovação

Sua conta ({{ currentUser.email }}) foi registrada, mas ainda não tem um cargo liberado.

Peça para o administrador te aprovar dentro do sistema (aba "Gestão de Acesso").

Sistema em Manutenção

O sistema foi temporariamente travado por um Diretor para manutenção ou correções.

Tente novamente em alguns instantes. Se precisar, fale com um Diretor.

Salvando automático...

LOJASYSTEM

Relatório de Gestão

Relatório Gerencial - Visão Geral

Gerado em: {{ new Date().toLocaleDateString('pt-BR') }} às {{ new Date().toLocaleTimeString('pt-BR') }}

Financeiro e Vendas
Faturamento Realizado

R$ {{ formatMoney(totalReceived) }}

A Receber (Boletos pendentes)

R$ {{ formatMoney(totalPendingBoletos) }}

Ticket Médio por Venda

R$ {{ formatMoney(averageTicket) }}

Insumos e Descontos por Embalagem
Valor Bruto Total (Vendas)

R$ {{ formatMoney(totalGrossRevenue) }}

(-) Custo Total Insumos

R$ {{ formatMoney(totalInsumosCostAllSales) }}

Sacolas, logos, embalagens
Valor Líquido Real

R$ {{ formatMoney(totalNetRevenue) }}

Bruto menos insumos
Observação sobre Insumos: Os custos de insumos (sacolas, logos, embalagens) são deduzidos automaticamente a cada venda realizada a partir desta atualização. Vendas anteriores não possuem esse registro pois o sistema de insumos foi implementado recentemente.
Desempenho e Lucratividade
Lucro Bruto (Apenas Peças)

R$ {{ formatMoney(productProfit) }}

Vendas: R$ {{ formatMoney(totalReceived) }} Custo Unidades Vendidas: -R$ {{ formatMoney(cogsValue) }}
Lucro Líquido Real

R$ {{ formatMoney(netProfit) }}

(Sobra Limpa no Bolso)
Margem de Lucro Global (%)

{{ profitMargin.toFixed(1).replace('.', ',') }}%

Saídas, Custos e Prejuízos
Despesas Operacionais

R$ {{ formatMoney(totalOperationalExpenses) }}

Prejuízo c/ Avarias / Perdas

R$ {{ formatMoney(totalProductLosses) }}

Taxas Maquininha + Fretes

R$ {{ formatMoney(totalFees + totalDelivery) }}

Estoque de Insumos Atual
InsumoTipoCusto Unit.EstoqueValor Total
{{ ins.name }}
{{ ins.type }} R$ {{ formatMoney(ins.cost) }} {{ ins.quantity }} un. R$ {{ formatMoney((Number(ins.cost) || 0) * (Number(ins.quantity) || 0)) }}
Valor Total em Insumos: {{ db.insumos.reduce((s, i) => s + (Number(i.quantity) || 0), 0) }} un. R$ {{ formatMoney(db.insumos.reduce((s, i) => s + ((Number(i.cost) || 0) * (Number(i.quantity) || 0)), 0)) }}
Detalhamento de Viagens e Custos
VG-{{ index + 1 }}: {{ trip.destination }}
Data de Saída: {{ formatDate(trip.departureDate) }}
DataTipo de GastoObservaçãoValor (R$)
{{ formatDate(exp.date) }} {{ exp.type }} - {{ exp.specificType }} {{ exp.observation }} R$ {{ formatMoney(exp.amount) }}
Sem gastos lançados.
Custo Total da Viagem: R$ {{ formatMoney(trip.expenses.reduce((s,e)=>s+Number(e.amount),0)) }}
Custo Total Acumulado (Todas as Viagens): R$ {{ formatMoney(totalTripsCost) }}
Posição do Estoque e Projeções
Estoque Físico

{{ itemsInStock.reduce((acc, i) => acc + (i.quantity || 1), 0) }} un

Custo Parado: R$ {{ formatMoney(stockValue) }}
Com Clientes (Condicional)

{{ totalExperimentacaoQty }} un

Risco na Rua: R$ {{ formatMoney(totalExperimentacaoCost) }}
A Receber (Boletos)

R$ {{ formatMoney(totalPendingBoletos) }}

{{ groupedPendingBoletos.length }} Pendentes
Projeção Lucro Futuro

R$ {{ formatMoney(projectedFutureProfit) }}

Venda Total: R$ {{ formatMoney(projectedTotalRevenue) }}
Calendário de Recebimentos Futuros
Data PrevistaClienteDetalhe do PagamentoValor Estimado
{{ rec.date === 'SEM DATA' ? 'Sem data definida' : formatDate(rec.date) }} {{ rec.buyer }} {{ rec.parcelInfo }} R$ {{ formatMoney(rec.value) }}
Total a Receber:R$ {{ formatMoney(upcomingReceivables.reduce((sum, r) => sum + r.value, 0)) }}
Detalhamento Completo de Boletos e Recebimentos Pendentes ({{ groupedPendingBoletos.length }})
ClienteData VendaCanalFormaValor TotalValor PagoSaldo DevedorDatas de VencimentoItens do PedidoObservação
{{ group.buyer }} {{ formatDate(group.date) }} {{ group.channel }} {{ group.paymentMethod }} R$ {{ formatMoney(group.totalValue) }} R$ {{ formatMoney(group.amountPaid || 0) }} R$ {{ formatMoney(group.totalValue - (group.amountPaid || 0)) }} Sem data definida {{ formatDate(typeof pd === 'string' ? pd : pd.date) }}
{{ getItemName(it.itemId) }} ({{ it.qty || 1 }}x) - R$ {{ formatMoney(it.value) }}
{{ group.paymentObservation || '-' }}
Totais: R$ {{ formatMoney(groupedPendingBoletos.reduce((s,g)=>s+g.totalValue,0)) }} R$ {{ formatMoney(groupedPendingBoletos.reduce((s,g)=>s+(g.amountPaid||0),0)) }} R$ {{ formatMoney(totalPendingBoletos) }}
Histórico Completo de Vendas Finalizadas ({{ groupedCompletedSales.length }})
DataClienteCanalForma PgtoItensInsumosTaxasFreteTotal
{{ formatDate(group.date) }} {{ group.buyer }} {{ group.channel }} {{ group.paymentMethod }}
{{ getItemName(it.itemId) }} ({{ it.qty || 1 }}x)
-R$ {{ formatMoney(group.insumosCost) }} -
{{ ins.name }}({{ ins.qty }}x)
R$ {{ formatMoney(group.fees) }} R$ {{ formatMoney(group.delivery) }} R$ {{ formatMoney(group.totalValue) }}
Total Vendido (Finalizado):-R$ {{ formatMoney(groupedCompletedSales.reduce((s,g)=>s+(g.insumosCost||0),0)) }}R$ {{ formatMoney(groupedCompletedSales.reduce((s,g)=>s+g.fees,0)) }}R$ {{ formatMoney(groupedCompletedSales.reduce((s,g)=>s+g.delivery,0)) }}R$ {{ formatMoney(groupedCompletedSales.reduce((s,g)=>s+g.totalValue,0)) }}
Estoque Atual Completo ({{ itemsInStock.length }} itens | R$ {{ formatMoney(stockValue) }})
IDProdutoCategoriaMarcaTam.CorQtdCusto Unit.Preço VendaLocalData Entrada
{{ item.id }} {{ item.name }} {{ item.category }} {{ item.brand || '-' }} {{ item.size || '-' }} {{ item.color || '-' }} {{ item.quantity || 1 }} R$ {{ formatMoney(item.cost) }} R$ {{ formatMoney(item.salePrice) }} {{ item.location || '-' }} {{ formatDate(item.date) }}
Valor Total em Estoque (Custo):R$ {{ formatMoney(stockValue) }}
Despesas, Avarias e Perdas Detalhadas ({{ db.expenses.length }})
DataMotivoTipoForma PgtoValor
{{ formatDate(exp.date) }} {{ exp.reason }} {{ exp.isProductLoss ? 'AVARIA' : (exp.isCustomsLoss ? 'ALFÂNDEGA' : 'OPERACIONAL') }} {{ exp.paymentMethod || '-' }} R$ {{ formatMoney(exp.amount) }}
Total de Despesas/Perdas:R$ {{ formatMoney(db.expenses.reduce((s,e)=>s+Number(e.amount),0)) }}
Produtos em Condicional com Clientes ({{ experimentacaoItems.length }})
ProdutoClienteCustoPreço Sugerido
{{ item.name }} {{ item.experimentacaoClient }} R$ {{ formatMoney(item.cost) }} R$ {{ formatMoney(item.salePrice) }}
Encomendas de Clientes ({{ pendingEncomendasCount }} pendentes)
ClienteProdutoStatus
{{ enc.customer }} {{ enc.product }} {{ enc.size }} {{ enc.color }} {{ enc.status }}
Lista de Compras ({{ pendingComprasCount }} pendentes)
ProdutoQtdStatus
{{ c.product }} {{ c.size }} {{ c.color }} {{ c.qty }} {{ c.status }}
Log de Auditoria - Últimas {{ Math.min(db.systemLogs.length, 100) }} Ações
DataAçãoDetalhesUsuárioStatus
{{ log.date }} {{ log.action }} {{ log.details }} {{ log.user }} REVERTIDO
Evolução de Faturamento Mensal
Top 3 Produtos (Carros-Chefes)
{{index+1}}º {{ prod.name }} {{ prod.quantity }} un
Sem dados suficientes
Destaques Amplos
Melhor Categoria: {{ topCategories[0]?.name || 'N/A' }}
Melhor Marca: {{ topBrands[0]?.name || 'N/A' }}
Alerta de Capital Congelado (Itens parados há mais de 30 dias)
IDProdutoMarcaData CompraDias ParadoQtdCusto Empatado
{{ item.id }} {{ item.name }} {{ item.brand || '-' }} {{ formatDate(item.date) }} {{ item.daysInStock }} dias {{ item.quantity || 1 }} R$ {{ formatMoney(Number(item.cost) * (item.quantity || 1)) }}
Parabéns! Seu estoque está girando rápido. Nenhum produto com mais de 30 dias.
Capital Total Congelado:R$ {{ formatMoney(stagnantItems.reduce((s,i)=>s+(Number(i.cost)*(i.quantity||1)),0)) }}
Consultoria Estratégica (Inteligência Artificial)
Top 5 Clientes
#ClienteComprasTotal Gasto
{{ i+1 }}º {{ c.name }} {{ c.quantity }} un R$ {{ formatMoney(c.totalSpent) }}
Sem dados suficientes
Top Marcas / Categorias
#MarcaQtd VendidaFaturamento
{{ i+1 }}º {{ b.name }} {{ b.quantity }} un R$ {{ formatMoney(b.totalRevenue) }}
Sem dados suficientes

Clique no botão "Gerar Ideias" no topo para a IA analisar suas marcas mais fortes e sugerir 3 novos produtos lucrativos para o seu catálogo.

Capital Investido (Sócios)
R$ {{ formatMoney(totalInvested) }}
Total Recebido (Caixa)
R$ {{ formatMoney(totalReceived) }}
Saídas de Caixa (Compras+Geral)
R$ {{ formatMoney(totalSpent + totalFees + totalDelivery) }}
Disponível em Caixa
R$ {{ formatMoney(availableCash) }}
Meta: Atingida!Falta R$ {{ formatMoney(Math.max(0, totalInvested - totalReceived)) }}
Valor Bruto (Total Vendas)
R$ {{ formatMoney(totalGrossRevenue) }}
Soma de todas as vendas realizadas
(-) Total Insumos (Emb/Sacola/Logo)
R$ {{ formatMoney(totalInsumosCostAllSales) }}
Custo dos insumos utilizados nas vendas
Valor Líquido (Após Insumos)
R$ {{ formatMoney(totalNetRevenue) }}
Valor real recebido descontando insumos
Projeção de Lucro Futuro

Se vender todo o estoque atual pelo preço cheio.

R$ {{ formatMoney(projectedFutureProfit) }}

Valor de Venda: R$ {{ formatMoney(projectedTotalRevenue) }}
Custo do Estoque: R$ {{ formatMoney(stockValue) }}
Em Condicional

Itens emprestados com clientes.

{{ totalExperimentacaoQty }} un

Custo na Rua: R$ {{ formatMoney(totalExperimentacaoCost) }}
A Receber

Valor de boletos pendentes.

R$ {{ formatMoney(totalPendingBoletos) }}

{{ groupedPendingBoletos.length }} pedido(s)
Lucro Sobre Peças

(Valor Recebido - Custo de Compra)

R$ {{ formatMoney(productProfit) }}

Recebido:R$ {{ formatMoney(totalReceived) }}
Custo Vendido:- R$ {{ formatMoney(cogsValue) }}
Custos e Despesas

(Descontados do Lucro Acima)

  • Taxas (Maquininha/Boleto):R$ {{ formatMoney(totalFees) }}
  • Combustível / Entregas:R$ {{ formatMoney(totalDelivery) }}
  • Despesas Operacionais:R$ {{ formatMoney(totalOperationalExpenses) }}
  • Perdas/Avarias (Prejuízo):R$ {{ formatMoney(totalProductLosses) }}
  • Alfândega/Retenções:R$ {{ formatMoney(totalCustomsLosses) }}
Lucro Líquido Real (Sobra no Bolso)

R$ {{ formatMoney(netProfit) }}

Total Viagens

(Valor isolado. Não abate do lucro global)

R$ {{ formatMoney(totalTripsCost) }}

{{ db.trips ? db.trips.length : 0 }} Viagem(ns) Registrada(s)

Vitrine de Produtos

{{ item.quantity || 1 }} Disp.

SEM FOTO
{{ item.name }}
TAM: {{ item.size }} | COR: {{ item.color }}
R$ {{ formatMoneyPublic(effectiveSalePrice(item)) }} PROMOÇÃO

Encomendas

Produtos disponíveis para encomendar. Valores sob consulta.


SEM FOTO
{{ item.name }}
{{ item.brand }} TAM: {{ item.size }} | COR: {{ item.color }}
SOB ENCOMENDA
Nenhum produto encontrado.

Vitrine Restrita (+18)

Estes produtos não aparecem nos catálogos públicos.

Estoque Físico (+18)
{{ item.quantity || 1 }} Disp.

SEM FOTO
{{ item.name }}
TAM: {{ item.size }} | COR: {{ item.color }}
R$ {{ formatMoney(item.salePrice || item.cost * 1.5) }}
Nenhum item +18 no estoque físico.
Mostruário Permanente (+18)

SEM FOTO
{{ item.name }}
TAM: {{ item.size }} | COR: {{ item.color }}
Nenhum item +18 no mostruário.

Mostruário Geral de Produtos (Catálogo Base)

Cadastre aqui tudo o que a loja trabalha ou pode encomendar. Itens no estoque físico ficam atrelados a estes modelos.

Adicionar Novo Modelo ao Mostruário
Modelos Cadastrados ({{ catalogFilteredItems.length }})

SEM FOTO
{{ item.name }}
{{ item.brand }} | TAM: {{ item.size }}
Nenhum modelo encontrado no mostruário.

Indicadores e Desempenho

Análise detalhada de vendas por mês, marcas, categorias e clientes.

Desempenho Mensal
Mês / AnoQtd PeçasFaturamentoCarro-Chefe
{{ m.label }} {{ m.quantity }} un R$ {{ formatMoney(m.revenue) }} {{ m.topProduct }}
Sem vendas registradas ainda.
Top Clientes
ClientePeças CompradasTotal Gasto
{{ c.name }}
MARCA: {{ c.brand }} | COR: {{ c.color }} | TAM: {{ c.size }}
{{ c.quantity }} un R$ {{ formatMoney(c.totalSpent) }}
Nenhum cliente identificado.
Marcas Mais Vendidas
MarcaQuantidadeReceita Gerada
{{ b.name }} {{ b.quantity }} un R$ {{ formatMoney(b.totalRevenue) }}
Sem dados de marcas.
Categorias Mais Vendidas
CategoriaQuantidadeReceita Gerada
{{ c.name }}
MARCA: {{ c.brand }} | COR: {{ c.color }} | TAM: {{ c.size }}
{{ c.quantity }} un R$ {{ formatMoney(c.totalRevenue) }}
Sem dados de categorias.
Atenção: {{ stockSaleMismatches.length }} produto(s) já vendido(s) ainda aparecem com estoque disponível

Isso pode acontecer quando a quantidade em estoque não foi atualizada corretamente em uma venda antiga. Confira cada um abaixo e corrija se a quantidade realmente não bate com o que você tem fisicamente.

ProdutoEstoque MostradoJá Vendido (nos registros)Ação
{{ entry.item.name }} ({{ entry.item.brand || 'sem marca' }}) {{ entry.currentQty }} {{ entry.soldQty }}

Cadastrar Novo Produto

Enviando foto...
Filtrar Estoque
Pesquisa
Categoria
Marca
Cor
Tamanho
Gênero
Público
Estoque Físico Atual
{{ filteredItemsInStock.length }} itens no estoque
IDFotoProduto / CategoriaEspecificaçõesPreço VendaCusto Unit.Custo TotalAções
{{ item.id }}
SEM
{{ item.name }} +18
{{ item.category || 'GERAL' }}
TAM: {{ item.size }} COR: {{ item.color }} MARCA: {{ item.brand }}
Qtd: {{ item.quantity || 1 }} un
R$ {{ formatMoney(effectiveSalePrice(item)) }} PROMO R$ {{ formatMoney(item.cost) }} R$ {{ formatMoney(Number(item.cost) * (item.quantity || 1)) }}
Nenhum produto encontrado no estoque com os filtros selecionados.

Itens em Promoção

Coloque um item do estoque em promoção por um período: ele fica com o preço promocional só durante essas datas e volta ao preço normal sozinho quando o prazo acabar.

Itens Disponíveis no Estoque (fora de promoção)
ProdutoEspecificaçõesPreço AtualAção
{{ item.name }} {{ item.brand }} | TAM: {{ item.size }} | COR: {{ item.color }} R$ {{ formatMoney(item.salePrice || item.cost * 1.5) }}
Todo o estoque já está em promoção, ou não há itens cadastrados.
Itens Marcados para Promoção ({{ promotionItems.length }})
ProdutoPreço NormalPreço PromocionalPeríodoStatusAções
{{ item.name }}
{{ item.brand }} | TAM: {{ item.size }} | COR: {{ item.color }}
R$ {{ formatMoney(item.promoOriginalPrice) }} R$ {{ formatMoney(item.promoPrice) }} {{ formatDate(item.promoStartDate) }} até {{ formatDate(item.promoEndDate) }} ATIVA AGORA AGENDADA EXPIRADA
Nenhum item em promoção no momento.

Cadastrar Insumo

Materiais de embalagem/uso interno (sacolas Kraft, logos impressos, etc.) — não entram na Vitrine nem no Estoque de produtos para venda.

Enviando foto...
Estoque baixo: {{ lowStockInsumos.map(i => i.name + (i.size ? ' ('+i.size+')' : '')).join(', ') }}.
{{ item.name }}

{{ item.type }} • {{ item.size }}

Custo: R$ {{ formatMoney(item.cost) }}

Estoque: {{ item.quantity }} un.

Nenhum insumo cadastrado ainda.

Produtos com Clientes (Condicional / Experimentação)

Itens que foram emprestados para clientes testarem ou avaliarem.

ClienteProdutoMarcaQuantidadeAções
{{ item.experimentacaoClient }} {{ item.name }} {{ item.brand || '-' }} {{ item.quantity || 1 }} un
Nenhum produto em experimentação no momento.

Gestão de Boletos e Vendas a Receber

Acompanhe os recebimentos pendentes, datas de vencimento e parcelas em aberto.

Calendário de Vencimentos ({{ calendarMonthNameAndYear }})
DOM
SEG
TER
QUA
QUI
SEX
SÁB
{{ dayObj.day }}
VENCIMENTO

Clique em um dia com vencimento pra filtrar só os boletos daquela data na lista abaixo.

Pedidos Pendentes de Recebimento ({{ filteredPendingBoletos.length }}{{ (boletoSearchTerm.trim() || calendarDayFilter) ? ' de ' + groupedPendingBoletos.length : '' }})
Filtrando: {{ formatDate(calendarDayFilter) }}
{{ selectedBoletoIds.length }} pedido(s) selecionado(s) — Total: R$ {{ formatMoney(selectedBoletosTotalPending) }}
ClienteDataTipoTotalFalta ReceberVencimentos / DatasAções
{{ group.buyer }} {{ formatDate(group.date) }} {{ group.paymentMethod }} R$ {{ formatMoney(group.totalValue) }} R$ {{ formatMoney(group.totalValue - (group.amountPaid || 0)) }}
{{ formatDate(typeof pd === 'string' ? pd : pd.date) }}
{{ (boletoSearchTerm.trim() || calendarDayFilter) ? 'Nenhum boleto encontrado com esse filtro.' : 'Nenhum boleto ou pagamento pendente.' }}
Valor a Receber{{ calendarDayFilter ? ' (só ' + formatDate(calendarDayFilter) + ')' : (boletoSearchTerm.trim() ? ' (filtrado)' : ' (Total Geral)') }}: R$ {{ formatMoney(totalPendingBoletosFiltered) }}

Detalhes do Pedido

Cliente: {{ boletoShareCard.buyer }}

Data: {{ formatDate(boletoShareCard.date) }}

Forma de Pagamento: {{ boletoShareCard.paymentMethod }}

ItemQtdValor
{{ getFullItem(it.itemId).name || getItemName(it.itemId) }} {{ it.qty || 1 }} R$ {{ formatMoney(it.value) }}

Valor Total:R$ {{ formatMoney(boletoShareCard.totalValue) }}

Já Pago:R$ {{ formatMoney(boletoShareCard.amountPaid || 0) }}

Falta Pagar:R$ {{ formatMoney(boletoShareCard.totalValue - (boletoShareCard.amountPaid || 0)) }}

Gerado em {{ new Date().toLocaleDateString('pt-BR') }}

Resumo de Pedidos

{{ multiBoletoShareCard.length }} pedido(s) em aberto

{{ group.buyer }} — {{ formatDate(group.date) }}

Valor Total:R$ {{ formatMoney(group.totalValue) }}

Já Pago:R$ {{ formatMoney(group.amountPaid || 0) }}

Falta Pagar:R$ {{ formatMoney(group.totalValue - (group.amountPaid || 0)) }}

Total Geral a Receber:R$ {{ formatMoney(multiBoletoShareCard.reduce((s,g) => s + (g.totalValue - (g.amountPaid || 0)), 0)) }}

Gerado em {{ new Date().toLocaleDateString('pt-BR') }}

Ponto de Venda (PDV)

{{ selectedCartItemInfo.name }} - Cor: {{ selectedCartItemInfo.color || 'N/A' }}

Itens no Carrinho ({{ cart.length }})
ProdutoQtdSubtotalAções
{{ c.name }}
MARCA: {{ c.brand }} | COR: {{ c.color }} | TAM: {{ c.size }}
{{ c.qty }} R$ {{ formatMoney(c.value) }}
Carrinho vazio.

Insumos para Entrega

Selecione os insumos utilizados nesta venda (sacola, logo, embalagem, etc.). Eles serão baixados automaticamente do estoque.

{{ getSaleInsumoQty(insumo.id) }}
insumo
{{ insumo.name }}
R$ {{ formatMoney(insumo.cost) }}
Est: {{ insumo.quantity || 0 }} un.
{{ s.name }} ({{ s.qty }}x) - R$ {{ formatMoney(s.cost * s.qty) }}
Custo Total Insumos: -R$ {{ formatMoney(saleInsumosTotal) }}

Fechamento da Venda

Valor Total da Venda (Produtos)

R$ {{ formatMoney(cartTotal) }}

(-) Insumos: R$ {{ formatMoney(saleInsumosTotal) }}
Valor Líquido: R$ {{ formatMoney(cartTotal - saleInsumosTotal) }}

Gestão de Despesas e Perdas

Registre contas pagas, custos operacionais e baixas por produtos danificados.

Despesa Operacional
Alfândega (Paraguai) / Retenções
Produto Avariado (Estoque)
Histórico de Despesas, Perdas e Retenções
DataCategoriaDescrição / MotivoValor Bloqueado/GastoAções
{{ formatDate(exp.date) }} AVARIA {{ exp.customsType }} OPERACIONAL {{ exp.reason }} {{ exp.paymentMethod }} R$ {{ formatMoney(exp.amount) }}
Nenhuma despesa ou perda registrada.

Controle de Viagens e Custos

Organize viagens de compras ou entregas e lance todos os gastos associados.

Abrir Nova Viagem
Viagens Registradas
{{ trip.destination }}

Saída: {{ formatDate(trip.departureDate) }}

Gastos Totais R$ {{ formatMoney((trip.expenses || []).reduce((s, e) => s + Number(e.amount), 0)) }}
Nenhuma viagem cadastrada.

Gestão de Encomendas

Registre os produtos que os clientes pediram para você trazer ou fabricar.

Nova Encomenda
Lista de Encomendas
StatusDataCliente (Canal)Produto EncomendadoCor / TamanhoObservaçãoAções
{{ enc.status }} {{ formatDate(enc.date) }} {{ enc.customer }} {{ enc.channel }} {{ enc.product }} {{ enc.color || '-' }} / {{ enc.size || '-' }} {{ enc.observation }}
Nenhuma encomenda registrada.

Lista de Compras

Anote os produtos que você precisa comprar para repor estoque ou atender encomendas.

Adicionar Item na Lista
Itens Pendentes para Compra
StatusProdutoQtdCor / TamanhoObservaçãoAções
{{ compra.status }} {{ compra.product }} {{ compra.qty }} un {{ compra.color || '-' }} / {{ compra.size || '-' }} {{ compra.observation }}
Sua lista de compras está vazia.

Histórico de Vendas Concluídas

Consulte todas as vendas já finalizadas e quitadas.

ClienteDataCanalPagamentoValor TotalAções
{{ group.buyer }} {{ formatDate(group.date) }} {{ group.channel }} {{ group.paymentMethod }} R$ {{ formatMoney(group.totalValue) }}
Nenhuma venda concluída no histórico.

Log de Auditoria do Sistema

Registro cronológico de todas as operações realizadas, com autor de cada ação. Como {{ userRoleLabel }}, você pode reverter cadastros, edições e exclusões de estoque feitas por qualquer usuário.

DataAçãoDetalhesUsuárioStatusAções
{{ log.date }} {{ log.time }} {{ log.action }} {{ log.details }} {{ log.user }} REVERTIDO
Nenhum log registrado.
Erro de permissão do Firebase: {{ teamLoadError }}
Provavelmente as Regras de Segurança do Firestore estão bloqueando o acesso. Confira no Console do Firebase → Firestore Database → Regras.
Chat
💬 Chat Geral
{{ contactPreviews['geral'].time }}
{{ contactPreviews['geral'].fromMe ? 'Você: ' : '' }}{{ contactPreviews['geral'].text }}
Todos os funcionários
{{ unreadCounts['geral'] }}
{{ getInitials(member.nome || member.email) }}
{{ member.nome || member.email.split('@')[0] }}
{{ contactPreviews[member.email].time }}
{{ contactPreviews[member.email].fromMe ? 'Você: ' : '' }}{{ contactPreviews[member.email].text }}
{{ ROLE_LABELS[member.role] || member.role }}
{{ unreadCounts[member.email] }}

Nenhum funcionário encontrado.
Cadastre a equipe em "Gestão de Acesso".
Selecione uma conversa

Assistente Virtual com Inteligência Artificial

Tire dúvidas sobre suas finanças, desempenho de vendas e projeções com a IA.

Olá! Sou seu assistente de gestão financeira. Como posso ajudar com os dados da sua loja hoje?
Pensando na resposta...

Gestão de Acesso

Só o Diretor vê essa aba. A concessão de acesso é feita manualmente abaixo, digitando o e-mail — isso evita liberar alguém sem querer por clique errado.

Erro ao carregar a equipe: {{ teamLoadError }}
Isso normalmente significa que as Regras de Segurança do Firestore estão bloqueando a leitura/escrita da coleção "equipe" ou "solicitacoes". Peça pra quem configurou o Firebase revisar as regras (Console do Firebase → Firestore Database → Regras).
Quem tentou entrar ({{ pendingAccessRequests.length }})

Apenas informativo — não tem botão de aprovar aqui de propósito. Use o campo "Conceder Acesso" logo abaixo com o e-mail da pessoa.

NomeE-mailTentou entrar em
{{ r.nome }} {{ r.email }} {{ r.dataSolicitacao ? new Date(r.dataSolicitacao).toLocaleString('pt-BR') : '-' }}
Ninguém tentou entrar recentemente.
Conceder Acesso

Digite o e-mail exato (copie da lista acima, se quiser) e escolha o cargo. É uma ação deliberada, com confirmação — reduz risco de liberar a pessoa errada.

Equipe atual ({{ teamMembers.length }})
NomeE-mailCargo
{{ m.nome || '-' }} VOCÊ {{ m.email }}

Configurações e Chaves de API

Configure suas chaves de acesso para os recursos de Inteligência Artificial e remoção de fundo.

Zerar Sistema (Testes)

Apaga todos os dados de teste do banco. Útil pra recomeçar do zero antes de importar dados reais, ou entre um teste e outro.

Atenção! Esta ação é irreversível. Todos os produtos, vendas, logs, despesas e configurações serão apagados.
Recomendação: Faça um backup extra antes (aba Estoque → Cópia Extra).
Sua equipe (aba "Gestão de Acesso") NÃO é apagada, para você não perder o próprio acesso de diretor.
{{ clearDbStatus.error }}
Banco limpo! Agora importe seu JSON pelo botão abaixo, se quiser.
Importar JSON

Escolha um arquivo JSON (do sistema offline, ou um backup deste próprio sistema) e clique em Importar — sem precisar de terminal.

{{ importJsonStatus.error }}
JSON importado com sucesso!

Se você importou com "Não enviar fotos agora", selecione o mesmo arquivo acima de novo a qualquer momento e clique aqui pra completar as fotos que ainda estão faltando — não duplica nada, só completa quem está pendente.

Chave IA Google Gemini

O motor de Inteligência Artificial que vai analisar seus dados e gerar anúncios automáticos e relatórios no chat.

Como pegar de graça:
1. Acesse aistudio.google.com/app/apikey
2. Faça login com o Gmail.
3. Clique no botão azul "Create API Key" e copie o código gerado.
Chave Recorte de Fundo (Remove.bg)

O motor que vai apagar o fundo bagunçado das fotos dos seus produtos automaticamente.

Como pegar de graça (50 fotos/mês):
1. Acesse remove.bg/api
2. Crie uma conta gratuita.
3. Vá no seu perfil em "API Key", clique em "New API Key" e copie.
Chave API OpenAI (ChatGPT)

Alternativa ao Gemini. Insira a chave do ChatGPT caso prefira utilizar o modelo da OpenAI no seu assistente e gerador de anúncios.

Como pegar (Requer adicionar créditos na plataforma):
1. Acesse platform.openai.com/api-keys
2. Faça login com sua conta da OpenAI.
3. Clique em "Create new secret key" e copie o código gerado.
Chave API Claude (Anthropic)

Outra alternativa de IA. Insira a chave da Anthropic caso prefira usar o Claude no seu assistente e gerador de anúncios.

Como pegar (Requer adicionar créditos na plataforma):
1. Acesse console.anthropic.com/settings/keys
2. Faça login com sua conta Anthropic.
3. Clique em "Create Key" e copie o código gerado.
Segurança e Backup

Você pode gerar um backup limpo do seu banco de dados sem as chaves de API caso deseje compartilhar ou arquivar.


Backup completo (com fotos embutidas): baixa cada foto do Drive e coloca dentro do próprio arquivo — fica maior e demora mais pra gerar, mas vira um arquivo 100% independente (funciona até se o Drive ficar indisponível, ou pra usar no modelo offline).

{{ fullBackupStatus.failed }} foto(s) não puderam ser baixadas e ficaram como link nesse arquivo.
Backup em Nuvem Automático (Google Drive)

Configure a integração com o Google Drive para fazer cópias de segurança automáticas. O armazenamento local continua sendo o principal (garantindo velocidade máxima).

Conectado e Monitorando
* Os backups serão nomeados sequencialmente (ex: backup_001.json).
* Se habilitado, um backup extra "FECHAMENTO" será salvo ao fechar a aba do sistema.

Gerador de Etiquetas de Preço

Adicione produtos do estoque na fila para imprimir etiquetas térmicas com QR Code.

Fila de Impressão Atual
ProdutoTamanho/CorPreçoRemover
{{ lbl.name }} {{ lbl.size || '-' }} / {{ lbl.color || '-' }} R$ {{ formatMoney(lbl.price) }}
Nenhuma etiqueta na fila. Vá no Estoque e clique no ícone de código de barras.