Configurações do Banco de Dados (Supabase)
Configure a conexão direta com o Supabase para que a página grave os leads e carregue as lojas de forma permanente na nuvem.
📧 Como resolver falhas no envio de e-mails pelo Make.com:
- 1. Testar e Redeterminar a Estrutura (Re-determine Data Structure): No Make.com, clique com o botão direito no módulo Custom Webhook, escolha "Re-determine data structure" e clique no botão 🧪 Testar Disparo do Make acima.
- 2. Mapeamento dos Campos: No módulo de e-mail do Make (Gmail, Outlook ou SMTP), certifique-se de que o campo To (Para) esteja apontado para o campo
email. - 3. Conexão do Gmail / E-mail no Make: Se estiver usando o módulo do Gmail no Make, verifique se a conta não expirou. Caso ocorra erro de autorização no Make, acesse Connections > Re-authorize na sua conta de e-mail dentro do Make.
- 4. Ligar a Automação (ON): Lembre-se de ativar a chave do cenário no canto inferior esquerdo do Make.com para ON (Immediately).
🛠️ Script SQL para criação das tabelas no Supabase:
Copie e execute o código abaixo no menu **SQL Editor** do seu painel do Supabase para criar ou atualizar as tabelas do projeto:
-- 1. Tabela de Leads Promocionais com Loja e Voucher
create table if not exists leads_personality (
id uuid default gen_random_uuid() primary key,
name text not null,
email text not null,
whatsapp text not null,
message text,
loja text,
loja_endereco text,
loja_telefone text,
voucher text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 2. Tabela de Lojas Licenciadas
create table if not exists lojas_licenciadas (
id uuid default gen_random_uuid() primary key,
nome text not null,
endereco text,
telefone text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 3. Tabela de Acessos de Lojas Credenciadas
create table if not exists acessos_lojas (
id uuid default gen_random_uuid() primary key,
loja_nome text not null unique,
usuario text not null unique,
senha text not null,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 4. Tabela de Equipe Técnica (Suporte & Garantia)
create table if not exists tecnicos_personality (
id uuid default gen_random_uuid() primary key,
nome text not null,
email text not null,
whatsapp text not null,
especialidade text default 'Assistência Geral',
loja_atendida text default 'Todas as Lojas',
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 5. Tabela de Chamados de Assistência Técnica (Com O.S., CRM Médico, Tratamento e Data da Compra)
create table if not exists chamados_assistencia (
id uuid default gen_random_uuid() primary key,
protocolo text not null,
cliente_nome text not null,
cliente_email text not null,
cliente_whatsapp text not null,
loja_nome text not null,
linha_produto text not null,
tratamento text not null,
data_compra date not null,
os_numero text not null,
medico_crm text not null,
motivo text not null,
data_atendimento date not null,
horario_atendimento text not null,
tecnico_nome text not null,
tecnico_email text not null,
tecnico_whatsapp text not null,
status text default 'Agendado',
observacoes text,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 6. Tabela de Motivos do Chamado
create table if not exists motivos_assistencia (
id uuid default gen_random_uuid() primary key,
motivo text not null unique,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 7. Tabela de Profissionais da Saúde Cadastrados
create table if not exists profissionais_personality (
id uuid default gen_random_uuid() primary key,
nome text not null,
cpf_cnpj text not null,
email text not null,
whatsapp text not null,
telefone text,
clinica text not null,
newsletter boolean default false,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 8. Tabela de Vendedores
create table if not exists vendedores_personality (
id uuid default gen_random_uuid() primary key,
nome text not null,
cpf text not null unique,
loja text not null,
whatsapp text not null,
email text not null unique,
usuario text not null unique,
senha text not null,
aprovado boolean default false,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 9. Tabela de Configurações de Prêmios por Produto
create table if not exists premios_config_personality (
id uuid default gen_random_uuid() primary key,
categoria text not null, -- 'lente' ou 'antirreflexo'
nome text not null unique,
pontos numeric not null,
valor numeric not null,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 10. Tabela de Prêmios Lançados (Vendas de Vendedores)
create table if not exists premios_lancados_personality (
id uuid default gen_random_uuid() primary key,
vendedor_id uuid not null,
vendedor_nome text not null,
loja text not null,
os text not null unique,
cliente_nome text not null,
lente_familia text not null,
ar_familia text not null,
data_venda date not null,
pontos_lente numeric default 0,
valor_lente numeric default 0,
pontos_ar numeric default 0,
valor_ar numeric default 0,
status text default 'Pendente', -- 'Pendente', 'Validado' ou 'Pago'
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 11. Tabela de O.S. Autorizadas (Vendas Pré-lançadas pelo Laboratório)
create table if not exists os_autorizadas_personality (
id uuid default gen_random_uuid() primary key,
os text not null unique,
cpf_vendedor text not null,
loja text not null,
cliente_nome text not null,
lente_familia text not null,
ar_familia text not null,
utilizada boolean default false,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
-- 12. Tabela de Configurações Gerais
create table if not exists config_geral_personality (
chave text primary key,
valor text not null,
created_at timestamp with time zone default timezone('utc'::text, now()) not null
);
insert into config_geral_personality (chave, valor) values ('valor_ponto', '1.00') on conflict (chave) do nothing;
-- Habilitar RLS (Row Level Security) e Criar Políticas de Acesso Nativas
alter table leads_personality enable row level security;
alter table lojas_licenciadas enable row level security;
alter table profissionais_personality enable row level security;
alter table acessos_lojas enable row level security;
alter table tecnicos_personality enable row level security;
alter table chamados_assistencia enable row level security;
alter table motivos_assistencia enable row level security;
alter table vendedores_personality enable row level security;
alter table premios_config_personality enable row level security;
alter table premios_lancados_personality enable row level security;
alter table os_autorizadas_personality enable row level security;
alter table config_geral_personality enable row level security;
-- Criar Políticas de Permissão Pública (Limpando antigas se existirem)
drop policy if exists "Permitir select em leads_personality" on leads_personality;
drop policy if exists "Permitir insert em leads_personality" on leads_personality;
drop policy if exists "Permitir update em leads_personality" on leads_personality;
drop policy if exists "Permitir delete em leads_personality" on leads_personality;
create policy "Permitir select em leads_personality" on leads_personality for select using (true);
create policy "Permitir insert em leads_personality" on leads_personality for insert with check (true);
create policy "Permitir update em leads_personality" on leads_personality for update using (true);
create policy "Permitir delete em leads_personality" on leads_personality for delete using (true);
drop policy if exists "Permitir select em profissionais_personality" on profissionais_personality;
drop policy if exists "Permitir insert em profissionais_personality" on profissionais_personality;
drop policy if exists "Permitir update em profissionais_personality" on profissionais_personality;
drop policy if exists "Permitir delete em profissionais_personality" on profissionais_personality;
create policy "Permitir select em profissionais_personality" on profissionais_personality for select using (true);
create policy "Permitir insert em profissionais_personality" on profissionais_personality for insert with check (true);
create policy "Permitir update em profissionais_personality" on profissionais_personality for update using (true);
create policy "Permitir delete em profissionais_personality" on profissionais_personality for delete using (true);
drop policy if exists "Permitir select em lojas_licenciadas" on lojas_licenciadas;
drop policy if exists "Permitir insert em lojas_licenciadas" on lojas_licenciadas;
drop policy if exists "Permitir update em lojas_licenciadas" on lojas_licenciadas;
drop policy if exists "Permitir delete em lojas_licenciadas" on lojas_licenciadas;
create policy "Permitir select em lojas_licenciadas" on lojas_licenciadas for select using (true);
create policy "Permitir insert em lojas_licenciadas" on lojas_licenciadas for insert with check (true);
create policy "Permitir update em lojas_licenciadas" on lojas_licenciadas for update using (true);
create policy "Permitir delete em lojas_licenciadas" on lojas_licenciadas for delete using (true);
drop policy if exists "Permitir select em acessos_lojas" on acessos_lojas;
drop policy if exists "Permitir insert em acessos_lojas" on acessos_lojas;
drop policy if exists "Permitir update em acessos_lojas" on acessos_lojas;
drop policy if exists "Permitir delete em acessos_lojas" on acessos_lojas;
create policy "Permitir select em acessos_lojas" on acessos_lojas for select using (true);
create policy "Permitir insert em acessos_lojas" on acessos_lojas for insert with check (true);
create policy "Permitir update em acessos_lojas" on acessos_lojas for update using (true);
create policy "Permitir delete em acessos_lojas" on acessos_lojas for delete using (true);
drop policy if exists "Permitir select em tecnicos_personality" on tecnicos_personality;
drop policy if exists "Permitir insert em tecnicos_personality" on tecnicos_personality;
drop policy if exists "Permitir update em tecnicos_personality" on tecnicos_personality;
drop policy if exists "Permitir delete em tecnicos_personality" on tecnicos_personality;
create policy "Permitir select em tecnicos_personality" on tecnicos_personality for select using (true);
create policy "Permitir insert em tecnicos_personality" on tecnicos_personality for insert with check (true);
create policy "Permitir update em tecnicos_personality" on tecnicos_personality for update using (true);
create policy "Permitir delete em tecnicos_personality" on tecnicos_personality for delete using (true);
drop policy if exists "Permitir select em chamados_assistencia" on chamados_assistencia;
drop policy if exists "Permitir insert em chamados_assistencia" on chamados_assistencia;
drop policy if exists "Permitir update em chamados_assistencia" on chamados_assistencia;
drop policy if exists "Permitir delete em chamados_assistencia" on chamados_assistencia;
create policy "Permitir select em chamados_assistencia" on chamados_assistencia for select using (true);
create policy "Permitir insert em chamados_assistencia" on chamados_assistencia for insert with check (true);
create policy "Permitir update em chamados_assistencia" on chamados_assistencia for update using (true);
create policy "Permitir delete em chamados_assistencia" on chamados_assistencia for delete using (true);
drop policy if exists "Permitir select em motivos_assistencia" on motivos_assistencia;
drop policy if exists "Permitir insert em motivos_assistencia" on motivos_assistencia;
drop policy if exists "Permitir update em motivos_assistencia" on motivos_assistencia;
drop policy if exists "Permitir delete em motivos_assistencia" on motivos_assistencia;
create policy "Permitir select em motivos_assistencia" on motivos_assistencia for select using (true);
create policy "Permitir insert em motivos_assistencia" on motivos_assistencia for insert with check (true);
create policy "Permitir update em motivos_assistencia" on motivos_assistencia for update using (true);
create policy "Permitir delete em motivos_assistencia" on motivos_assistencia for delete using (true);
drop policy if exists "Permitir select em vendedores_personality" on vendedores_personality;
drop policy if exists "Permitir insert em vendedores_personality" on vendedores_personality;
drop policy if exists "Permitir update em vendedores_personality" on vendedores_personality;
drop policy if exists "Permitir delete em vendedores_personality" on vendedores_personality;
create policy "Permitir select em vendedores_personality" on vendedores_personality for select using (true);
create policy "Permitir insert em vendedores_personality" on vendedores_personality for insert with check (true);
create policy "Permitir update em vendedores_personality" on vendedores_personality for update using (true);
create policy "Permitir delete em vendedores_personality" on vendedores_personality for delete using (true);
drop policy if exists "Permitir select em premios_config_personality" on premios_config_personality;
drop policy if exists "Permitir insert em premios_config_personality" on premios_config_personality;
drop policy if exists "Permitir update em premios_config_personality" on premios_config_personality;
drop policy if exists "Permitir delete em premios_config_personality" on premios_config_personality;
create policy "Permitir select em premios_config_personality" on premios_config_personality for select using (true);
create policy "Permitir insert em premios_config_personality" on premios_config_personality for insert with check (true);
create policy "Permitir update em premios_config_personality" on premios_config_personality for update using (true);
create policy "Permitir delete em premios_config_personality" on premios_config_personality for delete using (true);
drop policy if exists "Permitir select em premios_lancados_personality" on premios_lancados_personality;
drop policy if exists "Permitir insert em premios_lancados_personality" on premios_lancados_personality;
drop policy if exists "Permitir update em premios_lancados_personality" on premios_lancados_personality;
drop policy if exists "Permitir delete em premios_lancados_personality" on premios_lancados_personality;
create policy "Permitir select em premios_lancados_personality" on premios_lancados_personality for select using (true);
create policy "Permitir insert em premios_lancados_personality" on premios_lancados_personality for insert with check (true);
create policy "Permitir update em premios_lancados_personality" on premios_lancados_personality for update using (true);
create policy "Permitir delete em premios_lancados_personality" on premios_lancados_personality for delete using (true);
drop policy if exists "Permitir select em os_autorizadas_personality" on os_autorizadas_personality;
drop policy if exists "Permitir insert em os_autorizadas_personality" on os_autorizadas_personality;
drop policy if exists "Permitir update em os_autorizadas_personality" on os_autorizadas_personality;
drop policy if exists "Permitir delete em os_autorizadas_personality" on os_autorizadas_personality;
create policy "Permitir select em os_autorizadas_personality" on os_autorizadas_personality for select using (true);
create policy "Permitir insert em os_autorizadas_personality" on os_autorizadas_personality for insert with check (true);
create policy "Permitir update em os_autorizadas_personality" on os_autorizadas_personality for update using (true);
create policy "Permitir delete em os_autorizadas_personality" on os_autorizadas_personality for delete using (true);
drop policy if exists "Permitir select em config_geral_personality" on config_geral_personality;
drop policy if exists "Permitir insert em config_geral_personality" on config_geral_personality;
drop policy if exists "Permitir update em config_geral_personality" on config_geral_personality;
drop policy if exists "Permitir delete em config_geral_personality" on config_geral_personality;
create policy "Permitir select em config_geral_personality" on config_geral_personality for select using (true);
create policy "Permitir insert em config_geral_personality" on config_geral_personality for insert with check (true);
create policy "Permitir update em config_geral_personality" on config_geral_personality for update using (true);
create policy "Permitir delete em config_geral_personality" on config_geral_personality for delete using (true);
🔐 Segurança: Senha do Painel Master
Altere a senha de proteção do Painel Master. (Senha padrão inicial: admin123)
Gerenciamento de Lojas Licenciadas
Cadastre e gerencie as óticas parceiras que aparecerão na página principal e no formulário de resgate do voucher.
🏪 Óticas Cadastradas
| Nome da Ótica | Endereço | Telefone | Ações |
|---|
🔑 Acessos das Óticas Licenciadas
Crie e gerencie as credenciais de login que as óticas usarão para acessar o Portal do Parceiro e ver os próprios leads.
🔑 Credenciais Ativas
| Ótica Correspondente | Usuário (Login) | Senha | Ações |
|---|
Gerenciamento da Equipe Técnica & Especialistas
Cadastre os técnicos e responsáveis que receberão os chamados de assistência, ajuste de parâmetros e garantia.
Técnicos Cadastrados:
| Nome | Especialidade | Ótica Atendida | Ações |
|---|
Chamados de Assistência Técnica & Garantia
Acompanhe todos os chamados abertos pelos clientes, os técnicos atribuídos, dados da O.S., CRM médico e status dos agendamentos.
| Protocolo | Cliente | Ótica / Compra | O.S. / Médico CRM | Lente / Tratamento / Motivo | Agendamento | Técnico Responsável | Status |
|---|
Opções de Motivos do Chamado
Cadastre ou remova os motivos de assistência técnica e garantia que aparecem na caixa de seleção para o consumidor final.
Motivos Cadastrados no Sistema:
| # | Descrição do Motivo | Ações |
|---|
Configurações de Domínio e Deploy na Vercel
Guia passo a passo para conectar a sua conta da Vercel ao domínio oficial da marca.
📋 Lista de Etapas (Acompanhamento)
Central de Downloads (Gerenciamento de Materiais)
Adicione, edite ou remova PDFs, catálogos e tabelas técnicas disponíveis para os clientes no site.
| Título / Categoria | Descrição | Formato/Tamanho | Link do Arquivo | Ações |
|---|
Banco de Imagens e Recursos Visuais
Locais sugeridos para buscar imagens de alta qualidade e instruções de substituição de arquivos no projeto.
🎨 Onde buscar fotos profissionais gratuitas:
- 📸 Unsplash (unsplash.com): Busque termos como *"luxury optics"*, *"glasses style"*, *"german lab"* ou *"precision technology"*.
- 📸 Freepik (freepik.com): Ideal para vetores, renderizações de lentes e fotos comerciais de óticas.
- 📸 Pexels (pexels.com): Excelente acervo de vídeos e fotos de modelos usando óculos em ambientes premium.
📁 Como substituir as imagens no código:
Crie uma pasta chamada images na raiz do projeto e substitua as imagens estruturais:
| Seção | Caminho Sugerido | Dimensões Recomendadas |
|---|---|---|
| Lente Premium (Hero) | images/hero-lens.png |
500x500px (Fundo transparente PNG) |
| Foto Laboratório/Sobre Nós | images/about-lab.jpg |
800x600px |
| Banner Lojas Licenciadas | images/store-locator.jpg |
1200x500px |
Leads Recebidos (Resgates de Voucher)
Visualize os dados dos clientes que cadastraram para ganhar 50% de desconto e os respectivos vouchers gerados.
| Nome | Ótica Escolhida | Voucher | Obs | Data |
|---|
Profissionais & Vendedores Cadastrados
Lista de médicos/profissionais da saúde e balconistas/vendedores cadastrados na plataforma.
| Data Cadastro | Nome | Tipo | CPF / CNPJ | Loja / Clínica | Ações |
|---|
➕ Adicionar Novo Produto para Prêmios
Cadastre novos produtos (lentes ou tratamentos) e defina seus dados de classificação.
💸 Configuração de Prêmios de Lentes e Tratamentos
Configure a pontuação e os prêmios dos produtos ativos na campanha.
| Produto | Preço (R$) | Tipo | Tecnologia | Família | IR | Pontos/$ | Ativo | Ações | |
|---|---|---|---|---|---|---|---|---|---|
📥 Liberar Vendas / O.S. para Vendedores
Pré-lance os dados das O.S. válidas amarradas a um vendedor/CPF específico. O vendedor só poderá resgatar as O.S. cadastradas nesta área.
📋 Vendas e O.S. Liberadas pelo Laboratório
Veja a listagem de O.S. autorizadas no sistema para cada balconista/vendedor.
| + |
Vendedor
⇅
|
Ptos
⇅
|
Lentes + AR |
Status
⇅
|
Ações |
|---|
📈 Dashboard de Performance & Rankings
Análise de vendas, ranking de balconistas, óticas parceiras e produtos mais vendidos no período.
🏆 Ranking de Vendedores (Pontos)
🏪 Ranking de Lojas (Pontos)
👓 Lentes Mais Vendidas
✨ Tratamentos Antirreflexo
💰 Ticket Médio por Vendedor
🏬 Ticket Médio por Loja (Ótica)
Relatório e Conciliação de Prêmios de Balconistas
Valide as O.S. lançadas, realize a conciliação financeira de pagamento e gere relatórios.
| + | Vendedor ⇅ | Pontuação Total ⇅ | Status ⇅ | Ações |
|---|
💰 Apuração de Pagamento de Prêmios (Consolidado por Vendedor)
Resumo financeiro acumulado por vendedor com status "A Pagar". Clique no botão de pagar para conciliar todas as O.S. dele em lote.
| Vendedor | Ótica | O.S. Validadas | Subtotal Acumulado | Ações |
|---|
💳 Histórico de Pagamentos Realizados (Consolidado por Vendedor)
Resumo de prêmios que já foram pagos e conciliados por vendedor.
| Nome do Vendedor | CPF | Ótica de Trabalho | Total Pago (Conciliado) | Status |
|---|