App Flutter para orçamentos de estética automotiva. Port do app original BOX JM para Flutter, mantendo o mesmo backend Supabase.
Aplicativo de orçamentos para estética automotiva com catálogo de serviços, criação de orçamentos personalizados e sincronização offline. Permite selecionar serviços por categoria (exterior, interior, proteção, detailing), definir tipo de veículo (pequeno, médio, grande, SUV, caminhão), calcular totais automaticamente e compartilhar orçamentos.
- Catálogo de serviços organizado por categoria (exterior, interior, proteção, detailing)
- Criação de orçamentos com seleção de serviços, quantidade e cálculo automático de totais
- Tipos de veículo com dimensionamento de preço (pequeno, médio, grande, SUV, caminhão)
- Offline-first com
SharedPreferencese fila de sincronização quando volta online - Compartilhamento de orçamentos via
share_plus - Banner de conectividade indicando status online/offline
- Detalhe e edição de orçamentos existentes
flutter pub get
flutter runCredenciais Supabase ficam em .env (mesmas tabelas: budgets e custom_services).
O arquivo schema.sql contém o schema completo para criar as tabelas no Supabase (services, budgets, custom_services). Cole no SQL Editor do Supabase e execute.
lib/
├── core/ theme, constantes, supabase init, utils
├── domain/ entities + repositories abstratas (sem deps externas)
│ ├── entities/ Budget, ServiceItem, VehicleType
│ └── repositories/ BudgetRepository, CatalogRepository
├── data/ datasources (supabase/local) + repositories impl + sync
│ ├── datasources/ BudgetRemoteDatasource, CatalogRemoteDatasource, LocalStorageDatasource
│ └── repositories/ BudgetRepositoryImpl, CatalogRepositoryImpl, SyncService
└── presentation/ providers Riverpod + pages + widgets + router
├── pages/ HomePage, ServicesPage, NewBudgetPage, BudgetDetailPage
├── providers/ Riverpod providers
├── widgets/ BudgetCard, GradientButton, ConnectivityBanner, etc.
└── router.dart GoRouter configuration
- State: Riverpod (AsyncNotifier)
- Routing: go_router
- Backend: Supabase (PostgreSQL)
- Offline: SharedPreferences + fila de sync quando volta online
- Compartilhamento: share_plus
- UUID: uuid package