ℹ️ Clique nos produtos abaixo para adicionar ao pedido. O estoque será baixado automaticamente ao finalizar.
Selecionar Produtos
Carrinho do Pedido
Total: R$ 0,00
Pedidos Gerados
Nº Pedido
Data
Loja
Qtd Itens
Valor Total
Status
Ações
Contas a Pagar (Pedidos e Despesas)
Tipo
Loja
Referência
Data
Valor Original
Valor Pago
Saldo
Status
Ações
Cadastro de Contas Bancárias
Conta Virtual CD (banco virtual)
O CD não tem conta real; compras são pagas pelas contas das lojas. Quando uma loja paga um débito ou você paga uma despesa/compra do CD usando a conta de uma loja, o valor é creditado aqui e o débito da loja é abatido.
Saldo atual (créditos recebidos)
R$ 0,00
Data
Descrição
Loja
Valor
Movimentações e ajustes
Contas Cadastradas (saldo por movimentações)
ID
Banco
Titular
Loja
Tipo
Saldo
Ações
💵 Nova Venda
Vendas realizadas
Data
Loja
Valor
Formas
📥 Contas a Receber
Origem
Vencimento
Valor
Taxa
Líquido
Status
Ações
💸 Lançar despesa (gera Conta a Pagar)
Despesas lançadas
Data
Loja
Descrição
Categoria
Valor
Vencimento
📊 DRE - Demonstração do Resultado do Exercício
Descrição
Valor (R$)
%
Selecione o período e clique em Atualizar
💸 Despesas por Categoria
Categoria
Quantidade
Valor Total
% do Total
Clique em Atualizar para ver o relatório
🏪 Despesas por Loja (Comparativo)
Loja
Qtd Despesas
Valor Total
Média por Despesa
Clique em Atualizar para ver o relatório
ℹ️ Cadastros Gerais Todos os cadastros do sistema estão consolidados aqui: Lojas, Fornecedores, Contas Bancárias e Categorias de Despesas.
🏪 Lojas / Unidades
Lojas Cadastradas
ID
Nome
CNPJ
Tipo
Status
Ações
🚚 Fornecedores
Fornecedores Cadastrados
ID
Nome
CNPJ
Contato
Status
Ações
📋 Categorias de Despesas
💡 Dica: As categorias aqui definidas aparecerão no SELECT ao lançar despesas.
Categorias Cadastradas
Categoria
Tipo
Ações
📦 Categorias de Produtos
💡 Dica: As categorias aqui definidas aparecerão no SELECT ao cadastrar produtos.
Categorias Cadastradas
Categoria
Descrição
Ações
💰 Contas Bancárias e Caixas
Contas Cadastradas
ID
Banco
Titular
Loja
Tipo
Ações
Registrar Pagamento
Adicionar Fornecedor
Pagar despesa/compra do CD com conta de loja
O valor será debitado da conta escolhida. Se a conta for de uma loja, o débito dela ao CD será abatido e o valor creditado na Conta Virtual do CD.
Lançar entrada
Transferência entre contas
Ajuste de saldo
Informe o saldo que a conta deve passar a ter. O sistema lançará um ajuste (diferença) para conciliar.
Registrar Recebimento
// ============================================
// CAMADA DE SINCRONIZAÇÃO SUPABASE
// Adiciona persistência em banco real mantendo appData
// ============================================
async function syncFromSupabase() {
try {
console.log('📥 Sincronizando do Supabase...');
const [
{ data: lojas },
{ data: produtos },
{ data: categoriasProduto },
{ data: fornecedores },
{ data: estoque },
{ data: vendas },
{ data: despesas },
{ data: contasPagar },
{ data: notasEntrada },
{ data: contasBancarias },
{ data: contaVirtualCD }
] = await Promise.all([
supa.from('lojas').select('*'),
supa.from('produtos').select('*'),
supa.from('categorias_produto').select('*'),
supa.from('fornecedores').select('*'),
supa.from('estoque').select('*'),
supa.from('vendas').select('*'),
supa.from('despesas').select('*'),
supa.from('contas_pagar').select('*'),
supa.from('notas_entrada').select('*'),
supa.from('contas_bancarias').select('*'),
supa.from('conta_virtual_cd').select('*')
]);
// Popular appData mantendo estrutura existente
if (lojas && lojas.length > 0) appData.lojas = lojas;
if (produtos && produtos.length > 0) appData.produtos = produtos;
if (categoriasProduto && categoriasProduto.length > 0) appData.categoriasProduto = categoriasProduto;
if (fornecedores && fornecedores.length > 0) appData.fornecedores = fornecedores;
if (estoque && estoque.length > 0) appData.estoque = estoque;
if (vendas && vendas.length > 0) appData.vendas = vendas;
if (despesas && despesas.length > 0) appData.despesas = despesas;
if (contasPagar && contasPagar.length > 0) appData.contasPagar = contasPagar;
if (notasEntrada && notasEntrada.length > 0) appData.notasEntrada = notasEntrada;
if (contasBancarias && contasBancarias.length > 0) appData.contas = contasBancarias;
if (contaVirtualCD && contaVirtualCD.length > 0) {
appData.contaVirtualCD = { movimentacoes: contaVirtualCD };
}
console.log('✅ Dados sincronizados do Supabase');
return true;
} catch (error) {
console.error('Erro ao carregar do Supabase:', error);
return false;
}
}
async function syncToSupabase() {
try {
console.log('📤 Salvando no Supabase...');
// Salvar cada entidade (silenciosamente, sem bloquear UI)
const promises = [];
if (appData.produtos && appData.produtos.length > 0) {
promises.push(supa.from('produtos').upsert(appData.produtos));
}
if (appData.estoque && appData.estoque.length > 0) {
promises.push(supa.from('estoque').upsert(appData.estoque));
}
if (appData.vendas && appData.vendas.length > 0) {
promises.push(supa.from('vendas').upsert(appData.vendas));
}
if (appData.despesas && appData.despesas.length > 0) {
promises.push(supa.from('despesas').upsert(appData.despesas));
}
if (appData.contasPagar && appData.contasPagar.length > 0) {
promises.push(supa.from('contas_pagar').upsert(appData.contasPagar));
}
if (appData.notasEntrada && appData.notasEntrada.length > 0) {
promises.push(supa.from('notas_entrada').upsert(appData.notasEntrada));
}
if (appData.contas && appData.contas.length > 0) {
promises.push(supa.from('contas_bancarias').upsert(appData.contas));
}
if (appData.contaVirtualCD && appData.contaVirtualCD.movimentacoes) {
promises.push(supa.from('conta_virtual_cd').upsert(appData.contaVirtualCD.movimentacoes));
}
await Promise.all(promises);
console.log('✅ Dados salvos no Supabase');
return true;
} catch (error) {
console.error('Erro ao salvar no Supabase:', error);
return false;
}
}
// Auto-sync a cada 30 segundos (silencioso)
setInterval(function() {
if (appData && Object.keys(appData).length > 0) {
syncToSupabase().catch(console.error);
}
}, 30000);
console.log('✅ Camada de sincronização Supabase carregada');