diff --git a/Interface.cpp b/Interface.cpp index cda781a..c81e7ec 100644 --- a/Interface.cpp +++ b/Interface.cpp @@ -1,383 +1,442 @@ -#include "headers/Interface.h" + #include "headers/Interface.h" -// I added it to pass spots, because the parking options need it to check where -// is free parking_spots is declared in main, and if i declare it -// liberal use of -// cin.ignore(10000, '\n'); -// so it skips to the next newline, in essence clearing the cin buffer + // I added it to pass spots, because the parking options need it to check where + // is free parking_spots is declared in main, and if i declare it + // liberal use of + // cin.ignore(10000, '\n'); + // so it skips to the next newline, in essence clearing the cin buffer -void interface(vector& spots) { - /* - string introduction = "P A R K M A N N E"; //logo animation, disable during testing - text_animation(introduction, 50); - */ - __label__ exit; - cout << "\nWelcome to the parking system. Please login..."; - int id; - string password; - cout << "\nEnter your id: "; - cin >> id; - cin.ignore(10000, '\n'); - Customer c = query_customer_with_id(id); - cout << "\nEnter your password: "; - std::getline(cin, password); - - while (!(verify_password(c.password, password))) { - cout << "ERROR: wrong password. Please retype your password or type [x] to exit:\n"; + void interface(vector& spots) { + /* + string introduction = "P A R K M A N N E"; //logo animation, disable during testing + text_animation(introduction, 50); + */ + __label__ exit; + system("CLS"); + cout << "\nWelcome to the parking system. Please login..."; + int id; + string password; + cout << "\nEnter your id: "; + cin >> id; + cin.ignore(10000, '\n'); + Customer c = query_customer_with_id(id); + cout << "\nEnter your password: "; std::getline(cin, password); - if (password == "x") - goto exit; - } - if (query_role_customer(id) == 1) { - interface_admin(spots); - } else if (query_role_customer(id) == 0) { - interface_member(spots, c); - } else { - cout << "ERROR ROLE_INVALID!"; - } -exit:; -} -void interface_member(vector& spots, Customer& c) { - __label__ begin, exit; - cout << "\nLogged in succesfully!\n"; - -begin: - cout << "Hello! " << c.name - << ", please select an option:\n[1]Parking\n[2]Monthly report\n" - "[3]Edit information\n[4]Exit\n"; - int option; - cin >> option; - cin.ignore(10000, '\n'); - switch (option) { - case 1: { - park(c, spots); - break; - } - case 2: { - cout << "Has not been implemented yet\n"; - break; + while (!(verify_password(c.password, password))) { + cout << "ERROR: wrong password. Please retype your password or type [x] to exit:\n"; + std::getline(cin, password); + if (password == "x") + goto exit; + } + if (query_role_customer(id) == 1) { + interface_admin(spots); + } else if (query_role_customer(id) == 0) { + interface_member(spots, c); + } else { + cout << "ERROR ROLE_INVALID!"; + } + exit:; } - case 3: { - cout << "Has not been implemented yet\n"; - break; - } + void interface_member(vector& spots, Customer& c) { + __label__ begin, exit; + cout << "\nLogged in succesfully!\n"; - case 4: { - cout << "Exiting...\n"; - goto exit; - break; - } - - default: - break; - } - goto begin; -exit:; -} - -void interface_admin(vector& spots) { - __label__ begin, exit; -begin: - cout << "\nWelcome to the admin interface\n"; - cout << "\n[1] Reports & analytics"; - cout << "\n[2] Parking spots"; - cout << "\n[3] Make new user"; - cout << "\n[4] Exit"; - cout << "\nEnter option number: "; - int option; - cin >> option; - cin.ignore(10000, '\n'); - switch (option) { - case 1: { - cout << "[1] See monthly report of ALL parking spots\n"; - cout << "[2] See weekly report of ALL parking spots\n"; - cout << "[3] See monthly report of a specific parking spot\n"; - cout << "[4] See weekly report of a specific parking spot\n"; - cout << "[5] See monthly report of a specific customer\n"; - cout << "[6] See weekly report of a specific customer\n"; - cout << "Enter option number: "; - int option_1; - cin >> option_1; + begin: + system("CLS"); + cout << "Hello! " << c.name + << ", please select an option:\n[1]Parking\n[2]Monthly report\n" + "[3]Edit information\n[4]Exit\n"; + int option; + cin >> option; cin.ignore(10000, '\n'); - switch (option_1) { + switch (option) { case 1: { - report_all_spots(); + park(c, spots); break; } case 2: { - report_all_spots(true); + report_customer(c.id); + string lol; + std::cout<<"Enter any character to continue..."; + std::cin>>lol; break; } + case 3: { - report_single_spot(); + edit_information(c); break; } + case 4: { - report_single_spot(true); - break; - } - case 5: { - report_customer(0); - break; - } - case 6: { - report_customer(0, true); - break; - } - default: - break; - } - } - case 2: { - cout << "[1] See current status of parking spots\n"; - cout << "[2] Make new parking spot\n"; - cout << "[3] Return\n"; - cout << "Enter option number: "; - int option_2; - cin >> option_2; - cin.ignore(10000, '\n'); - switch (option_2) { - case 1: { - current_status_parkspots(spots); - break; - } - case 2: { - new_parkspot(spots); - break; - } - case 3: { - goto begin; - break; - } - default: - break; - } - break; - } - case 3: { - cout << "[1] Make new customer\n"; - cout << "[2] Make new admin\n"; - cout << "[3] Return\n"; - cout << "Enter option number: "; - int option_3; - cin >> option_3; - cin.ignore(10000, '\n'); - switch (option_3) { - case 1: { - new_customer(); - break; - } - case 2: { - new_admin(); - break; - } - case 3: { - goto begin; - break; - } - default: - break; - } - case 4: { - goto exit; - break; - } break; - } - - default: - break; - } - goto begin; -exit:; -} - -// --------- individual things. - -void park(Customer& c, vector& spots) { - __label__ exit; - cout << "You have selected parking option.\n"; - if (!(c.parked())) { - cout << "The following spots fit your vehicle and are available: \n"; - for (Park_spot i : spots) { - if ((i.v_type == c.vehicle) & (i.taken == false)) { - cout << i.id << ", "; - } - } - - cout << "\nWhere do you want to park? Or type [0] to exit."; - int parkID; - cin >> parkID; - if (!parkID) + cout << "Exiting...\n"; + Sleep(2000); goto exit; + break; + } + + default: + break; + } + goto begin; + exit:; + } + + void interface_admin(vector& spots) { + __label__ begin, exit; + begin: + system("CLS"); + cout << "\nWelcome to the admin interface\n"; + cout << "\n[1] Reports & analytics"; + cout << "\n[2] Parking spots"; + cout << "\n[3] Make new user"; + cout << "\n[4] Exit"; + cout << "\nEnter option number: "; + int option; + cin >> option; cin.ignore(10000, '\n'); - for (Park_spot& i : spots) { - if (i.id == parkID) { - if (confirm()) { - i.clock(c); - cout << "You have parked sucessfully!"; + switch (option) { + case 1: { + cout << "[1] See monthly report of ALL parking spots\n"; + cout << "[2] See weekly report of ALL parking spots\n"; + cout << "[3] See monthly report of a specific parking spot\n"; + cout << "[4] See weekly report of a specific parking spot\n"; + cout << "[5] See monthly report of a specific customer\n"; + cout << "[6] See weekly report of a specific customer\n"; + cout << "[7] Return\n"; + cout << "Enter option number: "; + int option_1; + cin >> option_1; + cin.ignore(10000, '\n'); + switch (option_1) { + case 1: { + report_all_spots(); + break; + } + case 2: { + report_all_spots(true); + break; + } + case 3: { + report_single_spot(); + break; + } + case 4: { + report_single_spot(true); + break; + } + case 5: { + report_customer(0); + break; + } + case 6: { + report_customer(0, true); + break; + } + case 7: { + goto begin; + break; + } + default: + break; + } + string lol; + std::cout<<"Enter any character to continue..."; + std::cin>>lol; + break; + } + case 2: { + cout << "[1] See current status of parking spots\n"; + cout << "[2] Make new parking spot\n"; + cout << "[3] Return\n"; + cout << "Enter option number: "; + int option_2; + cin >> option_2; + cin.ignore(10000, '\n'); + switch (option_2) { + case 1: { + current_status_parkspots(spots); + string lol; + std::cout<<"Enter any character to continue..."; + std::cin>>lol; + break; + } + case 2: { + new_parkspot(spots); + break; + } + case 3: { + goto begin; + break; + } + default: + break; + } + + break; + } + case 3: { + system("CLS"); + cout << "[1] Make new customer\n"; + cout << "[2] Make new admin\n"; + cout << "[3] Return\n"; + cout << "Enter option number: "; + int option_3; + cin >> option_3; + cin.ignore(10000, '\n'); + switch (option_3) { + case 1: { + new_customer(); + break; + } + case 2: { + new_admin(); + break; + } + case 3: { + goto begin; + break; + } + default: + break; + } + case 4: { + std::cout<<"Exiting..."; + Sleep(2000); + goto exit; + break; + } break; + } + + default: + break; + } + goto begin; + exit:; + + } + + // --------- individual things. + + void park(Customer& c, vector& spots) { + __label__ exit; + cout << "You have selected parking option.\n"; + if (!(c.parked())) { + cout << "The following spots fit your vehicle and are available: \n"; + for (Park_spot i : spots) { + if ((i.v_type == c.vehicle) & (i.taken == false)) { + cout << i.id << ", "; + } + } + + cout << "\nWhere do you want to park? Or type [0] to exit."; + int parkID; + cin >> parkID; + if (!parkID) + goto exit; + cin.ignore(10000, '\n'); + for (Park_spot& i : spots) { + if (i.id == parkID) { + if (confirm()) { + i.clock(c); + cout << "You have parked sucessfully!"; + } } } - } - } else { - cout << "You are parked at spot " << c.parked_at() - << ", do you want to clock out?\n[1] Yes\n[2] No"; - int answer = 0; - cin >> answer; - cin.ignore(10000, '\n'); - if (answer) { - query_parkspot_with_id(c.parked_at(), spots).clock(c); - cout << "You have sucessfully clocked out."; } else { - cout << "OK, have a nice day."; // exit to customer login + cout << "You are parked at spot " << c.parked_at() + << ", do you want to clock out?\n[1] Yes\n[2] No"; + int answer = 0; + cin >> answer; + cin.ignore(10000, '\n'); + if (answer) { + query_parkspot_with_id(c.parked_at(), spots).clock(c); + cout << "You have sucessfully clocked out."; + } else { + cout << "OK, have a nice day."; + } + } + exit:; + } + + void new_customer() { + int vtype; + string name; + string password; + string telephone; + int role = 0; + cout << "\nWhat's the name of the customer? "; + std::getline(cin, name); + cout << "\nWhat's the vehicle type? \n[1]Twowheeler\n[2] Fourwheeler\n"; + cin >> vtype; + cin.ignore(10000, '\n'); + cout << "What's the telephone number? +"; + std::getline(cin, telephone); + cout << "\nWhat's the password? "; + std::getline(cin, password); + Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role}; + cout << "\nNew customer sucessfully created\n"; + if (confirm()) + newcustomer.update_db(); + } + + void new_admin() { + int vtype = 2; // revision required! Needs to be set to NULL + string name; + string password; + string telephone; + int role = 1; + cout << "\nWhat's the name of the admin? "; + std::getline(cin, name); + cout << "\nWhat's the telephone number? +"; + std::getline(cin, telephone); + cout << "\nWhat's the password?"; + std::getline(cin, password); + Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role}; + cout << "\nNew customer sucessfully created\n"; + if (confirm()) + newcustomer.update_db(); + } + + void new_parkspot(vector& spots) { + cout << "What type of parking spot? \n[1] Two-wheeler\n[2] Four-wheeler\n"; + int vtype; + cin >> vtype; + cin.ignore(10000, '\n'); + Park_spot newspot{Vehicle_type(vtype)}; + if (confirm()) { + spots.push_back(newspot); + cout << "New parking spot sucessfully created.\n"; } } -exit:; -} -void new_customer() { - int vtype; - string name; - string password; - string telephone; - int role = 0; - cout << "\nWhat's the name of the customer? "; - std::getline(cin, name); - cout << "\nWhat's the vehicle type? \n[1]Twowheeler\n[2] Fourwheeler\n"; - cin >> vtype; - cin.ignore(10000, '\n'); - cout << "What's the telephone number? +"; - std::getline(cin, telephone); - cout << "\nWhat's the password? "; - std::getline(cin, password); - Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role}; - cout << "\nNew customer sucessfully created\n"; - if (confirm()) - newcustomer.update_db(); -} + void edit_information(Customer& c) + { + string string0; int int0; + /*std::cout<<"\nInput to update name or press [0] to keep name:\n"; + std::getline(cin,string0); + if (string0=="0"); + else c.name=string0;*/ -void new_admin() { - int vtype = 2; // revision required! Needs to be set to NULL - string name; - string password; - string telephone; - int role = 1; - cout << "\nWhat's the name of the admin? "; - std::getline(cin, name); - cout << "\nWhat's the telephone number? +"; - std::getline(cin, telephone); - cout << "\nWhat's the password?"; - std::getline(cin, password); - Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role}; - cout << "\nNew customer sucessfully created\n"; - if (confirm()) - newcustomer.update_db(); -} - -void new_parkspot(vector& spots) { - cout << "What type of parking spot? \n[1] Twowheeler\n[2] Fourwheeler\n"; - int vtype; - cin >> vtype; - cin.ignore(10000, '\n'); - Park_spot newspot{Vehicle_type(vtype)}; - if (confirm()) { - spots.push_back(newspot); - cout << "New parking spot sucessfully created.\n"; - } -} - -// time stuff----------------------------------------------------- - -pair create_month_period() { - std::time_t t = std::time(0); - std::tm* date = std::localtime(&t); - int month, year = 0; - cout << "Which month do you want a report on?[6 2018 for June 2018]\n"; - cin >> month >> year; - date->tm_year = year - 1900; - date->tm_mday = 1; - date->tm_mon = month - 1; - pair period; - period.first = mktime(date); - date->tm_mon = month; - period.second = mktime(date); - return period; -} - -pair create_week_period() { - std::time_t t = std::time(0); - std::tm* date = std::localtime(&t); - int day, month, year = 0; - cout << "Which month do you want a report on?[ 20 6 2018 for June 20th, 2018]\n"; - cin >> day >> month >> year; - date->tm_year = year - 1900; - date->tm_mday = day; - date->tm_mon = month - 1; - date->tm_hour = 0; - date->tm_min = 0; - pair period; - period.first = mktime(date); - period.second = period.first + 604800; // plus 7 days in seconds. - return period; -} - -bool confirm(void) { - string ver; - std::cout << "\nAre you sure you want to commit these actions?" - "\n[No] Revert." - "\n[Yes] Commit."; - std::cin >> ver; - if (ver == "YES" | ver == "Yes" | ver == "yes") - return true; - else - return false; -} - -// ------------------------------ report stuff - -void report_all_spots(bool weekly) { - pair period; - if (weekly) { - period = create_week_period(); // remove the pair - } else { - period = create_month_period(); // ^ + std::cout<<"\n Input to update vehicle to [1]Two-Wheeler," + "[2]Four-Wheeler or press [0] to keep vehicle type:\n"; + std::cin>>int0; + if (!int0); + else c.vehicle=Vehicle_type(int0); + cin.ignore(); + std::cout<<"\n Input to update password or press [0] to keep current password:\n"; + std::getline(cin,string0); + if (string0=="0"); + else c.password=hash_password(string0); + + std::cout<<"\n Input to update phone number or press [0] to keep current number:\n"; + std::getline(cin,string0); + if (string0=="0"); + else c.telephone=string0; + c.role=0; + if(confirm()){c.update_db();} } - cout << "working timeperiods: " << period.first << ", " << period.second; // DEBUG + // time stuff----------------------------------------------------- - reports_from_allparkspots(period); // TODO: namechange of reports_from_allparkspots in query? -} + pair create_month_period() { + std::time_t t = std::time(0); + std::tm* date = std::localtime(&t); + int month, year = 0; + cout << "Which month do you want a report on?[6 2018 for June 2018]\n"; + cin >> month >> year; + date->tm_year = year - 1900; + date->tm_mday = 1; + date->tm_mon = month - 1; + pair period; + period.first = mktime(date); + date->tm_mon = month; + period.second = mktime(date); + return period; + } -void report_single_spot(bool weekly) { - cout << "Which parking spot would you like a report on?\n"; - cout << "Parking spot ID: "; - int spotID; - cin >> spotID; - cin.ignore(10000, '\n'); - pair period; - if (weekly) { - period = create_week_period(); // remove the pair - } else { - period = create_month_period(); + pair create_week_period() { + std::time_t t = std::time(0); + std::tm* date = std::localtime(&t); + int day, month, year = 0; + cout << "Which month do you want a report on?[ 20 6 2018 for June 20th, 2018]\n"; + cin >> day >> month >> year; + date->tm_year = year - 1900; + date->tm_mday = day; + date->tm_mon = month - 1; + date->tm_hour = 0; + date->tm_min = 0; + pair period; + period.first = mktime(date); + period.second = period.first + 604800; // plus 7 days in seconds. + return period; } - reports_from_parkspot(spotID, period); -} -void report_customer(int customerID, bool weekly) { - // use report_customer(0) to make interactive - // so admin can call the interactive version, but customer can only call - // report_customer(own_cid) - if (!customerID) { - cout << "What customer do you want a report on? ID: "; - cin >> customerID; + bool confirm(void) { + string ver; + std::cout << "\nAre you sure you want to commit these actions?" + "\n[No] Revert." + "\n[Yes] Commit."; + std::cin >> ver; + if (ver == "YES" | ver == "Yes" | ver == "yes") + { + std::cout<<"Succes! Changes Saved."; + Sleep(1000); + return true; + } + else + { + std::cout<<"No changes committed."; + Sleep(1000); + return false; + } } - pair period; - if (weekly) { - period = create_week_period(); - } else { - period = create_month_period(); + + // ------------------------------ report stuff + + void report_all_spots(bool weekly) { + pair period; + if (weekly) { + period = create_week_period(); // remove the pair + } else { + period = create_month_period(); // ^ + } + + cout << "working timeperiods: " << period.first << ", " << period.second; // DEBUG + + reports_from_allparkspots(period); // TODO: namechange of reports_from_allparkspots in query? } - reports_from_customer(customerID, period); -} \ No newline at end of file + + void report_single_spot(bool weekly) { + cout << "Which parking spot would you like a report on?\n"; + cout << "Parking spot ID: "; + int spotID; + cin >> spotID; + cin.ignore(10000, '\n'); + pair period; + if (weekly) { + period = create_week_period(); // remove the pair + } else { + period = create_month_period(); + } + reports_from_parkspot(spotID, period); + } + + void report_customer(int customerID, bool weekly) { + // use report_customer(0) to make interactive + // so admin can call the interactive version, but customer can only call + // report_customer(own_cid) + if (!customerID) { + cout << "What customer do you want a report on? ID: "; + cin >> customerID; + } + pair period; + if (weekly) { + period = create_week_period(); + } else { + period = create_month_period(); + } + reports_from_customer(customerID, period); + } \ No newline at end of file