BarberFlow/barber-flow/GEMINI.md

6.5 KiB

BarberFlow SaaS - Project Context

Este documento serve como a fonte da verdade para a arquitetura, estrutura e regras de negócio do BarberFlow, um sistema SaaS Multi-Tenant para barbearias construído com Expo (React Native).

🚀 Tech Stack Principal

  • Framework: Expo / React Native (Foco em Web/Mobile First)
  • Roteamento: Expo Router (File-based routing)
  • Animações & UI: react-native-reanimated (UI/UX Pro Max)
  • Armazenamento: @react-native-async-storage/async-storage (Persistência local temporária/mock)
  • Ícones: lucide-react-native
  • Mídia: expo-image-picker (Imagens convertidas em Base64 para armazenamento)

📁 Estrutura de Diretórios (app/)

O projeto utiliza um roteamento baseado no file-system do Expo Router, rigidamente dividido em duas áreas principais após a seleção global de idioma e fluxos de autenticação.

  • app/index.tsx: Raiz Absoluta. A primeira tela do app. Redireciona para /landing.
  • app/landing.tsx: Landing page comercial do SaaS. Contém botões para acessar "Painel do Dono", "Área do Barbeiro" ou "Ver Demonstração" (Área do Cliente).
  • app/admin/: Área Administrativa (O Painel do Dono e do Barbeiro)
    • _layout.tsx: Define o Stack protegido do Admin.
    • login.tsx: Tela de autenticação para o dono da barbearia.
    • barber-login.tsx: Tela de autenticação separada para funcionários (barbeiros).
    • register.tsx: Tela de criação de conta (BarberFlow Pro).
    • forgot-password.tsx: Tela de recuperação de senha.
    • dashboard.tsx: Visão geral de agendamentos pendentes e confirmados. Permite aceitar, recusar ou cancelar. (A visão é filtrada com base em quem está logado).
    • agenda.tsx: Tabela visual (Daily Schedule) mostrando os horários de todos os barbeiros e seus status (Livre, Pendente, Confirmado, Bloqueado).
    • finance.tsx: Tela de gestão financeira, exibindo faturamento bruto e o cálculo de comissão exato para cada barbeiro.
    • config.tsx: Wizard de 6 Passos para configurar a barbearia (Identidade, Localização, Serviços, Barbeiros, Formas de Pagamento, Link Final).
  • app/[slug]/: Área do Cliente (Multi-Tenant)
    • _layout.tsx: Provedor de contexto específico do tenant (barbearia).
    • index.tsx: Tela inicial de redirecionamento do tenant para o fluxo de idioma/auth.
    • (auth)/: Autenticação e Pré-requisitos do Cliente
      • language-selection.tsx: O cliente escolhe o idioma (PT/ES) e a moeda (R$/GS) que prefere ser atendido.
      • login.tsx: Tela de login do cliente. Redireciona para o agendamento após sucesso.
      • register.tsx: Tela de cadastro do cliente.
      • forgot-password.tsx: Tela de recuperação de senha.
    • (tabs)/: Área Interna do Cliente
      • _layout.tsx: Tab bar com as opções principais.
      • agendar.tsx: O core do lado do cliente. Fluxo de 3 passos: Escolher Serviço/Barbeiro -> Escolher Data/Hora -> Pagamento & Confirmação.
      • profile.tsx: Perfil do cliente com histórico.

🧠 Gerenciamento de Estado (Contextos)

1. BarbeariaContext.tsx

O "banco de dados" do sistema. Gerencia os dados da barbearia atual (Tenant).

  • Resiliência do Slug: Se o usuário acessa um slug e ele bate com o do AsyncStorage, os dados carregam.
  • Role-Based Access Control (RBAC): Armazena a variável activeBarberId. Se for null, o sistema entende que é o dono e libera tudo. Se tiver um ID de funcionário logado, restringe as views.
  • Estruturas Principais:
    • services: Contém nomes, preços bilíngues e duração (nomePt, nomeEs, precoPt, precoEs, duracao).
    • barbers: Lista de profissionais contendo nome, foto, commission, email, password e permissions (canViewFinance, canEditConfig).
    • paymentMethods: Array de strings (ex: ['pix', 'card', 'money', 'alias']).
    • appointments: Lista de agendamentos com status e valor total do serviço.

2. LanguageContext.tsx

Coração do sistema i18n e regras de moeda.

  • Tradução: A função t(key) é robusta contra chaves não encontradas ou parâmetros undefined.
  • Preços (formatPrice): Recebe dois valores e formata com base no idioma atual (Real R$ ou Guarani GS).

⚖️ Regras de Negócio Críticas

  1. Separação Dono vs Funcionário vs Cliente:

    • Dono: Acessa via /admin/login. Visualiza e edita todas as configurações, visualiza a agenda de todos e acessa o balanço financeiro geral.
    • Barbeiro (Funcionário): Acessa via /admin/barber-login. Ao logar, vai para o Dashboard onde só visualiza os seus próprios agendamentos. Na agenda, não consegue clicar/bloquear a agenda de colegas. O acesso a configurações e financeiro depende de flags explícitas de permissão no cadastro dele.
    • Cliente: Acessa via /[slug], faz autenticação e visualiza os horários disponíveis (área em (tabs)).
  2. Fluxo de Agendamento e Edição (Admin):

    • Na tela config.tsx, o admin consegue criar e agora também editar informações de barbeiros e serviços sem precisar deletá-los.
    • A agenda do admin e do barbeiro permite selecionar múltiplos horários em massa (multi-select) e aplicar a ação "Bloquear" ou "Liberar".
  3. Sistema Financeiro e Comissionamento:

    • O sistema rastreia o valor gerado nos agendamentos accepted e calcula de forma individual o repasse do barbeiro com base na porcentagem (%) cadastrada no seu perfil.
    • Se um barbeiro com permissão de ver as finanças acessar a tela, ele só enxergará o valor do próprio caixa e o valor que ele vai receber, enquanto o dono enxerga a somatória bruta de todos.
  4. Lógica de Formas de Pagamento Dinâmicas:

    • O admin marca os métodos aceitos na aba de configurações. A lista sofre filtro dinâmico de moeda (O cliente que escolheu idioma Espanhol não vê PIX, e o cliente do Português não vê Alias).
  5. Tratamento de Imagens:

    • O upload de logos e avatares converte o binário para Base64 injetando diretamente no estado e no AsyncStorage.

🎨 Padrão de UI/UX (Pro Max)

Todas as telas seguem o manual de referências UI/UX.

  • Animações: FadeInUp, FadeInDown, e FadeInRight usando react-native-reanimated para navegação suave.
  • Feedback Tátil: expo-haptics acionados ao confirmar botões de bloqueio e salvar perfis.
  • Design Responsivo: Uso do useWindowDimensions() nas telas web para garantir que, no iPhone ou Android, os painéis colapsem na vertical (flex-col) de ponta a ponta com segurança visual (paddingHorizontal: 16).