Made report functions, monthly weekly for any month or week

This commit is contained in:
MassiveAtoms 2019-07-20 21:40:24 -03:00
parent a79081febf
commit 8c2cbb8a11
8 changed files with 70 additions and 66 deletions

View File

@ -70,55 +70,27 @@ void interface_admin(vector<Park_spot>& 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();
report_all_spots();
break;
}
case 2: {
reports_from_allparkspots(true);
report_all_spots(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);
report_single_spot();
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);
report_single_spot(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:
break;
}
@ -283,7 +255,7 @@ pair<int, int> create_week_period() {
date->tm_min = 0;
pair<int, int> period;
period.first = mktime(date);
period.second = period.first + 604800; // plus 7 days in seconds
period.second = period.first + 604800; // plus 7 days in seconds.
return period;
}
@ -314,3 +286,20 @@ void report_single_spot(bool weekly) {
}
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,8 +124,7 @@ cpp/header
}
// 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
{
cout << m << flush;

View File

@ -65,9 +65,6 @@ Customer query_customer_with_id(int id) {
string telephone = query.getColumn(4);
vector<Park_time> park_instances = query_parktimes_for_customer(id);
Customer result{id, name, password, Vehicle_type(vehicle), park_instances, telephone};
// DEBUG
// cout << "{" << result.id << "," <<result.password <<"," <<
// int(vehicle) << "}\n";
return result;
}
}
@ -83,7 +80,6 @@ int query_role_customer(int id){
//------------------------------- parkspot info
// -- parkspots info, report gen
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) {
@ -96,7 +92,8 @@ Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) {
void reports_from_parkspot(int spotid, pair<int, int> period) {
vector<Park_time> park_times;
SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE spot_id = ? AND start > ? AND end < ?;");
SQLite::Statement query(data::db,
"SELECT * FROM Park_time WHERE spot_id = ? AND start > ? AND end < ?;");
query.bind(1, spotid);
query.bind(2, period.first);
query.bind(3, period.second);
@ -117,7 +114,7 @@ void reports_from_parkspot(int spotid, pair<int, int> period) {
void reports_from_allparkspots(pair<int, int> period) {
vector<Park_time> park_times;
SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE start > ? AND end < >;");
SQLite::Statement query(data::db, "SELECT * FROM Park_time WHERE start > ? AND end < ?;");
query.bind(1, period.first);
query.bind(2, period.second);
@ -148,3 +145,25 @@ void current_status_parkspots(vector<Park_spot>& 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();
for (auto i : park_times) {
cout << i;
}
return park_times;
}

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
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(

View File

@ -1,11 +1,7 @@
#include "Query.h"
using std::cin;
void interface(vector<Park_spot>& spots);
void interface_member(vector<Park_spot>& spots, Customer& c);
void interface_admin(vector<Park_spot>& spots);
@ -19,5 +15,5 @@ pair<int, int> create_month_period() ;
pair<int, int> create_week_period();
// report stuff
void report_single_spot(bool weekly);
void report_all_spots(bool weekly)
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::string;
using std::to_string;
using std::this_thread::sleep_for;
using std::chrono::milliseconds;
using std::this_thread::sleep_for;
/*

View File

@ -53,19 +53,16 @@ furhter.
*/
vector<Park_time> query_parktimes_for_customer(int cid);
vector<Customer> query_customer_with_name(string name);
Customer query_customer_with_id(int id);
vector<Park_spot> populate_spots();
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots);
int query_role_customer(int id);
vector<Park_spot> populate_spots();
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);
vector<Park_time> reports_from_customer(int cid, pair<int, int> period);
#endif // CUSTOMER_H

View File

@ -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
@ -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<Park_spot> populate_spots() {
vector<Park_spot> spots;
SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > 0;");