reports of any time AFTER 1970 #9

Closed
MassiveAtoms wants to merge 4 commits from timefunctions into master
8 changed files with 241 additions and 142 deletions

View File

@ -9,7 +9,7 @@
void interface(vector<Park_spot>& spots) { void interface(vector<Park_spot>& spots) {
/* /*
string introduction = "P A R K M A N N E"; //logo animation, disable during testing 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.."; cout << "\nWelcome to the parking system. Please login..";
@ -25,18 +25,18 @@ void interface(vector<Park_spot>& spots) {
cout << "ERROR: wrong password. Please retype your password:\n"; cout << "ERROR: wrong password. Please retype your password:\n";
std::getline(cin, password); std::getline(cin, password);
} }
if(query_role_customer(id)==1){ if (query_role_customer(id) == 1) {
interface_admin(spots); interface_admin(spots);
} else if(query_role_customer(id)==0){ } else if (query_role_customer(id) == 0) {
interface_member(spots, c); interface_member(spots, c);
} else { } else {
cout << "ERROR ROLE_INVALID.."; cout << "ERROR ROLE_INVALID!";
} }
} }
void interface_member(vector<Park_spot>& spots,Customer& c) { void interface_member(vector<Park_spot>& spots, Customer& c) {
cout << "Logged in succesfully\n"; cout << "\nLogged in succesfully!\n";
cout << "select an option\n [1] Parking options\n[2]monthy report\n"; cout << "select an option:\n [1] Parking\n[2]Monthly report\n";
int option; int option;
cin >> option; cin >> option;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
@ -56,60 +56,84 @@ void interface_member(vector<Park_spot>& spots,Customer& c) {
} }
void interface_admin(vector<Park_spot>& spots) { void interface_admin(vector<Park_spot>& spots) {
cout << "Welcome to the admin interface. It is not completely ready yet.\n"; cout << "\nWelcome to the admin interface.\n";
cout << "[1] See monthly report of ALL parking spots\n"; cout << "\n[1] Reports & analytics";
cout << "[2] See weekly report of ALL parking spots\n"; cout << "\n[2] Parking spots";
cout << "[3] See monthly report of a specific parking spot\n"; cout << "\n[3] Make new user";
cout << "[4] See weekly report of a specific parking spot\n"; cout << "\nEnter option number: ";
cout << "[5] See current status of parking spots\n";
cout << "[6] Make new customer\n";
cout << "[7] Make new admin\n";
cout << "[8] Make new parking spot\n";
cout << "option[1-8]:";
int option; int option;
cin >> option; cin >> option;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
switch (option) { switch (option) {
case 1: { case 1: {
reports_from_allparkspots(); cout << "[1] See monthly report of ALL parking spots\n";
break; 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: { case 2: {
reports_from_allparkspots(true); cout << "[1] See current status of parking spots\n";
break; 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: { case 3: {
cout << "Which parking spot would you like a report on?\nID:"; cout << "[1] Make new customer\n";
int spotid; cout << "[2] Make new admin\n";
cin >> spotid; cout << "Enter option number: ";
int option_3;
cin >> option_3;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
reports_from_parkspot(spotid); switch (option_3) {
break; case 1: {
new_customer();
break;
}
case 2: {
new_admin();
break;
}
default:
break;
}
} }
case 4: {
cout << "Which parking spot would you like a report on?\nID:";
int spotid;
cin >> spotid;
cin.ignore(10000, '\n');
reports_from_parkspot(spotid, true);
break;
}
case 5: {
current_status_parkspots(spots);
break;
}
case 6: {
new_customer();
break;
}
case 7: {
new_admin();
}
case 8: {
new_parkspot(spots);
break;
}
default: default:
break; break;
} }
@ -118,30 +142,29 @@ void interface_admin(vector<Park_spot>& spots) {
// --------- individual things. // --------- individual things.
void park(Customer& c, vector<Park_spot>& spots) { void park(Customer& c, vector<Park_spot>& spots) {
cout << "You have selected parking option"; cout << "You have selected parking option.\n";
if (!(c.parked())) { if (!(c.parked())) {
cout << "The following spots[which can fit your vehicle] are " cout << "The following spots fit your vehicle and are available: ";
"available: ";
for (Park_spot i : spots) { for (Park_spot i : spots) {
if (i.v_type == c.vehicle) { if (i.v_type == c.vehicle) {
cout << i.id << ", "; cout << i.id << ", ";
} }
} }
cout << "where do you want to park?"; cout << "\nWhere do you want to park?";
int parkid; int parkID;
cin >> parkid; cin >> parkID;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
for (Park_spot& i : spots) { for (Park_spot& i : spots) {
if (i.id == parkid) { if (i.id == parkID) {
i.clock(c); i.clock(c);
cout << "You have parked sucessfully"; cout << "You have parked sucessfully!";
} }
} }
} else { } else {
cout << "You are parked at spot " << c.parked_at() cout << "You are parked at spot " << c.parked_at()
<< ", do you want to clock out?\n enter [1] for yes and [0] for no"; << ", do you want to clock out?\n[1] yes\n[2] no";
int answer = 0; int answer = 0;
cin >> answer; cin >> answer;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
@ -149,7 +172,7 @@ void park(Customer& c, vector<Park_spot>& spots) {
query_parkspot_with_id(c.parked_at(), spots).clock(c); query_parkspot_with_id(c.parked_at(), spots).clock(c);
cout << "You have sucessfully clocked out."; cout << "You have sucessfully clocked out.";
} else { } else {
cout << "OK, have a nice day"; cout << "OK, have a nice day."; // exit to customer login
} }
} }
} }
@ -160,43 +183,123 @@ void new_customer() {
string password; string password;
string telephone; string telephone;
int role = 0; int role = 0;
cout << "What's the name of the customer? "; cout << "\nWhat's the name of the customer? ";
std::getline(cin, name); std::getline(cin, name);
cout << "What's the vehicle type? [1]twoweeler, [2] fourweeler: "; cout << "\nWhat's the vehicle type? \n[1]twoweeler\n[2] fourweeler\n";
cin >> vtype; cin >> vtype;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
cout << "What's the telephone number? "; cout << "What's the telephone number? +";
std::getline(cin, telephone); std::getline(cin, telephone);
cout << "What's the password?"; cout << "\nWhat's the password? ";
std::getline(cin, password); std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role}; Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "New customer sucessfully created\n"; cout << "\nNew customer sucessfully created\n";
newcustomer.update_db(); newcustomer.update_db();
} }
void new_admin() { void new_admin() {
int vtype = 2; //revision required! int vtype = 2; // revision required! Needs to be set to NULL
string name; string name;
string password; string password;
string telephone; string telephone;
int role = 1; int role = 1;
cout << "What's the name of the admin? "; cout << "\nWhat's the name of the admin? ";
std::getline(cin, name); std::getline(cin, name);
cout << "What's the telephone number? "; cout << "\nWhat's the telephone number? +";
std::getline(cin, telephone); std::getline(cin, telephone);
cout << "What's the password?"; cout << "\nWhat's the password?";
std::getline(cin, password); std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role}; Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "New customer sucessfully created\n"; cout << "\nNew customer sucessfully created\n";
newcustomer.update_db(); newcustomer.update_db();
} }
void new_parkspot(vector<Park_spot>& spots) { void new_parkspot(vector<Park_spot>& spots) {
cout << "What type of parking spot? [1] twoweeler, [2] fourweeler: "; cout << "What type of parking spot? \n[1] twoweeler\n[2] fourweeler\n";
int vtype; int vtype;
cin >> vtype; cin >> vtype;
cin.ignore(10000, '\n'); cin.ignore(10000, '\n');
Park_spot newspot{Vehicle_type(vtype)}; Park_spot newspot{Vehicle_type(vtype)};
spots.push_back(newspot); spots.push_back(newspot);
cout << "new parking spot sucessfully created.\n"; cout << "New parking spot sucessfully created.\n";
} }
// time stuff-----------------------------------------------------
pair<int, int> 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<int, int> period;
period.first = mktime(date);
date->tm_mon = month;
period.second = mktime(date);
return period;
}
pair<int, int> 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<int, int> 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<int, int> period;
if (weekly) {
pair<int, int> period = create_week_period();
} else {
pair<int, int> period = create_month_period();
}
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<int, int> period;
if (weekly) {
pair<int, int> period = create_week_period();
} else {
pair<int, int> 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<int, int> period;
if (weekly) {
pair<int, int> period = create_week_period();
} else {
pair<int, int> period = create_month_period();
}
reports_from_customer(customerID, period);
}

View File

@ -124,11 +124,10 @@ cpp/header
} }
// text animtion duh // text animtion duh
void text_animation(const string& text, unsigned int pause_time) void text_animation(const string& text, unsigned int pause_time) {
{ for (const char m : text) // range loop; for each character in string
for(const char m:text) // range loop; for each character in string {
{ cout << m << flush;
cout << m << flush; sleep_for(milliseconds(pause_time));
sleep_for(milliseconds(pause_time)); }
}
} }

View File

@ -65,17 +65,14 @@ Customer query_customer_with_id(int id) {
string telephone = query.getColumn(4); string telephone = query.getColumn(4);
vector<Park_time> park_instances = query_parktimes_for_customer(id); vector<Park_time> park_instances = query_parktimes_for_customer(id);
Customer result{id, name, password, Vehicle_type(vehicle), park_instances, telephone}; Customer result{id, name, password, Vehicle_type(vehicle), park_instances, telephone};
// DEBUG
// cout << "{" << result.id << "," <<result.password <<"," <<
// int(vehicle) << "}\n";
return result; return result;
} }
} }
int query_role_customer(int id){ int query_role_customer(int id) {
SQLite::Statement query(data::db, "SELECT * FROM Customer WHERE id = ?;"); SQLite::Statement query(data::db, "SELECT * FROM Customer WHERE id = ?;");
query.bind(1, id); query.bind(1, id);
while(query.executeStep()){ while (query.executeStep()) {
int role = query.getColumn(5); int role = query.getColumn(5);
return role; return role;
} }
@ -83,6 +80,8 @@ int query_role_customer(int id){
//------------------------------- parkspot info //------------------------------- parkspot info
// -- parkspots info, report gen
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) { Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) {
for (Park_spot& i : parkspots) { for (Park_spot& i : parkspots) {
if (i.id == id) { if (i.id == id) {
@ -91,22 +90,13 @@ Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) {
} }
} }
void reports_from_parkspot(int spotid, bool weekly) { void reports_from_parkspot(int spotid, pair<int, int> period) {
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);
vector<Park_time> park_times; vector<Park_time> 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(1, spotid);
query.bind(2, s_since_epoch); query.bind(2, period.first);
query.bind(3, period.second);
while (query.executeStep()) { while (query.executeStep()) {
int id = query.getColumn(0); int id = query.getColumn(0);
int cid = query.getColumn(1); int cid = query.getColumn(1);
@ -122,20 +112,12 @@ void reports_from_parkspot(int spotid, bool weekly) {
} }
} }
void reports_from_allparkspots(bool weekly) { void reports_from_allparkspots(pair<int, int> period) {
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);
vector<Park_time> park_times; vector<Park_time> park_times;
SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE start > ?;"); SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE start > ? AND end < ?;");
query.bind(1, s_since_epoch); query.bind(1, period.first);
query.bind(2, period.second);
while (query.executeStep()) { while (query.executeStep()) {
int id = query.getColumn(0); int id = query.getColumn(0);
int cid = query.getColumn(1); int cid = query.getColumn(1);
@ -163,19 +145,25 @@ void current_status_parkspots(vector<Park_spot>& spots) {
} }
} }
// -------------- paroking spots vector<Park_time> reports_from_customer(int cid, pair<int, int> period) {
vector<Park_time> 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<Park_spot> populate_spots(){ for (auto i : park_times) {
// vector<Park_spot> spots; cout << i;
// SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > }
// 0;"); return park_times;
// // 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;
// }

View File

@ -13,7 +13,9 @@ SQLite::Database start_db() {
This shouldn't be here, really, but I can't think of a better place 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 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 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( db.exec(

View File

@ -1,8 +1,5 @@
#include "Query.h" #include "Query.h"
using std::cin; using std::cin;
void interface(vector<Park_spot>& spots); void interface(vector<Park_spot>& spots);
@ -11,4 +8,12 @@ void interface_admin(vector<Park_spot>& spots);
void park(Customer& c, vector<Park_spot>& spots); void park(Customer& c, vector<Park_spot>& spots);
void new_customer(); void new_customer();
void new_admin(); void new_admin();
void new_parkspot(vector<Park_spot>& spots); void new_parkspot(vector<Park_spot>& spots);
// time creation
pair<int, int> create_month_period();
pair<int, int> create_week_period();
// report stuff
void report_single_spot(bool weekly = false);
void report_all_spots(bool weekly = false);

View File

@ -15,8 +15,8 @@ using std::cout;
using std::flush; using std::flush;
using std::string; using std::string;
using std::to_string; using std::to_string;
using std::this_thread::sleep_for;
using std::chrono::milliseconds; using std::chrono::milliseconds;
using std::this_thread::sleep_for;
/* /*

View File

@ -3,6 +3,7 @@
#pragma once #pragma once
#include "Park_spot.h" #include "Park_spot.h"
using std::pair;
/*these are the functions that search the database and create objects from it. /*these are the functions that search the database and create objects from it.
@ -52,17 +53,16 @@ furhter.
*/ */
vector<Park_time> query_parktimes_for_customer(int cid); vector<Park_time> query_parktimes_for_customer(int cid);
vector<Customer> query_customer_with_name(string name); vector<Customer> query_customer_with_name(string name);
Customer query_customer_with_id(int id); Customer query_customer_with_id(int id);
vector<Park_spot> populate_spots();
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots); Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots);
int query_role_customer(int id); int query_role_customer(int id);
void reports_from_parkspot(int spotid, bool weekly = false); vector<Park_spot> populate_spots();
void reports_from_allparkspots(bool weekly = false);
void reports_from_parkspot(int spotid, pair<int, int> period);
void reports_from_allparkspots(pair<int, int> period);
void current_status_parkspots(vector<Park_spot>& spots); void current_status_parkspots(vector<Park_spot>& spots);
vector<Park_time> reports_from_customer(int cid, pair<int, int> period);
#endif // CUSTOMER_H #endif // CUSTOMER_H

View File

@ -1,5 +1,6 @@
#include "headers/Interface.h" #include "headers/Interface.h"
/* /*
Code structure is like this: Code structure is like this:
1. encrypt.cpp en /header/encrypt.h contain functions to hash passwords and 1. encrypt.cpp en /header/encrypt.h contain functions to hash passwords and
@ -47,14 +48,14 @@ int main() {
// state of db: // state of db:
// er zijn 10 parkspots, 5 met biketype en 5 met pickup type // er zijn 10 parkspots, 5 met biketype en 5 met pickup type
// er is een customer met id 1(testcustomer) met password "password" // er is een customer met id 1(testcustomer) met password "password"
while(true) { while (true) {
cin.clear(); cin.clear();
interface(parking_spots); interface(parking_spots);
cout<<"\nexit? Input 'y' or 'n'.."; cout << "\nexit? Input 'y' or 'n'..";
char n; char n;
cin >> n; cin >> n;
cin.clear(); cin.clear();
if(n=='y'){ if (n == 'y') {
break; 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 The error message indicates it is a memory issue but I suspect it's a
concurrency issue. Do not move this. concurrency issue. Do not move this.
*/ */
vector<Park_spot> populate_spots() { vector<Park_spot> populate_spots() {
vector<Park_spot> spots; vector<Park_spot> spots;
SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > 0;"); SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > 0;");
@ -76,4 +78,4 @@ vector<Park_spot> populate_spots() {
spots.push_back({id, taken, cid, vtype}); spots.push_back({id, taken, cid, vtype});
} }
return spots; return spots;
} }