From c50700e70c6f41a7dc0c031899f5ccc2111367b7 Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Fri, 10 Apr 2026 19:41:08 +0530 Subject: [PATCH] Added CSV header support and persistence for employees SRS02 : Employee Management - Added header handling in FileManager load by skipping first line during deserialization - Added support for writing headers using T::getHeaders() in FileManager save - Implemented getHeaders() for Employee and GeneralEmployee models - Added saveEmployees functionality in EmployeeManagementService - Added persistStates method in ZenvyController - Added deserialization failure check with exception handling - Minor formatting cleanup in FileIO Smitha Mohan --- .../Trenser.FileManager/FileIO.cpp | 3 +-- .../Trenser.FileManager/FileManager.h | 13 ++++++++++- .../controllers/ZenvyController.cpp | 5 ++++ .../controllers/ZenvyController.h | 1 + .../Trenser.Zenvy/models/Employee.cpp | 5 ++++ Trenser.Zenvy/Trenser.Zenvy/models/Employee.h | 1 + .../Trenser.Zenvy/models/GeneralEmployee.cpp | 5 ++++ .../Trenser.Zenvy/models/GeneralEmployee.h | 1 + .../services/EmployeeManagementService.cpp | 23 +++++++++++++++++++ .../services/EmployeeManagementService.h | 1 + .../Trenser.Zenvy/views/UserInterface.cpp | 9 ++++++++ 11 files changed, 64 insertions(+), 3 deletions(-) diff --git a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp index ac79d03..8697eb3 100644 --- a/Trenser.FileManager/Trenser.FileManager/FileIO.cpp +++ b/Trenser.FileManager/Trenser.FileManager/FileIO.cpp @@ -22,7 +22,6 @@ void FileIO::writeAllLines(const std::string& path, std::ofstream file(path, std::ios::trunc); if (!file.is_open()) throw std::runtime_error("Failed to open file " + path); - for (const auto& line : lines) file << line << '\n'; -} \ No newline at end of file +} diff --git a/Trenser.FileManager/Trenser.FileManager/FileManager.h b/Trenser.FileManager/Trenser.FileManager/FileManager.h index 50a9fbf..1c9f3b2 100644 --- a/Trenser.FileManager/Trenser.FileManager/FileManager.h +++ b/Trenser.FileManager/Trenser.FileManager/FileManager.h @@ -1,4 +1,5 @@ #pragma once +#include #include "FileIO.h" template using objects = std::map>; @@ -20,9 +21,19 @@ objects FileManager::load() { objects records; auto lines = FileIO::readAllLines(m_filePath); + bool isHeader = true; for (const auto& record : lines) { + if (isHeader) + { + isHeader = false; + continue; + } auto object = T::deserialize(record); + if (!object) + { + throw std::runtime_error("Failed to deserialize record"); + } records[object->getId()] = object; } return records; @@ -32,7 +43,7 @@ template void FileManager::save(const objects& records) { std::vector lines; - + lines.push_back(T::getHeaders()); for (const auto& recordPair : records) { lines.push_back(recordPair.second->serialize()); diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp index 7d587e6..9d21818 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.cpp @@ -51,3 +51,8 @@ void ZenvyController::loadStates() { m_employeeManagementService->loadEmployees(); } + +void ZenvyController::persistStates() +{ + m_employeeManagementService->saveEmployees(); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h index 2f8c137..1ed7415 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h +++ b/Trenser.Zenvy/Trenser.Zenvy/controllers/ZenvyController.h @@ -56,4 +56,5 @@ public: //File Management void loadStates(); + void persistStates(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp index f673458..fb6e023 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.cpp @@ -263,3 +263,8 @@ std::shared_ptr Employee::deserialize(const std::string& record) return nullptr; } } + +std::string Employee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType"; +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h index 6900943..46657c1 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/Employee.h @@ -90,5 +90,6 @@ public: Enums::EmployeeType getEmployeeType() const; virtual std::string serialize() const; static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); virtual ~Employee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp index 455665b..2392097 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.cpp @@ -58,4 +58,9 @@ std::shared_ptr GeneralEmployee::deserialize(const std::string& employeeDesignation, accountStatus ); +} + +std::string GeneralEmployee::getHeaders() +{ + return "EmployeeId,Email,Name,Phone,Password,TeamID,TeamStatus,AccountStatus,EmployeeType,EmployeeDesignation"; } \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h index 1277fff..61b1a06 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h +++ b/Trenser.Zenvy/Trenser.Zenvy/models/GeneralEmployee.h @@ -43,5 +43,6 @@ public: void setDesignation(Enums::EmployeeDesignation designation); std::string serialize() const override; static std::shared_ptr deserialize(const std::string&); + static std::string getHeaders(); ~GeneralEmployee() = default; }; \ No newline at end of file diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp index 97297ad..6dd1b45 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.cpp @@ -1,3 +1,4 @@ +#include #include #include "EmployeeManagementService.h" #include "Factory.h" @@ -221,3 +222,25 @@ void EmployeeManagementService::loadEmployees() employees.emplace(std::make_pair(admin->getId(), admin)); } } + +void EmployeeManagementService::saveEmployees() +{ + FileManager employeeFileManager(Config::File::EMPLOYEES_FILE); + FileManager generalEmployeeFileManager(Config::File::GENERAL_EMPLOYEES_FILE); + const auto& allEmployees = m_dataStore.getEmployees(); + employeeMap employees; + std::map> generalEmployees; + for (auto& employeePair : allEmployees) + { + if (employeePair.second->getEmployeeType() == Enums::EmployeeType::GENERAL) + { + generalEmployees.emplace(employeePair.first, std::static_pointer_cast(employeePair.second)); + } + else + { + employees.emplace(employeePair); + } + } + employeeFileManager.save(employees); + generalEmployeeFileManager.save(generalEmployees); +} diff --git a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h index cb2daf5..03f3848 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h +++ b/Trenser.Zenvy/Trenser.Zenvy/services/EmployeeManagementService.h @@ -18,4 +18,5 @@ public: void updateProfile(const std::string&,const std::string&); std::shared_ptr getCurrentEmployee(); void loadEmployees(); + void saveEmployees(); }; diff --git a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp index 8c29245..ae98311 100644 --- a/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp +++ b/Trenser.Zenvy/Trenser.Zenvy/views/UserInterface.cpp @@ -47,6 +47,15 @@ void UserInterface::run() util::pressEnter(); } } + try + { + m_controller->persistStates(); + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + return; + } } bool UserInterface::handleOperation(int choice)