O Delivery é uma plataforma de código aberto que permite a personalização completa com a marca e identidade visual do seu restaurante ou mais restaurantes. Similar aos principais apps do mercado, possibilita que restaurantes estabeleçam um canal de vendas diretas, eliminando intermediários e proporcionando uma experiência de compra mais próxima aos usuários. Isso não apenas reduz custos desnecessários, mas também simplifica a gestão do estabelecimento.
Fique a vontade para Adicionar, Modificar, Comercializar e Distribuir!
Contribuições são sempre bem-vindas!
Video - Utilizando o App de Comida
Kanban de fluxo de trabalho do restaurante, responsiva para celulares e computadores
Gestor de cardápio para criação e alteração de produtos.
-
Modos de estabelecimentos: Existe o modo unique que deixa o app focado em um estabelecimento e também o modo multi que lista os estabelecimentos presentes no servidor, no arquivo de configurações você pode selecionar o estilo desejado.
-
Personalização Total: Coloque sua marca e identidade visual no sistema, transformando-o em uma extensão exclusiva do seu restaurante.
-
Vendas Diretas: Elimine intermediários e suas taxas, oferecendo aos clientes uma experiência de compra mais acessível.
-
Gestão Simplificada: Mantenha e simplifique a gestão do estabelecimento com a facilidade de operar o sistema.
-
Uso Próprio de Entregadores: O sistema não gerencia a entrega, permitindo o uso de entregadores próprios para garantir uma experiência de entrega de alta qualidade.
-
Arquitetura Eficiente: O servidor foi projetado para suportar um ou mais aplicativos simultaneamente, permitindo a divisão de custos e manutenção simplificada em larga escala.
Um servidor tem a capacidade de executar simultaneamente N aplicativos. Dessa forma, torna-se viável reduzir os custos do servidor, necessitando apenas de um servidor para sustentar toda a infraestrutura de aplicativos.
Uma arquitetura baseada em microserviços
- Arquitetura baseada em microsserviços, permitindo a adição de novos serviços na linguagem desejada.
- Utiliza GoLang devido à sua performance e baixo consumo de recursos.
- O GoLang utiliza também o Fiber como framework API.
- Implementado em Docker, facilitando a inicialização do servidor sem exigir amplo conhecimento técnico.
- Desenvolvido em React Native e Expo, possibilitando a publicação na App Store e Google Play.
- Utiliza o Expo para build gratuito na nuvem, dispensando a necessidade de um MacOS, especialmente para iOS.
É importante já ter o docker instalado no sistema operacional. Somente o backend inicia via docker, as aplicações frontend devem ser rodadas separadamente.
Rode no terminal:
cd ./Backend
docker compose up --build
As credenciais de banco estão presentes no docker-compose.yml.
Para fazer o deploy é só seguir os passos que o docker-compose.yml faz.
Para rodar os microserviços separadamente você precisa já ter o GoLang instalado em sua maquina, acessar a pasta do microsserviço pelo terminal e utilizar:
go mod tidy
go install
Para rodar:
go run main.go
No arquivo Frontend/docker-compose.yml, faça alterações na URL do backend, presente na variável API_BASE_URL
. Você pode utilizar o ipconfig/ifconfig para obter o endereço IP local da máquina junto com a porta na qual o aplicativo está rodando, e então alterar a URL.
Ainda no arquivo Frontend/docker-compose.yml, adicione as credenciais de acesso do Expo nas variáveis EXPO_USERNAME
e EXPO_PASSWORD
. Para obtê-las, basta se cadastrar em: https://expo.dev. Adicione também seu IP local na variável EXPO_QR_GEN
para que os QR codes dos apps sejam gerados corretamente.
Nos arquivos Frontend/AppComida/services/api.tsx, Frontend/AppEntrega/services/api.tsx e Frontend/WebRestaurant/src/services/api.js, faça alterações na URL para apontar para o backend que você subiu.
É importante já ter o docker instalado no sistema operacional.
Rode no terminal:
cd ./Frontend
docker compose up --build
O console vai exibir dois QRCodes para abrir os apps via Expo, e o painel WebRestaurante pode ser aberto usando http://localhost:3000.
Tenha o node instalado na sua maquina, no caso eu utilizei a v20.13.1
Nos 3 projetos de front-end (WEBRestaurante, AppComida, AppEntregas) existem arquivos no caminho services/api.tsx ou services/api.ts que precisam sofrer alterações da URL para apontar o backend/servidor que subiu. Utilizando Ipconfig/Ifconfig você precisa pegar o endereço IP ou DNS do servidor, juntamente com a porta em que está rodando o backend (docker).
O processo de alteração de URL deve ser realizado nas 3 aplicações, WEBRestaurante, AppComida, AppEntregas.
Na parte WEB, em caso de não conseguir logar ou estiver tendo erro de CORS, considere instalar uma extensão que desabilita CORS no seu navegador, ou inicialize o mesmo sem essa politica.
Instalando dependências.
npm install
Para rodar:
npm start
Baixe o App do EXPO, no seu celular, pela loja de aplicativos e esteja conectado na mesma rede que o seu computador, o aplicativo será visto por toda rede interna enquando estiver em desenvolvimento.
Para rodar os microserviços separadamente você precisa já ter o GoLang instalado em sua maquina, acessar a pasta do microsserviço pelo terminal e utilizar:
go mod tidy
go install
Para rodar:
go run main.go
Tendo postman na sua maquina, é só importar a biblioteca de requests presentes na pasta Backend/docs/delivery.postman_collection.json no qual você terá acesso a uma mini documentação dos endpoints e formatos esperados pela API.
No arquivo Frontend/AppComida/config/config.tsx altere a variavel APP_MODE para .unique ou .multi.
-
Unique: Para quando o app é voltado somente para 1 unico restaurante, neste caso ele consome da variavel estatica ESTABLISHMENT, também presente no arquivo.
-
Multi: Para quando o app deve comportar todos os restaurantes cadastrados no servidor, e fornece a possibilidade do usuário selecionar o restaurante que bem deseja.
- Auth / Create User & Establishment (Fique atento a geolocalização do estabelecimento, para o calculo correto de entrega)
- Product & Order / Delivery / Alter Taxe Delivery
- Product & Order / Products / Create Multi Products (Pode ser feito pela aplicação WEBRestaurante)
- Product & Order / Additional / Create Additional (Pode ser feito pela aplicação WEBRestaurante)
- Product & Order / Additional / Vinculo Additional Products (Pode ser feito pela aplicação WEBRestaurante)
- Cada entregador deve estar devidamente cadastrado, no próprio AppEntregas tem uma pagina de cadastro básica, somente para uso de testes.
- No arquivo Frontend/AppComida/config/config.tsx, na propriedade ESTABLISHMENT, modifique o objeto com as informações desejadas, incluindo logotipos e coordenadas geográficas do estabelecimento (para cálculos de distância).
- No mesmo arquivo, Frontend/AppComida/config/config.tsx, atualize a propriedade ESTABLISHMENT_ID com o identificador gerado durante o cadastro do estabelecimento (REQUEST: Auth / Create User & Establishment).
- Quando o pedido é feito pelo app de comida e aprovado pelo estabelecimento, ele é publicada na fila indicada na variável de ambiente:
RABBIT_DELIVERY_QUEUE
. - Quando o status do pedido é alterado por parte do entregador, o evento é publicado na fila indicada na variável de ambiente:
RABBIT_ORDER_QUEUE
.
- Para desenvolver o pagamento, pretendo adicionar um serviço que sobe escutando a fila
RABBIT_DELIVERY_QUEUE
, existe outro serviço que também escuta essa fila, ao escutar uma mensagem com status deAPROVED
realiza o pagamento com os dados advindos na mensagem. - No app do cliente, na parte de pagamento, adiciono uma tela para o cliente preencher os dados de pagamento, e no checkout adicionar uma validação dos dados de acordo com o método de pagamento.
- Cada restaurante tem seu próprio valor de entrega e distância de atendimento.
- O cálculo consiste em pôr um valor fixo (Taxa de Serviço)
fixedTaxa
e um valor por KMperKm
. - Baseado na distância recebida, o app calcula a distância através do algoritmo de Haversine (exite um método no backend e nofrontend para esse cálculo), envia para o backend e recebe o valor calculado de acordo com o estabelecimento.
Utilizei o algoritimo de Haversine para evitar o uso de APIs de mapas, por serem pagas, talvez ele não seja o melhor a ser usado em larga escala pois ele calcula em uma linha reta, não levando em conta o caminho real a ser percorrido pelo entregador, mas a menor distância entre os dois pontos (ponto de coleta e entrega).
- Cada entregador deve estar devidamente cadastrado. Essa documentação do Postman pode ser encontrada em
Auth/DeliveryMan/Register Deliveryman
. - Toda entrega realizada pelo entregador é salva em seu extrato, que pode ser visualizado no seu respectivo APP.
- É permitida somente uma entrega por vez, por entregador. (Existe a possibilidade de adição de uma fila de pedidos para entrega no AppEntrega por se tratar de um array, pretendo adicionar como feature futura)
- No endpoint Delivery/Orders, o entregador envia sua localização e recebe os pedidos ao redor, todos os entregadores enviam um "sinal de vida" com sua localização. (Pretendo utilizar esse endpoint para rastreio das localizações percorridas pelo entregador, inclusive seu caminho percorrido para mapear a locomoção, cálculos de gastos calóricos e etc.)
- Caso a entrega seja cancelada/removida, ou o entregador seja removido da entrega (somente via banco, no mongoDB), no próximo "sinal de vida" essa condição será refletida no app do mesmo e ele volta a ficar disponível para novas entregas. Sendo assim, existe a possiblidade da feature de remoção/sobreposição de um entregador em uma respectiva entrega, más não pretendo desenvolver.
- Todos os dados do restaurante podem ser alterados pelo painel WEBRestaurante.
- Os restaurantes são cadastrados via endpoint (Auth / Create User & Establishment). A página de cadastro de restaurante está em desenvolvimento futuro.
- Ainda falta uma feature de relatórios, pretendo adiciona-la no futuro, más os dados podem ser obtidos no mongoDB do serviço do restaurante.
- Todos os itens do cardápio tem suporte à Adicionais e Categorias de pedido.
- A visualização do cliente é composta primeiro das categorias exibindo produtos agrupados, na página do restaurante, no AppComida e após as categorias vem uma listagem geral.
- Os adicionais podem ou não possuir algum valor, que em caso de existência é refletido no valor do pedido.
- O restaurante faz o cadastramento de todos os seus produtos e "abre o estabelecimento" na aplicação WEBRestaurante.
- O cliente realiza o pedido e indica a forma de pagamento, que pode ser feita na entrega. Atualmente, não temos integração com APIs de pagamento, mas isso pode ser implementado em qualquer linguagem e facilmente devido à arquitetura.
- O restaurante aceita/recusa o pedido, arrastando-o para os próximos estágios do Painel Principal (Quadro Kanban).
- Ao arrastar o pedido para o estágio de "Em produção", o mesmo aparece disponível para entrega aos entregadores ao redor.
- Enquanto o pedido está no estágio de "Em produção", o entregador se locomove até o estabelecimento e consegue sinalizar no AppEntrega que chegou ao estabelecimento. O restaurante recebe essa alteração no status do pedido.
- Ao arrastar o pedido para "Pronto para Entrega", o restaurante consegue entregar o pedido no balcão. Para isso, é necessário o código do restaurante (código de quatro dígitos que está disponível no card do pedido, na parte WEB do restaurante).
- Ao receber o pedido, o entregador pode se locomover ao encontro do cliente e, ao entregar o pedido, solicitar o respectivo código de entrega (código de quatro dígitos disponível na área de pedidos no APP do Cliente).
- Disclamer: no código atual da main, adicionei o Código do Cliente (em vermelho) no card do pedido, isso é para facilitar os teste, em caso de publicação o ideal é remover o Código do Cliente da Visualização do Restaurante (Quadro Kanban), más pode variar de acordo com a regra de negócio.
- Após a entrega, o pedido sai do Painel Principal (Quadro Kanban) do restaurante, e a entrega é salva na tela de Extrato do entregador.
O fluxo acima de Etapas de Entrega pode ser visualizado no primeiro video.
- No caso de publicação você pode utilizar o próprio expo para fazer o build, ou fazer o
eject
saindo do expo e usando react native. - Você precisa adicionar a chave de API de mapas na aplicação do entregador, pois ela utiliza o maps da Apple e Google só seguir essa Documentação.