Skip to content

Commit 0d988f2

Browse files
authored
Merge pull request #36 from adityacosmos24/main
feat: added food delivey system
2 parents 010f587 + a4cc465 commit 0d988f2

25 files changed

+935
-0
lines changed

Src/Food_Delivery_System/Makefile

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Makefile for Lecture 11 C++ Tomato App
2+
3+
CXX = g++
4+
CXXFLAGS = -std=c++11 -Wall -Wextra
5+
TARGET = tomato_app
6+
SOURCE = main.cpp
7+
8+
# Default target
9+
all: $(TARGET)
10+
11+
# Build the executable
12+
$(TARGET): $(SOURCE)
13+
$(CXX) $(CXXFLAGS) -I. -o $(TARGET) $(SOURCE)
14+
15+
# Run the application
16+
run: $(TARGET)
17+
./$(TARGET)
18+
19+
# Clean up compiled files
20+
clean:
21+
rm -f $(TARGET) $(TARGET).exe
22+
23+
# Help target
24+
help:
25+
@echo "Available targets:"
26+
@echo " all - Build the application (default)"
27+
@echo " run - Build and run the application"
28+
@echo " clean - Remove compiled files"
29+
@echo " help - Show this help message"
30+
31+
.PHONY: all run clean help
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#ifndef TOMATO_APP_H
2+
#define TOMATO_APP_H
3+
4+
#include <vector>
5+
#include <string>
6+
#include "models/User.h"
7+
#include "models/Restaurant.h"
8+
#include "models/Cart.h"
9+
#include "managers/RestaurantManager.h"
10+
#include "managers/OrderManager.h"
11+
#include "strategies/PaymentStrategy.h"
12+
#include "strategies/UpiPaymentStrategy.h"
13+
#include "factories/NowOrderFactory.h"
14+
#include "factories/ScheduledOrderFactory.h"
15+
#include "services/NotificationService.h"
16+
#include "utils/TimeUtils.h"
17+
using namespace std;
18+
19+
class TomatoApp {
20+
public:
21+
TomatoApp() {
22+
initializeRestaurants();
23+
}
24+
25+
void initializeRestaurants() {
26+
Restaurant* restaurant1 = new Restaurant("Bikaner", "Delhi");
27+
restaurant1->addMenuItem(MenuItem("P1", "Chole Bhature", 120));
28+
restaurant1->addMenuItem(MenuItem("P2", "Samosa", 15));
29+
30+
Restaurant* restaurant2 = new Restaurant("Haldiram", "Kolkata");
31+
restaurant2->addMenuItem(MenuItem("P1", "Raj Kachori", 80));
32+
restaurant2->addMenuItem(MenuItem("P2", "Pav Bhaji", 100));
33+
restaurant2->addMenuItem(MenuItem("P3", "Dhokla", 50));
34+
35+
Restaurant* restaurant3 = new Restaurant("Saravana Bhavan", "Chennai");
36+
restaurant3->addMenuItem(MenuItem("P1", "Masala Dosa", 90));
37+
restaurant3->addMenuItem(MenuItem("P2", "Idli Vada", 60));
38+
restaurant3->addMenuItem(MenuItem("P3", "Filter Coffee", 30));
39+
40+
RestaurantManager* restaurantManager = RestaurantManager::getInstance();
41+
restaurantManager->addRestaurant(restaurant1);
42+
restaurantManager->addRestaurant(restaurant2);
43+
restaurantManager->addRestaurant(restaurant3);
44+
45+
// Add other sample restaurants...
46+
}
47+
48+
vector<Restaurant*> searchRestaurants(const string& location) {
49+
return RestaurantManager::getInstance()->searchByLocation(location);
50+
}
51+
52+
void selectRestaurant(User* user, Restaurant* restaurant) {
53+
Cart* cart = user->getCart();
54+
cart->setRestaurant(restaurant);
55+
}
56+
57+
void addToCart(User* user, const string& itemCode) {
58+
Restaurant* restaurant = user->getCart()->getRestaurant();
59+
if (!restaurant) {
60+
cout << "Please select a restaurant first." << endl;
61+
return;
62+
}
63+
for (const auto& item : restaurant->getMenu()) {
64+
if (item.getCode() == itemCode) {
65+
user->getCart()->addItem(item);
66+
break;
67+
}
68+
}
69+
}
70+
71+
Order* checkoutNow(User* user, const string& orderType, PaymentStrategy* paymentStrategy) {
72+
return checkout(user, orderType, paymentStrategy, new NowOrderFactory());
73+
}
74+
75+
Order* checkoutScheduled(User* user, const string& orderType, PaymentStrategy* paymentStrategy, const string& scheduleTime) {
76+
return checkout(user, orderType, paymentStrategy, new ScheduledOrderFactory(scheduleTime));
77+
}
78+
79+
Order* checkout(User* user, const string& orderType,
80+
PaymentStrategy* paymentStrategy, OrderFactory* orderFactory) {
81+
if (user->getCart()->isEmpty())
82+
return nullptr;
83+
84+
Cart* userCart = user->getCart();
85+
Restaurant* orderedRestaurant = userCart->getRestaurant();
86+
vector<MenuItem> itemsOrdered = userCart->getItems();
87+
double totalCost = userCart->getTotalCost();
88+
89+
Order* order = orderFactory->createOrder(user, userCart, orderedRestaurant, itemsOrdered, paymentStrategy, totalCost, orderType);
90+
OrderManager::getInstance()->addOrder(order);
91+
return order;
92+
}
93+
94+
void payForOrder(User* user, Order* order) {
95+
bool isPaymentSuccess = order->processPayment();
96+
97+
// clear user cart if payment is successful.
98+
if(isPaymentSuccess) {
99+
NotificationService* notification = new NotificationService();
100+
notification->notify(order);
101+
user->getCart()->clear();
102+
}
103+
}
104+
105+
void printUserCart(User* user) {
106+
cout << "Items in cart:" << endl;
107+
cout << "------------------------------------" << endl;
108+
for (const auto& item : user->getCart()->getItems()) {
109+
cout << item.getCode() << " : " << item.getName() << " : ₹" << item.getPrice() << endl;
110+
}
111+
cout << "------------------------------------" << endl;
112+
cout << "Grand total : ₹" << user->getCart()->getTotalCost() << endl;
113+
}
114+
};
115+
116+
#endif // TOMATO_APP_H
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
@echo off
2+
echo Compiling C++ Food Delivery App...
3+
4+
REM Compile the main program
5+
g++ -std=c++11 -I. -o tomato_app main.cpp
6+
7+
if %errorlevel% equ 0 (
8+
echo Compilation successful!
9+
echo Running the application...
10+
echo.
11+
tomato_app.exe
12+
) else (
13+
echo Compilation failed!
14+
echo Please check for any syntax errors.
15+
)
16+
17+
pause
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/bin/bash
2+
echo "Compiling Lecture 11 C++ Tomato App..."
3+
4+
# Compile the main program
5+
g++ -std=c++11 -I. -o tomato_app main.cpp
6+
7+
if [ $? -eq 0 ]; then
8+
echo "Compilation successful!"
9+
echo "Running the application..."
10+
echo
11+
./tomato_app
12+
else
13+
echo "Compilation failed!"
14+
echo "Please check for any syntax errors."
15+
fi
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#ifndef NOW_ORDER_FACTORY_H
2+
#define NOW_ORDER_FACTORY_H
3+
4+
#include "OrderFactory.h"
5+
#include "../models/DeliveryOrder.h"
6+
#include "../models/PickupOrder.h"
7+
#include "../utils/TimeUtils.h"
8+
using namespace std;
9+
10+
class NowOrderFactory : public OrderFactory {
11+
public:
12+
Order* createOrder(User* user, Cart* cart, Restaurant* restaurant, const vector<MenuItem>& menuItems,
13+
PaymentStrategy* paymentStrategy, double totalCost, const string& orderType) override {
14+
Order* order = nullptr;
15+
if (orderType == "Delivery") {
16+
auto deliveryOrder = new DeliveryOrder();
17+
deliveryOrder->setUserAddress(user->getAddress());
18+
order = deliveryOrder;
19+
}
20+
else {
21+
auto pickupOrder = new PickupOrder();
22+
pickupOrder->setRestaurantAddress(restaurant->getLocation());
23+
order = pickupOrder;
24+
}
25+
order->setUser(user);
26+
order->setRestaurant(restaurant);
27+
order->setItems(menuItems);
28+
order->setPaymentStrategy(paymentStrategy);
29+
order->setScheduled(TimeUtils::getCurrentTime());
30+
order->setTotal(totalCost);
31+
return order;
32+
}
33+
};
34+
35+
#endif // NOW_ORDER_FACTORY_H
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#ifndef ORDER_FACTORY_H
2+
#define ORDER_FACTORY_H
3+
4+
#include "../models/Order.h"
5+
#include "../models/Cart.h"
6+
#include "../models/Restaurant.h"
7+
#include "../strategies/PaymentStrategy.h"
8+
#include <vector>
9+
#include <string>
10+
using namespace std;
11+
12+
class OrderFactory {
13+
public:
14+
virtual Order* createOrder(User* user, Cart* cart, Restaurant* restaurant, const vector<MenuItem>& menuItems,
15+
PaymentStrategy* paymentStrategy, double totalCost, const string& orderType) = 0;
16+
virtual ~OrderFactory() {}
17+
};
18+
19+
#endif // ORDER_FACTORY_H
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#ifndef SCHEDULED_ORDER_FACTORY_H
2+
#define SCHEDULED_ORDER_FACTORY_H
3+
4+
#include "OrderFactory.h"
5+
#include "../models/DeliveryOrder.h"
6+
#include "../models/PickupOrder.h"
7+
#include "../utils/TimeUtils.h"
8+
using namespace std;
9+
10+
class ScheduledOrderFactory : public OrderFactory {
11+
private:
12+
string scheduleTime;
13+
public:
14+
ScheduledOrderFactory(string scheduleTime) {
15+
this->scheduleTime = scheduleTime;
16+
}
17+
18+
Order* createOrder(User* user, Cart* cart, Restaurant* restaurant, const vector<MenuItem>& menuItems,
19+
PaymentStrategy* paymentStrategy, double totalCost, const string& orderType) override {
20+
Order* order = nullptr;
21+
22+
if(orderType == "Delivery") {
23+
auto deliveryOrder = new DeliveryOrder();
24+
deliveryOrder->setUserAddress(user->getAddress());
25+
order = deliveryOrder;
26+
}
27+
else {
28+
auto pickupOrder = new PickupOrder();
29+
pickupOrder->setRestaurantAddress(restaurant->getLocation());
30+
}
31+
order->setUser(user);
32+
order->setRestaurant(restaurant);
33+
order->setItems(menuItems);
34+
order->setPaymentStrategy(paymentStrategy);
35+
order->setScheduled(scheduleTime);
36+
order->setTotal(totalCost);
37+
return order;
38+
}
39+
};
40+
41+
#endif // SCHEDULED_ORDER_FACTORY_H
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
OnlineFoodOrderingSystem/
2+
3+
├── main.cpp # Composition root and entry point
4+
├── TomatoApp.h # Facade class (main orchestrator)
5+
6+
├── models/
7+
│ ├── MenuItem.h
8+
│ ├── Restaurant.h
9+
│ ├── User.h
10+
│ ├── Cart.h
11+
│ ├── Order.h # Abstract Order
12+
│ ├── DeliveryOrder.h
13+
│ ├── PickupOrder.h
14+
15+
├── managers/
16+
│ ├── RestaurantManager.h
17+
│ ├── OrderManager.h
18+
19+
├── strategies/
20+
│ ├── PaymentStrategy.h # Base class
21+
│ ├── CreditCardPaymentStrategy.h
22+
│ ├── UpiPaymentStrategy.h
23+
24+
├── factories/
25+
│ ├── OrderFactory.h # Abstract factory
26+
│ ├── NowOrderFactory.h
27+
│ ├── ScheduledOrderFactory.h
28+
29+
├── services/
30+
│ └── NotificationService.h
31+
32+
├── utils/
33+
│ └── TimeUtils.h

Src/Food_Delivery_System/main.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <iostream>
2+
#include "TomatoApp.h"
3+
using namespace std;
4+
5+
int main() {
6+
// Create TomatoApp Object
7+
TomatoApp* tomato = new TomatoApp();
8+
9+
// Simulate a user coming in (Happy Flow)
10+
User* user = new User(101, "Aditya", "Delhi");
11+
cout << "User: " << user->getName() << " is active." << endl;
12+
13+
// User searches for restaurants by location
14+
vector<Restaurant*> restaurantList = tomato->searchRestaurants("Delhi");
15+
16+
if (restaurantList.empty()) {
17+
cout << "No restaurants found!" << endl;
18+
return 0;
19+
}
20+
cout << "Found Restaurants:" << endl;
21+
for (auto restaurant : restaurantList) {
22+
cout << " - " << restaurant->getName() << endl;
23+
}
24+
25+
// User selects a restaurant
26+
tomato->selectRestaurant(user, restaurantList[0]);
27+
28+
cout << "Selected restaurant: " << restaurantList[0]->getName() << endl;
29+
30+
// User adds items to the cart
31+
tomato->addToCart(user, "P1");
32+
tomato->addToCart(user, "P2");
33+
34+
tomato->printUserCart(user);
35+
36+
// User checkout the cart
37+
Order* order = tomato->checkoutNow(user, "Delivery", new UpiPaymentStrategy("1234567890"));
38+
39+
// User pay for the cart. If payment is success, notification is sent.
40+
tomato->payForOrder(user, order);
41+
42+
// Cleanup Code.
43+
delete tomato;
44+
delete user;
45+
46+
return 0;
47+
}

0 commit comments

Comments
 (0)