#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 void interface(vector& spots) { /* string introduction = "P A R K M A N N E"; //logo animation, disable during testing text_animation(introduction, 50); */ 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:\n"; std::getline(cin, password); } 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!"; } } void interface_member(vector& spots, Customer& c) { cout << "\nLogged in succesfully!\n"; cout << "select an option:\n [1] Parking\n[2]Monthly report\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; } default: break; } } void interface_admin(vector& spots) { cout << "\nWelcome to the admin interface.\n"; cout << "\n[1] Reports & analytics"; cout << "\n[2] Parking spots"; cout << "\n[3] Make new user"; 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 << "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; } default: break; } } case 2: { cout << "[1] See current status of parking spots\n"; cout << "[2] Make new parking spot\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); } default: break; } } case 3: { cout << "[1] Make new customer\n"; cout << "[2] Make new admin\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; } default: break; } } default: break; } } // --------- individual things. void park(Customer& c, vector& spots) { cout << "You have selected parking option.\n"; if (!(c.parked())) { cout << "The following spots fit your vehicle and are available: "; for (Park_spot i : spots) { if (i.v_type == c.vehicle) { cout << i.id << ", "; } } cout << "\nWhere do you want to park?"; int parkID; cin >> parkID; cin.ignore(10000, '\n'); for (Park_spot& i : spots) { if (i.id == parkID) { 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 } } } 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]twoweeler\n[2] fourweeler\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"; 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"; newcustomer.update_db(); } void new_parkspot(vector& spots) { cout << "What type of parking spot? \n[1] twoweeler\n[2] fourweeler\n"; int vtype; cin >> vtype; cin.ignore(10000, '\n'); Park_spot newspot{Vehicle_type(vtype)}; 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; } // ------------------------------ 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? } 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) { pair period = create_week_period(); } else { pair period = create_month_period(); } reports_from_customer(customerID, period); }