Add state tracking for models and menu loop setup

<Changes>
    1. Added State enum with ACTIVE and INACTIVE values in Enums.h.
    2. Added state member, getter, and setter in User, Service, InventoryItem, and ComboPackage models.
    3. Updated constructors to initialize model objects with ACTIVE state by default.
    4. Added state string conversion helper functions in Enums.h.
    5. Added default return values in Controller getter methods to complete stub implementations.
    6. Added basic menu loop implementation in CustomerMenu and TechnicianMenu for handling user input.
</Changes>
This commit is contained in:
2026-05-19 16:21:56 +05:30
parent dd834ded44
commit d10cc91c40
12 changed files with 148 additions and 4 deletions
@@ -32,10 +32,12 @@ void Controller::updateUserDetails(const std::string& email, const std::string&
util::Map<std::string, const Service*> Controller::getServices() util::Map<std::string, const Service*> Controller::getServices()
{ {
return util::Map<std::string, const Service*>();
} }
util::Map<std::string, const ComboPackage*> Controller::getComboPackages() util::Map<std::string, const ComboPackage*> Controller::getComboPackages()
{ {
return util::Map<std::string, const ComboPackage*>();
} }
void Controller::purchaseService(const util::Vector<std::string>& serviceIDs, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel) void Controller::purchaseService(const util::Vector<std::string>& serviceIDs, const std::string& vehicleNumber, const std::string& vehicleBrand, const std::string& vehicleModel)
@@ -48,6 +50,7 @@ void Controller::purchaseComboPackage(const std::string& comboPackageID, const s
util::Map<std::string, const InventoryItem*> Controller::getInventoryItems() util::Map<std::string, const InventoryItem*> Controller::getInventoryItems()
{ {
return util::Map<std::string, const InventoryItem*>();
} }
const InventoryItem* Controller::getInventoryItem(const std::string& inventoryItemID) const InventoryItem* Controller::getInventoryItem(const std::string& inventoryItemID)
@@ -65,18 +68,22 @@ void Controller::removeInventoryItem(const std::string& inventoryItemID)
util::Map<std::string, const ServiceBooking*> Controller::getServiceBookings() util::Map<std::string, const ServiceBooking*> Controller::getServiceBookings()
{ {
return util::Map<std::string, const ServiceBooking*>();
} }
util::Map<std::string, const ServiceBooking*> Controller::getServiceBookingsByUser(const std::string userID) util::Map<std::string, const ServiceBooking*> Controller::getServiceBookingsByUser(const std::string userID)
{ {
return util::Map<std::string, const ServiceBooking*>();
} }
util::Map<std::string, const User*> Controller::getUsers() util::Map<std::string, const User*> Controller::getUsers()
{ {
return util::Map<std::string, const User*>();
} }
util::Map<std::string, const User*> Controller::getUsers(util::UserType userType) util::Map<std::string, const User*> Controller::getUsers(util::UserType userType)
{ {
return util::Map<std::string, const User*>();
} }
void Controller::createJobCard(const std::string& bookingID, const std::string& technicianID, const std::string& serviceID) void Controller::createJobCard(const std::string& bookingID, const std::string& technicianID, const std::string& serviceID)
@@ -123,6 +130,7 @@ void Controller::completePayment(const std::string& invoiceID, util::PaymentMode
util::Vector<const Notification*> Controller::getNotifications() util::Vector<const Notification*> Controller::getNotifications()
{ {
return util::Vector<const Notification*>();
} }
void Controller::deleteNotification(const std::string& notificationID) void Controller::deleteNotification(const std::string& notificationID)
@@ -4,12 +4,14 @@ int ComboPackage::m_uid = 0;
ComboPackage::ComboPackage() ComboPackage::ComboPackage()
: m_id("CMP" + std::to_string(++m_uid)), : m_id("CMP" + std::to_string(++m_uid)),
m_status(util::State::ACTIVE),
m_discountPercentage(0.0) {} m_discountPercentage(0.0) {}
ComboPackage::ComboPackage(const std::string& packageName, double discountPercentage, const util::Map<std::string, Service*>& services) ComboPackage::ComboPackage(const std::string& packageName, double discountPercentage, const util::Map<std::string, Service*>& services)
: m_id("CMP" + std::to_string(++m_uid)), : m_id("CMP" + std::to_string(++m_uid)),
m_packageName(packageName), m_packageName(packageName),
m_discountPercentage(discountPercentage), m_discountPercentage(discountPercentage),
m_status(util::State::ACTIVE),
m_services(services) {} m_services(services) {}
const std::string& ComboPackage::getId() const const std::string& ComboPackage::getId() const
@@ -27,6 +29,11 @@ double ComboPackage::getDiscountPercentage() const
return m_discountPercentage; return m_discountPercentage;
} }
util::State ComboPackage::getState() const
{
return m_status;
}
const util::Map<std::string, Service*>& ComboPackage::getServices() const const util::Map<std::string, Service*>& ComboPackage::getServices() const
{ {
return m_services; return m_services;
@@ -50,4 +57,9 @@ void ComboPackage::setDiscountPercentage(double discountPercentage)
void ComboPackage::setServices(const util::Map<std::string, Service*>& services) void ComboPackage::setServices(const util::Map<std::string, Service*>& services)
{ {
m_services = services; m_services = services;
} }
void ComboPackage::setState(util::State status)
{
m_status = status;
}
@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
#include "Enums.h"
class Service; class Service;
@@ -12,6 +13,7 @@ private:
std::string m_packageName; std::string m_packageName;
double m_discountPercentage; double m_discountPercentage;
util::Map<std::string, Service*> m_services; util::Map<std::string, Service*> m_services;
util::State m_status;
public: public:
ComboPackage(); ComboPackage();
ComboPackage(const std::string& packageName, double discountPercentage, const util::Map<std::string, Service*>& services); ComboPackage(const std::string& packageName, double discountPercentage, const util::Map<std::string, Service*>& services);
@@ -19,8 +21,10 @@ public:
const std::string& getPackageName() const; const std::string& getPackageName() const;
double getDiscountPercentage() const; double getDiscountPercentage() const;
const util::Map<std::string, Service*>& getServices() const; const util::Map<std::string, Service*>& getServices() const;
util::State getState() const;
void setId(const std::string& id); void setId(const std::string& id);
void setPackageName(const std::string& packageName); void setPackageName(const std::string& packageName);
void setDiscountPercentage(double discountPercentage); void setDiscountPercentage(double discountPercentage);
void setServices(const util::Map<std::string, Service*>& services); void setServices(const util::Map<std::string, Service*>& services);
void setState(util::State status);
}; };
@@ -5,12 +5,14 @@ int InventoryItem::m_uid = 0;
InventoryItem::InventoryItem() InventoryItem::InventoryItem()
: m_id("IIM" + std::to_string(++m_uid)), : m_id("IIM" + std::to_string(++m_uid)),
m_quantity(0), m_quantity(0),
m_status(util::State::ACTIVE),
m_price(0.0) {} m_price(0.0) {}
InventoryItem::InventoryItem(const std::string& partName, int quantity, double price) InventoryItem::InventoryItem(const std::string& partName, int quantity, double price)
: m_id("IIM" + std::to_string(++m_uid)), : m_id("IIM" + std::to_string(++m_uid)),
m_partName(partName), m_partName(partName),
m_quantity(quantity), m_quantity(quantity),
m_status(util::State::ACTIVE),
m_price(price) {} m_price(price) {}
const std::string& InventoryItem::getId() const const std::string& InventoryItem::getId() const
@@ -33,6 +35,11 @@ double InventoryItem::getPrice() const
return m_price; return m_price;
} }
util::State InventoryItem::getState() const
{
return m_status;
}
void InventoryItem::setId(const std::string& id) void InventoryItem::setId(const std::string& id)
{ {
m_id = id; m_id = id;
@@ -51,4 +58,9 @@ void InventoryItem::setQuantity(int quantity)
void InventoryItem::setPrice(double price) void InventoryItem::setPrice(double price)
{ {
m_price = price; m_price = price;
}
void InventoryItem::setState(util::State status)
{
m_status = status;
} }
@@ -1,5 +1,6 @@
#pragma once #pragma once
#include <string> #include <string>
#include "Enums.h"
class InventoryItem class InventoryItem
{ {
@@ -9,6 +10,7 @@ private:
std::string m_partName; std::string m_partName;
int m_quantity; int m_quantity;
double m_price; double m_price;
util::State m_status;
public: public:
InventoryItem(); InventoryItem();
InventoryItem(const std::string& partName, int quantity, double price); InventoryItem(const std::string& partName, int quantity, double price);
@@ -16,8 +18,10 @@ public:
const std::string& getPartName() const; const std::string& getPartName() const;
int getQuantity() const; int getQuantity() const;
double getPrice() const; double getPrice() const;
util::State getState() const;
void setId(const std::string& id); void setId(const std::string& id);
void setPartName(const std::string& partName); void setPartName(const std::string& partName);
void setQuantity(int quantity); void setQuantity(int quantity);
void setPrice(double price); void setPrice(double price);
void setState(util::State status);
}; };
@@ -4,12 +4,14 @@ int Service::m_uid = 0;
Service::Service() Service::Service()
: m_id("SRV" + std::to_string(++m_uid)), : m_id("SRV" + std::to_string(++m_uid)),
m_status(util::State::ACTIVE),
m_laborCost(0.0) {} m_laborCost(0.0) {}
Service::Service(const std::string& name, const util::Map<std::string, InventoryItem*>& requiredInventoryItems, double laborCost) Service::Service(const std::string& name, const util::Map<std::string, InventoryItem*>& requiredInventoryItems, double laborCost)
: m_id("SRV" + std::to_string(++m_uid)), : m_id("SRV" + std::to_string(++m_uid)),
m_name(name), m_name(name),
m_requiredInventoryItems(requiredInventoryItems), m_requiredInventoryItems(requiredInventoryItems),
m_status(util::State::ACTIVE),
m_laborCost(laborCost) {} m_laborCost(laborCost) {}
const std::string& Service::getId() const const std::string& Service::getId() const
@@ -32,6 +34,11 @@ double Service::getLaborCost() const
return m_laborCost; return m_laborCost;
} }
util::State Service::getState() const
{
return m_status;
}
void Service::setId(const std::string& id) void Service::setId(const std::string& id)
{ {
m_id = id; m_id = id;
@@ -50,4 +57,9 @@ void Service::setRequiredInventoryItems(const util::Map<std::string, InventoryIt
void Service::setLaborCost(double laborCost) void Service::setLaborCost(double laborCost)
{ {
m_laborCost = laborCost; m_laborCost = laborCost;
}
void Service::setState(util::State status)
{
m_status = status;
} }
@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <string> #include <string>
#include "Map.h" #include "Map.h"
#include "Enums.h"
class InventoryItem; class InventoryItem;
@@ -12,6 +13,7 @@ private:
std::string m_name; std::string m_name;
util::Map<std::string, InventoryItem*> m_requiredInventoryItems; util::Map<std::string, InventoryItem*> m_requiredInventoryItems;
double m_laborCost; double m_laborCost;
util::State m_status;
public: public:
Service(); Service();
Service(const std::string& name, const util::Map<std::string, InventoryItem*>& requiredInventoryItems, double laborCost); Service(const std::string& name, const util::Map<std::string, InventoryItem*>& requiredInventoryItems, double laborCost);
@@ -19,8 +21,10 @@ public:
const std::string& getName() const; const std::string& getName() const;
const util::Map<std::string, InventoryItem*>& getRequiredInventoryItems() const; const util::Map<std::string, InventoryItem*>& getRequiredInventoryItems() const;
double getLaborCost() const; double getLaborCost() const;
util::State getState() const;
void setId(const std::string& id); void setId(const std::string& id);
void setName(const std::string& name); void setName(const std::string& name);
void setRequiredInventoryItems(const util::Map<std::string, InventoryItem*>& requiredInventoryItems); void setRequiredInventoryItems(const util::Map<std::string, InventoryItem*>& requiredInventoryItems);
void setLaborCost(double laborCost); void setLaborCost(double laborCost);
void setState(util::State status);
}; };
@@ -6,7 +6,8 @@ int User::m_uid = 0;
User::User() User::User()
: m_id("USR" + std::to_string(++m_uid)), : m_id("USR" + std::to_string(++m_uid)),
m_type(util::UserType()) {} m_type(util::UserType::CUSTOMER),
m_status(util::State::ACTIVE) {}
User::User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role) User::User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role)
: m_id("USR" + std::to_string(++m_uid)), : m_id("USR" + std::to_string(++m_uid)),
@@ -15,7 +16,8 @@ User::User(const std::string& userName, const std::string& password, const std::
m_name(name), m_name(name),
m_phone(phone), m_phone(phone),
m_email(email), m_email(email),
m_type(role) {} m_type(role),
m_status(util::State::ACTIVE) {}
User::~User() User::~User()
{ {
@@ -65,6 +67,11 @@ util::UserType User::getUserType() const
return m_type; return m_type;
} }
util::State User::getState() const
{
return m_status;
}
void User::setId(const std::string& id) void User::setId(const std::string& id)
{ {
m_id = id; m_id = id;
@@ -103,4 +110,9 @@ void User::addNotification(Notification* notification)
void User::setRole(util::UserType role) void User::setRole(util::UserType role)
{ {
m_type = role; m_type = role;
} }
void User::setState(util::State status)
{
m_status = status;
}
@@ -18,6 +18,7 @@ private:
std::string m_email; std::string m_email;
util::Map<std::string, Notification*> m_notifications; util::Map<std::string, Notification*> m_notifications;
util::UserType m_type; util::UserType m_type;
util::State m_status;
public: public:
User(); User();
User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role); User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role);
@@ -30,6 +31,7 @@ public:
const std::string& getEmail() const; const std::string& getEmail() const;
util::Map<std::string, Notification*>& getNotifications(); util::Map<std::string, Notification*>& getNotifications();
util::UserType getUserType() const; util::UserType getUserType() const;
util::State getState() const;
void setId(const std::string& id); void setId(const std::string& id);
void setUserName(const std::string& userName); void setUserName(const std::string& userName);
void setPassword(const std::string& password); void setPassword(const std::string& password);
@@ -38,4 +40,5 @@ public:
void setEmail(const std::string& email); void setEmail(const std::string& email);
void addNotification(Notification* notification); void addNotification(Notification* notification);
void setRole(util::UserType role); void setRole(util::UserType role);
void setState(util::State status);
}; };
@@ -28,6 +28,12 @@ namespace util
COMPLETED COMPLETED
}; };
enum class State
{
ACTIVE,
INACTIVE
};
inline std::string getUserTypeString(UserType type) inline std::string getUserTypeString(UserType type)
{ {
switch (type) switch (type)
@@ -135,4 +141,29 @@ namespace util
} }
throw std::invalid_argument("Invalid ServiceJobStatus string"); throw std::invalid_argument("Invalid ServiceJobStatus string");
} }
inline std::string getStateString(State status)
{
switch (status)
{
case State::ACTIVE:
return "STARTED";
case State::INACTIVE:
return "COMPLETED";
}
throw std::invalid_argument("Invalid State");
}
inline State getState(const std::string& value)
{
if (value == "ACTIVE")
{
return State::ACTIVE;
}
if (value == "COMPLETED")
{
return State::INACTIVE;
}
throw std::invalid_argument("Invalid State string");
}
} }
@@ -1,7 +1,29 @@
#include "CustomerMenu.h" #include "CustomerMenu.h"
#include "InputHelper.h"
#include "OutputHelper.h"
void CustomerMenu::showMenu() void CustomerMenu::showMenu()
{ {
bool isMenuActive = true;
while (isMenuActive)
{
try
{
int choice;
util::clear();
std::cout << "" << std::endl;
util::read(choice);
if (!handleOperation(choice))
{
isMenuActive = false;
}
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
util::pressEnter();
}
}
} }
bool CustomerMenu::handleOperation(int choice) bool CustomerMenu::handleOperation(int choice)
@@ -4,6 +4,26 @@
void TechnicianMenu::showMenu() void TechnicianMenu::showMenu()
{ {
bool isMenuActive = true;
while (isMenuActive)
{
try
{
int choice;
util::clear();
std::cout << "" << std::endl;
util::read(choice);
if (!handleOperation(choice))
{
isMenuActive = false;
}
}
catch (const std::exception& e)
{
std::cout << "Exception: " << e.what() << std::endl;
util::pressEnter();
}
}
} }
bool TechnicianMenu::handleOperation(int choice) bool TechnicianMenu::handleOperation(int choice)