From 706db30fd53cf7fcf9108e6b95df467e0c7c7d12 Mon Sep 17 00:00:00 2001 From: Pradeep Dhupar <148972812+PradeepITT@users.noreply.github.com> Date: Tue, 23 Apr 2024 20:56:37 +0530 Subject: [PATCH 1/5] Inventory Management System --- CustomExceptions.h | 35 ++++++++++ InventoryManager.cpp | 18 ++++++ InventoryManager.h | 11 ++++ Product.cpp | 26 ++++++++ Product.h | 24 +++++++ ProductCatalog.cpp | 56 ++++++++++++++++ ProductCatalog.h | 20 ++++++ main.cpp | 149 +++++++++++++++++++++++++++++++++++++++++++ main.exe | Bin 0 -> 112546 bytes 9 files changed, 339 insertions(+) create mode 100644 CustomExceptions.h create mode 100644 InventoryManager.cpp create mode 100644 InventoryManager.h create mode 100644 Product.cpp create mode 100644 Product.h create mode 100644 ProductCatalog.cpp create mode 100644 ProductCatalog.h create mode 100644 main.cpp create mode 100644 main.exe diff --git a/CustomExceptions.h b/CustomExceptions.h new file mode 100644 index 0000000..3be9c63 --- /dev/null +++ b/CustomExceptions.h @@ -0,0 +1,35 @@ +#ifndef CUSTOM_EXCEPTIONS_H +#define CUSTOM_EXCEPTIONS_H + +#include +#include + +class InvalidInputException : public std::exception { +public: + const char* what() const noexcept override { + return "Invalid input data"; + } +}; + +class ProductNotFoundException : public std::exception { +public: + const char* what() const noexcept override { + return "Product not found"; + } +}; + +class InsufficientQuantityException : public std::exception { +public: + const char* what() const noexcept override { + return "Insufficient quantity"; + } +}; + +class DuplicateProductException : public std::exception { +public: + const char* what() const noexcept override { + return "Duplicate product"; + } +}; + +#endif // CUSTOM_EXCEPTIONS_H diff --git a/InventoryManager.cpp b/InventoryManager.cpp new file mode 100644 index 0000000..e3caf59 --- /dev/null +++ b/InventoryManager.cpp @@ -0,0 +1,18 @@ +#include "InventoryManager.h" +#include + +using namespace std; + +void InventoryManager::displayInventory(const ProductCatalog& catalog) const { + const vector& products = catalog.getProducts(); + + if (products.empty()) { + cout << "Inventory is empty." << endl; + } else { + cout << "Inventory:\n"; + cout << "ID\tName\tPrice \tQuantity\n"; + for (const Product& product : products) { + cout << product.getId() << "\t" << product.getName() << "\tRs " << product.getPrice() << "\t" << product.getQuantity() << endl; + } + } +} diff --git a/InventoryManager.h b/InventoryManager.h new file mode 100644 index 0000000..a40f8e2 --- /dev/null +++ b/InventoryManager.h @@ -0,0 +1,11 @@ +#ifndef INVENTORYMANAGER_H +#define INVENTORYMANAGER_H + +#include "ProductCatalog.h" + +class InventoryManager { +public: + void displayInventory(const ProductCatalog& catalog) const; +}; + +#endif // INVENTORYMANAGER_H diff --git a/Product.cpp b/Product.cpp new file mode 100644 index 0000000..0e3a5b2 --- /dev/null +++ b/Product.cpp @@ -0,0 +1,26 @@ +#include "Product.h" +#include +using namespace std; + +Product::Product(int _id, string _name, float _price, int _quantity) + : id(_id), name(_name), price(_price), quantity(_quantity) {} + +int Product::getId() const { return id; } + +string Product::getName() const { return name; } + +float Product::getPrice() const { return price; } + +int Product::getQuantity() const { return quantity; } + +void Product::setPrice(float _price) { + if (_price < 0) + throw invalid_argument("Price cannot be negative"); + price = _price; +} + +void Product::setQuantity(int _quantity) { + if (_quantity < 0) + throw invalid_argument("Quantity cannot be negative"); + quantity = _quantity; +} diff --git a/Product.h b/Product.h new file mode 100644 index 0000000..316da05 --- /dev/null +++ b/Product.h @@ -0,0 +1,24 @@ +#ifndef PRODUCT_H +#define PRODUCT_H + +#include +using namespace std; + +class Product { +private: + int id; + string name; + float price; + int quantity; + +public: + Product(int _id, string _name, float _price, int _quantity); + int getId() const; + string getName() const; + float getPrice() const; + int getQuantity() const; + void setPrice(float _price); + void setQuantity(int _quantity); +}; + +#endif // PRODUCT_H diff --git a/ProductCatalog.cpp b/ProductCatalog.cpp new file mode 100644 index 0000000..c7e61d9 --- /dev/null +++ b/ProductCatalog.cpp @@ -0,0 +1,56 @@ +#include "ProductCatalog.h" +#include "Product.h" +#include "CustomExceptions.h" +#include +#include +using namespace std; + +void ProductCatalog::addProduct(const Product& product) { + for (const Product& p : products) { + if (p.getId() == product.getId()) { + throw DuplicateProductException(); + } + } + products.push_back(product); +} + +void ProductCatalog::updateProduct(int id, float price, int quantity) { + bool found = false; + for (Product& p : products) { + if (p.getId() == id) { + p.setPrice(price); + p.setQuantity(quantity); + found = true; + break; + } + } + if (!found) { + throw invalid_argument("Product not found"); + } +} + +void ProductCatalog::deleteProduct(int id) { + auto it = remove_if(products.begin(), products.end(), [id](const Product& p) { return p.getId() == id; }); + if (it == products.end()) { + throw invalid_argument("Product not found"); + } + products.erase(it, products.end()); +} +void ProductCatalog::sellProduct(int id, int quantity) { + // Find product by ID + auto it = std::find_if(products.begin(), products.end(), + [id](const Product& p) { return p.getId() == id; }); + if (it == products.end()) { + throw ProductNotFoundException(); + } + + if (it->getQuantity() < quantity) { + throw InsufficientQuantityException(); + } + + it->setQuantity(it->getQuantity() - quantity); +} + +const vector& ProductCatalog::getProducts() const { + return products; +} diff --git a/ProductCatalog.h b/ProductCatalog.h new file mode 100644 index 0000000..3fcde8f --- /dev/null +++ b/ProductCatalog.h @@ -0,0 +1,20 @@ +#ifndef PRODUCTCATALOG_H +#define PRODUCTCATALOG_H + +#include "Product.h" +#include +using namespace std; + +class ProductCatalog { +private: + vector products; + +public: + void addProduct(const Product& product); + void updateProduct(int id, float price, int quantity); + void deleteProduct(int id); + void sellProduct(int id, int quantity); + const vector& getProducts() const; +}; + +#endif // PRODUCTCATALOG_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..f37293a --- /dev/null +++ b/main.cpp @@ -0,0 +1,149 @@ +#include "ProductCatalog.h" +#include "InventoryManager.h" +#include "CustomExceptions.h" +#include +#include // for clearing input buffer +using namespace std; + +void clearInputBuffer() { + cin.clear(); + cin.ignore(numeric_limits::max(), '\n'); +} + +int main() { + ProductCatalog catalog; + InventoryManager manager; + + int choice; + bool exitProgram = false; + + do { + try { + cout << "Main Menu:\n"; + cout << "1. Add Product\n"; + cout << "2. Update Product\n"; + cout << "3. Delete Product\n"; + cout << "4. Sell Product\n"; + cout << "5. Display Inventory\n"; + cout << "6. Exit\n"; + cout << "Enter your choice: "; + cin >> choice; + + switch (choice) { + case 1: { + int id; + string name; + float price; + int quantity; + + cout << "Enter product ID: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter product name: "; + getline(cin, name); + + cout << "Enter product price: "; + if (!(cin >> price) || price < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter product quantity: "; + if (!(cin >> quantity) || quantity < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.addProduct(Product(id, name, price, quantity)); + cout << "Product added successfully.\n"; + break; + } + case 2: { + int id; + float price; + int quantity; + + cout << "Enter product ID to update: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter new price: "; + if (!(cin >> price) || price < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter new quantity: "; + if (!(cin >> quantity) || quantity < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.updateProduct(id, price, quantity); + cout << "Product updated successfully.\n"; + break; + } + case 3: { + int id; + cout << "Enter product ID to delete: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.deleteProduct(id); + cout << "Product deleted successfully.\n"; + break; + } + case 4: { + int id; + int quantity; + + cout << "Enter product ID to sell: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter quantity to sell: "; + if (!(cin >> quantity) || quantity <= 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.sellProduct(id, quantity); + cout << "Product sold successfully.\n"; + break; + } + case 5: + manager.displayInventory(catalog); + break; + case 6: + cout << "Exiting...\n"; + exitProgram = true; + break; + default: + cout << "Invalid choice. Please try again.\n"; + } + } catch (const InvalidInputException& e) { + cerr << "Invalid input data: " << e.what() << endl; + clearInputBuffer(); + } catch (const ProductNotFoundException& e) { + cerr << "Product not found: " << e.what() << endl; + } catch (const InsufficientQuantityException& e) { + cerr << "Insufficient quantity: " << e.what() << endl; + } catch (const DuplicateProductException& e) { + cerr << "Duplicate product: " << e.what() << endl; + } catch (const exception& e) { + cerr << "Exception: " << e.what() << endl; + } + + } while (!exitProgram); + + return 0; +} diff --git a/main.exe b/main.exe new file mode 100644 index 0000000000000000000000000000000000000000..627a66c05f22c47ed28e0effe6062fe6250084cd GIT binary patch literal 112546 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 literal 0 HcmV?d00001 From 8d5e50266236deed961986dbba5419a833f0e873 Mon Sep 17 00:00:00 2001 From: Pradeep Dhupar <148972812+PradeepITT@users.noreply.github.com> Date: Mon, 29 Apr 2024 15:01:46 +0530 Subject: [PATCH 2/5] Update CustomExceptions.h --- CustomExceptions.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CustomExceptions.h b/CustomExceptions.h index 3be9c63..409f530 100644 --- a/CustomExceptions.h +++ b/CustomExceptions.h @@ -1,31 +1,31 @@ #ifndef CUSTOM_EXCEPTIONS_H #define CUSTOM_EXCEPTIONS_H - +using namespace std; #include #include -class InvalidInputException : public std::exception { +class InvalidInputException : public exception { public: const char* what() const noexcept override { return "Invalid input data"; } }; -class ProductNotFoundException : public std::exception { +class ProductNotFoundException : public exception { public: const char* what() const noexcept override { return "Product not found"; } }; -class InsufficientQuantityException : public std::exception { +class InsufficientQuantityException : public exception { public: const char* what() const noexcept override { return "Insufficient quantity"; } }; -class DuplicateProductException : public std::exception { +class DuplicateProductException : public exception { public: const char* what() const noexcept override { return "Duplicate product"; From 3204e51ea304ed5d839c0216443bda2c0450cf53 Mon Sep 17 00:00:00 2001 From: Pradeep Dhupar <148972812+PradeepITT@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:15:43 +0530 Subject: [PATCH 3/5] Update main.cpp --- main.cpp | 186 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 99 insertions(+), 87 deletions(-) diff --git a/main.cpp b/main.cpp index f37293a..895e9a7 100644 --- a/main.cpp +++ b/main.cpp @@ -10,6 +10,96 @@ void clearInputBuffer() { cin.ignore(numeric_limits::max(), '\n'); } +void addProduct(ProductCatalog& catalog) { + int id; + string name; + float price; + int quantity; + + cout << "Enter product ID: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter product name: "; + getline(cin, name); + + cout << "Enter product price: "; + if (!(cin >> price) || price < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter product quantity: "; + if (!(cin >> quantity) || quantity < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.addProduct(Product(id, name, price, quantity)); + cout << "Product added successfully.\n"; +} + +void updateProduct(ProductCatalog& catalog) { + int id; + float price; + int quantity; + + cout << "Enter product ID to update: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter new price: "; + if (!(cin >> price) || price < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter new quantity: "; + if (!(cin >> quantity) || quantity < 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.updateProduct(id, price, quantity); + cout << "Product updated successfully.\n"; +} + +void deleteProduct(ProductCatalog& catalog) { + int id; + cout << "Enter product ID to delete: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.deleteProduct(id); + cout << "Product deleted successfully.\n"; +} + +void sellProduct(ProductCatalog& catalog) { + int id; + int quantity; + + cout << "Enter product ID to sell: "; + if (!(cin >> id)) { + throw InvalidInputException(); + } + clearInputBuffer(); + + cout << "Enter quantity to sell: "; + if (!(cin >> quantity) || quantity <= 0) { + throw InvalidInputException(); + } + clearInputBuffer(); + + catalog.sellProduct(id, quantity); + cout << "Product sold successfully.\n"; +} + int main() { ProductCatalog catalog; InventoryManager manager; @@ -23,103 +113,25 @@ int main() { cout << "1. Add Product\n"; cout << "2. Update Product\n"; cout << "3. Delete Product\n"; - cout << "4. Sell Product\n"; + cout << "4. Sell Product\n"; cout << "5. Display Inventory\n"; cout << "6. Exit\n"; cout << "Enter your choice: "; cin >> choice; switch (choice) { - case 1: { - int id; - string name; - float price; - int quantity; - - cout << "Enter product ID: "; - if (!(cin >> id)) { - throw InvalidInputException(); - } - clearInputBuffer(); - - cout << "Enter product name: "; - getline(cin, name); - - cout << "Enter product price: "; - if (!(cin >> price) || price < 0) { - throw InvalidInputException(); - } - clearInputBuffer(); - - cout << "Enter product quantity: "; - if (!(cin >> quantity) || quantity < 0) { - throw InvalidInputException(); - } - clearInputBuffer(); - - catalog.addProduct(Product(id, name, price, quantity)); - cout << "Product added successfully.\n"; + case 1: + addProduct(catalog); break; - } - case 2: { - int id; - float price; - int quantity; - - cout << "Enter product ID to update: "; - if (!(cin >> id)) { - throw InvalidInputException(); - } - clearInputBuffer(); - - cout << "Enter new price: "; - if (!(cin >> price) || price < 0) { - throw InvalidInputException(); - } - clearInputBuffer(); - - cout << "Enter new quantity: "; - if (!(cin >> quantity) || quantity < 0) { - throw InvalidInputException(); - } - clearInputBuffer(); - - catalog.updateProduct(id, price, quantity); - cout << "Product updated successfully.\n"; + case 2: + updateProduct(catalog); break; - } - case 3: { - int id; - cout << "Enter product ID to delete: "; - if (!(cin >> id)) { - throw InvalidInputException(); - } - clearInputBuffer(); - - catalog.deleteProduct(id); - cout << "Product deleted successfully.\n"; + case 3: + deleteProduct(catalog); break; - } - case 4: { - int id; - int quantity; - - cout << "Enter product ID to sell: "; - if (!(cin >> id)) { - throw InvalidInputException(); - } - clearInputBuffer(); - - cout << "Enter quantity to sell: "; - if (!(cin >> quantity) || quantity <= 0) { - throw InvalidInputException(); - } - clearInputBuffer(); - - catalog.sellProduct(id, quantity); - cout << "Product sold successfully.\n"; + case 4: + sellProduct(catalog); break; - } case 5: manager.displayInventory(catalog); break; From d749c8139f4113e8461edfc4f3f86113ffc13916 Mon Sep 17 00:00:00 2001 From: Pradeep Dhupar <148972812+PradeepITT@users.noreply.github.com> Date: Wed, 1 May 2024 11:39:57 +0530 Subject: [PATCH 4/5] Update ProductCatalog.cpp --- ProductCatalog.cpp | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/ProductCatalog.cpp b/ProductCatalog.cpp index c7e61d9..82376f7 100644 --- a/ProductCatalog.cpp +++ b/ProductCatalog.cpp @@ -6,20 +6,20 @@ using namespace std; void ProductCatalog::addProduct(const Product& product) { - for (const Product& p : products) { - if (p.getId() == product.getId()) { + for (const Product& existingProduct : products) { + if (existingProduct.getId() == product.getId()) { throw DuplicateProductException(); } } products.push_back(product); } -void ProductCatalog::updateProduct(int id, float price, int quantity) { +void ProductCatalog::updateProduct(int productId, float newPrice, int newQuantity) { bool found = false; - for (Product& p : products) { - if (p.getId() == id) { - p.setPrice(price); - p.setQuantity(quantity); + for (Product& product : products) { + if (product.getId() == productId) { + product.setPrice(newPrice); + product.setQuantity(newQuantity); found = true; break; } @@ -29,26 +29,27 @@ void ProductCatalog::updateProduct(int id, float price, int quantity) { } } -void ProductCatalog::deleteProduct(int id) { - auto it = remove_if(products.begin(), products.end(), [id](const Product& p) { return p.getId() == id; }); - if (it == products.end()) { +void ProductCatalog::deleteProduct(int productId) { + auto productToDelete = remove_if(products.begin(), products.end(), [productId](const Product& product) { return product.getId() == productId; }); + if (productToDelete == products.end()) { throw invalid_argument("Product not found"); } - products.erase(it, products.end()); + products.erase(productToDelete, products.end()); } -void ProductCatalog::sellProduct(int id, int quantity) { + +void ProductCatalog::sellProduct(int productId, int quantity) { // Find product by ID - auto it = std::find_if(products.begin(), products.end(), - [id](const Product& p) { return p.getId() == id; }); - if (it == products.end()) { + auto productIt = std::find_if(products.begin(), products.end(), + [productId](const Product& product) { return product.getId() == productId; }); + if (productIt == products.end()) { throw ProductNotFoundException(); } - if (it->getQuantity() < quantity) { + if (productIt->getQuantity() < quantity) { throw InsufficientQuantityException(); } - it->setQuantity(it->getQuantity() - quantity); + productIt->setQuantity(productIt->getQuantity() - quantity); } const vector& ProductCatalog::getProducts() const { From 3dd7e974b6a0936093ce858ac809dc1ff8775087 Mon Sep 17 00:00:00 2001 From: Pradeep Dhupar <148972812+PradeepITT@users.noreply.github.com> Date: Wed, 1 May 2024 12:00:20 +0530 Subject: [PATCH 5/5] Update ProductCatalog.cpp --- ProductCatalog.cpp | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/ProductCatalog.cpp b/ProductCatalog.cpp index 82376f7..38289fa 100644 --- a/ProductCatalog.cpp +++ b/ProductCatalog.cpp @@ -14,42 +14,35 @@ void ProductCatalog::addProduct(const Product& product) { products.push_back(product); } -void ProductCatalog::updateProduct(int productId, float newPrice, int newQuantity) { - bool found = false; - for (Product& product : products) { - if (product.getId() == productId) { - product.setPrice(newPrice); - product.setQuantity(newQuantity); - found = true; - break; - } - } - if (!found) { - throw invalid_argument("Product not found"); +void ProductCatalog::updateProduct(int id, float price, int quantity) { + auto productToUpdate = find_if(products.begin(), products.end(), [id](const Product& p) { return p.getId() == id; }); + if (productToUpdate == products.end()) { + throw ProductNotFoundException(); } + + productToUpdate->setPrice(price); + productToUpdate->setQuantity(quantity); } -void ProductCatalog::deleteProduct(int productId) { - auto productToDelete = remove_if(products.begin(), products.end(), [productId](const Product& product) { return product.getId() == productId; }); +void ProductCatalog::deleteProduct(int id) { + auto productToDelete = remove_if(products.begin(), products.end(), [id](const Product& p) { return p.getId() == id; }); if (productToDelete == products.end()) { - throw invalid_argument("Product not found"); + throw ProductNotFoundException(); } products.erase(productToDelete, products.end()); } -void ProductCatalog::sellProduct(int productId, int quantity) { - // Find product by ID - auto productIt = std::find_if(products.begin(), products.end(), - [productId](const Product& product) { return product.getId() == productId; }); - if (productIt == products.end()) { +void ProductCatalog::sellProduct(int id, int quantity) { + auto productToSell = find_if(products.begin(), products.end(), [id](const Product& p) { return p.getId() == id; }); + if (productToSell == products.end()) { throw ProductNotFoundException(); } - if (productIt->getQuantity() < quantity) { + if (productToSell->getQuantity() < quantity) { throw InsufficientQuantityException(); } - productIt->setQuantity(productIt->getQuantity() - quantity); + productToSell->setQuantity(productToSell->getQuantity() - quantity); } const vector& ProductCatalog::getProducts() const {