Skip to content

Uma plataforma de código aberto com aplicativos para clientes, entregadores e restaurantes, que oferece flexibilidade para personalização completa em toda a sua estrutura.

License

Notifications You must be signed in to change notification settings

carloshomar/appdelivery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Delivery

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!

Videos

Video - Fazendo um pedidio, aceitando e produzindo o pedido, e realizando entrega (fluxo com todos os APPs)

Video - Utilizando o App de Comida

App de Comida

IMG1 IMG2 IMG3 IMG4

Web Restaurante

web1 Kanban de fluxo de trabalho do restaurante, responsiva para celulares e computadores

Gestor de Cardápio

web2 Gestor de cardápio para criação e alteração de produtos.

App de Entregas:

IMG2 IMG4 IMG3 IMG3

Principais Características

  • 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.

Técnico

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.

Arquitetura:

image info

Uma arquitetura baseada em microserviços

Back-end / Infra:

  • 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.

App Entregas e App Comida:

  • 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.

Como Rodar Backend

É 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.

Rodar um serviço em especifico (opcional):

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

Como rodar o Frontend:

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:https://localhost:3000.

Rodar um fronted em especifico (opicional):

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.

Não necessários para rodar

Rodar um serviço em especifico:

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

Configuração do Estabelecimento

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.

Configure o Modo:

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.

Cadastrar Estabelecimento:

  • 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)

Cadastrar Entregador:

  • Cada entregador deve estar devidamente cadastrado, no próprio AppEntregas tem uma pagina de cadastro básica, somente para uso de testes.

Configuração de APPComida:

  • 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).

Eventos do Pedido (RabbitMQ)

  • 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.

Pagamento (futuro)

  • 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 de APROVED 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.

Detalhes Gerais

Cálculo de Entrega:

  • 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 KM perKm.
  • 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).

Entregador:

  • 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.

Restaurante:

  • 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.

Etapas de Entrega:

  • 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.

Publicação:

  • 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.
Atenciosamente, CHomar
Discord: anypercent_