diff --git a/Interface.cpp b/Interface.cpp index 7a1e624..06a6c34 100644 --- a/Interface.cpp +++ b/Interface.cpp @@ -9,7 +9,7 @@ void interface(vector& spots) { /* string introduction = "P A R K M A N N E"; //logo animation, disable during testing - text_animation(introduction, 50); + text_animation(introduction, 50); */ cout << "\nWelcome to the parking system. Please login.."; @@ -25,16 +25,16 @@ void interface(vector& spots) { cout << "ERROR: wrong password. Please retype your password:\n"; std::getline(cin, password); } - if(query_role_customer(id)==1){ + if (query_role_customer(id) == 1) { interface_admin(spots); - } else if(query_role_customer(id)==0){ + } else if (query_role_customer(id) == 0) { interface_member(spots, c); } else { cout << "ERROR ROLE_INVALID!"; } } -void interface_member(vector& spots,Customer& c) { +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; @@ -70,60 +70,28 @@ void interface_admin(vector& spots) { 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 month\n"; - cout << "[6] See weekly report of a specific week\n"; */ cout << "Enter option number: "; int option_1; cin >> option_1; cin.ignore(10000, '\n'); switch (option_1) { - case 1: { - reports_from_allparkspots(); - break; - } - case 2: { - reports_from_allparkspots(true); - break; - } - case 3: { - cout << "Which parking spot would you like a report on?\n"; - cout << "Parking spot ID: "; - int spotID; - cin >> spotID; - cin.ignore(10000, '\n'); - reports_from_parkspot(spotID); - break; - } - case 4: { - cout << "Which parking spot would you like a report on?\n"; - cout << "Parking spot ID: "; - int spotID; - cin >> spotID; - cin.ignore(10000, '\n'); - reports_from_parkspot(spotID, true); - break; - } - /*case 5: { - cout << "Which month would you like a report on?\n"; - cout << "[1] January, [2] February, [3] March, [4] April, [5] May," - "\n[6] June, [7] July, [8] August, [9] September, [10] October, [11] November, [12] December\n"; - cout << "Enter month number: "; - int month; - cin >> month; - cin.ignore(10000, '\n'); - report_from_month(month); - break; - } - case 6: { - cout << "Which week would you like a report on?\n"; - cout << "Enter week number: "; - int week; - cin >> week; - cin.ignore(10000, '\n'); - report_from_week(week); - break; - }*/ - default: + 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; } } @@ -135,14 +103,14 @@ void interface_admin(vector& spots) { cin >> option_2; cin.ignore(10000, '\n'); switch (option_2) { - case 1: { - current_status_parkspots(spots); - break; - } - case 2: { - new_parkspot(spots); - } - default: + case 1: { + current_status_parkspots(spots); + break; + } + case 2: { + new_parkspot(spots); + } + default: break; } } @@ -154,15 +122,15 @@ void interface_admin(vector& spots) { cin >> option_3; cin.ignore(10000, '\n'); switch (option_3) { - case 1: { - new_customer(); - break; - } - case 2: { - new_admin(); - break; - } - default: + case 1: { + new_customer(); + break; + } + case 2: { + new_admin(); + break; + } + default: break; } } @@ -204,7 +172,7 @@ void park(Customer& c, vector& spots) { 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 << "OK, have a nice day."; // exit to customer login } } } @@ -230,7 +198,7 @@ void new_customer() { } void new_admin() { - int vtype = 2; //revision required! Needs to be set to NULL + int vtype = 2; // revision required! Needs to be set to NULL string name; string password; string telephone; @@ -255,3 +223,85 @@ void new_parkspot(vector& spots) { 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); +} \ No newline at end of file diff --git a/Park_time.cpp b/Park_time.cpp index 70a7987..53811ef 100644 --- a/Park_time.cpp +++ b/Park_time.cpp @@ -124,11 +124,10 @@ cpp/header } // text animtion duh -void text_animation(const string& text, unsigned int pause_time) -{ - for(const char m:text) // range loop; for each character in string - { - cout << m << flush; - sleep_for(milliseconds(pause_time)); - } +void text_animation(const string& text, unsigned int pause_time) { + for (const char m : text) // range loop; for each character in string + { + cout << m << flush; + sleep_for(milliseconds(pause_time)); + } } diff --git a/Query.cpp b/Query.cpp index 7dd237d..0dbac1d 100644 --- a/Query.cpp +++ b/Query.cpp @@ -65,17 +65,14 @@ Customer query_customer_with_id(int id) { string telephone = query.getColumn(4); vector park_instances = query_parktimes_for_customer(id); Customer result{id, name, password, Vehicle_type(vehicle), park_instances, telephone}; - // DEBUG - // cout << "{" << result.id << "," <& parkspots) { for (Park_spot& i : parkspots) { if (i.id == id) { @@ -91,22 +90,13 @@ Park_spot query_parkspot_with_id(int id, vector& parkspots) { } } -void reports_from_parkspot(int spotid, bool weekly) { - std::time_t t = std::time(0); // get time now - std::tm* now = std::localtime(&t); - - if (weekly) { - now->tm_wday = 1; - } else { - now->tm_mday = 1; - } - - int s_since_epoch = mktime(now); - +void reports_from_parkspot(int spotid, pair period) { vector park_times; - SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE spot_id = ? AND start > ?;"); + SQLite::Statement query(data::db, + "SELECT * FROM Park_time WHERE spot_id = ? AND start > ? AND end < ?;"); query.bind(1, spotid); - query.bind(2, s_since_epoch); + query.bind(2, period.first); + query.bind(3, period.second); while (query.executeStep()) { int id = query.getColumn(0); int cid = query.getColumn(1); @@ -122,20 +112,12 @@ void reports_from_parkspot(int spotid, bool weekly) { } } -void reports_from_allparkspots(bool weekly) { - std::time_t t = std::time(0); // get time now - std::tm* now = std::localtime(&t); - if (weekly) { - now->tm_wday = 1; - } else { - now->tm_mday = 1; - } - - int s_since_epoch = mktime(now); - +void reports_from_allparkspots(pair period) { vector park_times; - SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE start > ?;"); - query.bind(1, s_since_epoch); + SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE start > ? AND end < ?;"); + query.bind(1, period.first); + query.bind(2, period.second); + while (query.executeStep()) { int id = query.getColumn(0); int cid = query.getColumn(1); @@ -163,19 +145,25 @@ void current_status_parkspots(vector& spots) { } } -// -------------- paroking spots +vector reports_from_customer(int cid, pair period) { + vector park_times; + SQLite::Statement query( + data::db, "SELECT * FROM Park_time WHERE customer_id = ? AND start > ? AND end < ?;"); + query.bind(1, cid); + query.bind(2, period.first); + query.bind(3, period.second); + while (query.executeStep()) { + int id = query.getColumn(0); + int spotid = query.getColumn(2); + int start = query.getColumn(3); + int duration = query.getColumn(5); + Park_time result{id, cid, spotid, start, duration}; + park_times.push_back(result); + } + query.reset(); -// vector populate_spots(){ -// vector spots; -// SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > -// 0;"); -// // query.bind(1, 2); -// while (query.executeStep()) { -// int id = query.getColumn(0); -// int taken = query.getColumn(1); -// int cid = query.getColumn(2); -// // park_customers.push_back(query_customer_with_id(cid)); -// spots.push_back({id, taken, cid}); -// } -// return spots; -// } \ No newline at end of file + for (auto i : park_times) { + cout << i; + } + return park_times; +} \ No newline at end of file diff --git a/data.cpp b/data.cpp index 91b9033..3a3737b 100644 --- a/data.cpp +++ b/data.cpp @@ -13,7 +13,9 @@ SQLite::Database start_db() { This shouldn't be here, really, but I can't think of a better place where it runs at least once. This seeds the random generator needed for salts and other stuff, and needs to be run at least once when working - with any libsodium function. + with any libsodium function. And since this definitely needs to be run at least once, why + not include it here? you can't (well, shouldn't be able to) login into anything if this + doesn't run, since you need to compare passwords to login */ } db.exec( diff --git a/headers/Interface.h b/headers/Interface.h index 355c88e..b7171c3 100644 --- a/headers/Interface.h +++ b/headers/Interface.h @@ -1,8 +1,5 @@ - - #include "Query.h" - using std::cin; void interface(vector& spots); @@ -11,4 +8,12 @@ void interface_admin(vector& spots); void park(Customer& c, vector& spots); void new_customer(); void new_admin(); -void new_parkspot(vector& spots); \ No newline at end of file +void new_parkspot(vector& spots); + +// time creation +pair create_month_period(); +pair create_week_period(); + +// report stuff +void report_single_spot(bool weekly = false); +void report_all_spots(bool weekly = false); \ No newline at end of file diff --git a/headers/Park_time.h b/headers/Park_time.h index 8ce44bc..854392a 100644 --- a/headers/Park_time.h +++ b/headers/Park_time.h @@ -15,8 +15,8 @@ using std::cout; using std::flush; using std::string; using std::to_string; -using std::this_thread::sleep_for; using std::chrono::milliseconds; +using std::this_thread::sleep_for; /* diff --git a/headers/Query.h b/headers/Query.h index 5401990..fc70a39 100644 --- a/headers/Query.h +++ b/headers/Query.h @@ -3,6 +3,7 @@ #pragma once #include "Park_spot.h" +using std::pair; /*these are the functions that search the database and create objects from it. @@ -52,17 +53,16 @@ furhter. */ vector query_parktimes_for_customer(int cid); - vector query_customer_with_name(string name); Customer query_customer_with_id(int id); - -vector populate_spots(); - Park_spot query_parkspot_with_id(int id, vector& parkspots); int query_role_customer(int id); -void reports_from_parkspot(int spotid, bool weekly = false); -void reports_from_allparkspots(bool weekly = false); +vector populate_spots(); +void reports_from_parkspot(int spotid, pair period); +void reports_from_allparkspots(pair period); void current_status_parkspots(vector& spots); +vector reports_from_customer(int cid, pair period); + #endif // CUSTOMER_H diff --git a/main.cpp b/main.cpp index 7b1b50d..579c2c1 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,6 @@ #include "headers/Interface.h" + /* Code structure is like this: 1. encrypt.cpp en /header/encrypt.h contain functions to hash passwords and @@ -47,14 +48,14 @@ int main() { // state of db: // er zijn 10 parkspots, 5 met biketype en 5 met pickup type // er is een customer met id 1(testcustomer) met password "password" - while(true) { + while (true) { cin.clear(); interface(parking_spots); - cout<<"\nexit? Input 'y' or 'n'.."; + cout << "\nexit? Input 'y' or 'n'.."; char n; cin >> n; cin.clear(); - if(n=='y'){ + if (n == 'y') { break; } } @@ -65,6 +66,7 @@ Why is this not in query.cpp? Because somehow, it errors out when it's there. The error message indicates it is a memory issue but I suspect it's a concurrency issue. Do not move this. */ + vector populate_spots() { vector spots; SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > 0;"); @@ -76,4 +78,4 @@ vector populate_spots() { spots.push_back({id, taken, cid, vtype}); } return spots; -} \ No newline at end of file +} diff --git a/test.db3 b/test.db3 index 9bcaa3d..6f05261 100644 Binary files a/test.db3 and b/test.db3 differ