17 Commits

Author SHA1 Message Date
3b45ae4d02 Cosmetic changes 2019-07-22 10:17:36 -03:00
8778a72c29 Merge branch 'outputfix' of AP-CT/Parkmanne into billing4real 2019-07-22 12:53:15 +00:00
f3061fe3bc +Edit f, +CLS 2019-07-22 09:51:47 -03:00
c256f5f589 ?? 2019-07-22 09:39:56 -03:00
23144deb04 intergration 2019-07-22 08:57:53 -03:00
e5d736eb9a working? 2019-07-22 08:48:17 -03:00
9a471428a6 works, fixed another db problem 2019-07-22 00:34:26 -03:00
3bf5b26c2b working now 2019-07-21 23:04:26 -03:00
914792948d Parktimes populated 2019-07-21 22:28:43 -03:00
e49b206df7 idk what 2019-07-21 22:21:09 -03:00
a54016340a sdf 2019-07-21 22:13:34 -03:00
b987a2eb78 db - address 2019-07-21 21:58:03 -03:00
03c40541a5 aaaaaaaaaaaa 2019-07-21 21:25:51 -03:00
79a6b9a1e0 Merge branch 'timefunctions' of AP-CT/Parkmanne into billing 2019-07-21 22:24:36 +00:00
ef5ae9dac8 bugfix interface.cpp/reportfuncts 2019-07-20 23:37:52 -03:00
8c2cbb8a11 Made report functions, monthly weekly for any month or week 2019-07-20 21:40:24 -03:00
a79081febf WIP reportgen 2019-07-20 20:32:47 -03:00
12 changed files with 358 additions and 190 deletions

View File

@ -73,7 +73,7 @@ void Customer::update_db() {
string statement =
"UPDATE Customer SET name = '', password = '', "
"vehicle = '', telephone = '', role = '' where id = '';";
statement.insert(89, to_string(id));
statement.insert(98, to_string(id));
statement.insert(84, to_string(role));
statement.insert(73, telephone);
statement.insert(57, to_string(int(vehicle)));

View File

@ -11,8 +11,9 @@ void interface(vector<Park_spot>& 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..";
__label__ exit;
system("CLS");
cout << "\nWelcome to the parking system. Please login...";
int id;
string password;
cout << "\nEnter your id: ";
@ -21,9 +22,12 @@ void interface(vector<Park_spot>& spots) {
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";
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);
@ -32,11 +36,18 @@ void interface(vector<Park_spot>& spots) {
} else {
cout << "ERROR ROLE_INVALID!";
}
exit:;
}
void interface_member(vector<Park_spot>& spots, Customer& c) {
__label__ begin, exit;
cout << "\nLogged in succesfully!\n";
cout << "select an option:\n [1] Parking\n[2]Monthly report\n";
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');
@ -46,20 +57,41 @@ void interface_member(vector<Park_spot>& spots,Customer& c) {
break;
}
case 2: {
cout << "Has not been implemented yet\n";
report_customer(c.id);
string lol;
std::cout<<"Enter any character to continue...";
std::cin>>lol;
break;
}
case 3: {
edit_information(c);
break;
}
case 4: {
cout << "Exiting...\n";
Sleep(2000);
goto exit;
break;
}
default:
break;
}
goto begin;
exit:;
}
void interface_admin(vector<Park_spot>& spots) {
cout << "\nWelcome to the admin interface.\n";
__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;
@ -70,66 +102,54 @@ 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 << "[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: {
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);
case 5: {
report_customer(0);
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);
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;
@ -137,18 +157,30 @@ void interface_admin(vector<Park_spot>& spots) {
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;
@ -162,41 +194,60 @@ void interface_admin(vector<Park_spot>& spots) {
new_admin();
break;
}
default:
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<Park_spot>& spots) {
__label__ exit;
cout << "You have selected parking option.\n";
if (!(c.parked())) {
cout << "The following spots fit your vehicle and are available: ";
cout << "The following spots fit your vehicle and are available: \n";
for (Park_spot i : spots) {
if (i.v_type == c.vehicle) {
if ((i.v_type == c.vehicle) & (i.taken == false)) {
cout << i.id << ", ";
}
}
cout << "\nWhere do you want to park?";
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";
<< ", do you want to clock out?\n[1] Yes\n[2] No";
int answer = 0;
cin >> answer;
cin.ignore(10000, '\n');
@ -204,9 +255,10 @@ void park(Customer& c, vector<Park_spot>& 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:;
}
void new_customer() {
@ -217,7 +269,7 @@ void new_customer() {
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";
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? +";
@ -226,6 +278,7 @@ void new_customer() {
std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created\n";
if (confirm())
newcustomer.update_db();
}
@ -243,15 +296,147 @@ void new_admin() {
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<Park_spot>& spots) {
cout << "What type of parking spot? \n[1] twoweeler\n[2] fourweeler\n";
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";
}
}
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;*/
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();}
}
// 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;
}
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;
}
}
// ------------------------------ report stuff
void report_all_spots(bool weekly) {
pair<int, int> period;
if (weekly) {
period = create_week_period(); // remove the pair<int, int>
} 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<int, int> period;
if (weekly) {
period = create_week_period(); // remove the pair<int, int>
} 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<int, int> period;
if (weekly) {
period = create_week_period();
} else {
period = create_month_period();
}
reports_from_customer(customerID, period);
}

View File

@ -60,7 +60,8 @@ std::ostream& operator<<(std::ostream& os, const Park_time& pt) {
os << "Customer # " << pt.customer_id << "at parking spot " << pt.spot_id << "\n";
os << "Clocked in :" << std::ctime(&start_);
os << "clocked out : " << std::ctime(&end_);
os << "duration : " << pt.duration << "\n";
float dur_h = pt.duration / 3600.0;
os << "duration : " << dur_h << " h\n";
os << "- - - - - - - - - - - - - - - - - - - -\n";
return os;
}
@ -124,8 +125,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;

103
Query.cpp
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,34 +80,6 @@ int query_role_customer(int id){
//------------------------------- parkspot info
pair<int, int> create_month_period(int month, int year) {
std::time_t t = std::time(0);
std::tm* date = std::localtime(&t);
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(int day, int month, int year){
std::time_t t = std::time(0);
std::tm* date = std::localtime(&t);
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;
}
// -- parkspots info, report gen
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots) {
@ -121,22 +90,13 @@ Park_spot query_parkspot_with_id(int id, vector<Park_spot>& 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<int, int> period) {
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(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);
@ -152,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<int, int> period) {
vector<Park_time> 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);
@ -183,13 +135,40 @@ void reports_from_allparkspots(bool weekly) {
}
void current_status_parkspots(vector<Park_spot>& spots) {
cout << "P.spot \t\tStatus\t\t Customer\n";
for (auto& i : spots) {
cout << "---------------------------\n";
cout << "PS #" << i.id << "\n";
cout << "Taken: " << ((i.taken) ? "true" : "false") << "\n";
cout << "\n" << i.id << "\t\t" << ((i.taken) ? "true" : "false");
if (i.taken) {
cout << "Customer#" << i.parked_customer << " parked there\n";
cout << "\t\t" << i.parked_customer;
}
}
cout << "\n";
}
vector<Park_time> reports_from_customer(int cid, pair<int, int> period) {
vector<Park_time> park_times;
int verhicle = int(query_customer_with_id(cid).vehicle);
float sum = 0;
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);
sum += duration/3600;
}
query.reset();
for (auto i : park_times) {
cout << std::setprecision(2) << i;
sum += i.duration / 3600.0;
}
cout << "Your fees for this month: $" << std::setprecision(4) << sum * verhicle << "\n";
return park_times;
}

BIN
_test.db3 Normal file

Binary file not shown.

View File

@ -13,12 +13,14 @@ 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(
"create table if not exists Customer (id integer primary key, name "
"text, password text, vehicle int, telephone text)");
"text, password text, vehicle int, telephone text, role int)");
db.exec(
"create table if not exists Park_spot (id integer primary key, taken "
"int, customer_id int, vehicle_type int)");

View File

@ -1,10 +1,10 @@
#include "Query.h"
#include <stdlib.h>
#include <synchapi.h>
using std::cin;
//interface functions
void interface(vector<Park_spot>& spots);
void interface_member(vector<Park_spot>& spots, Customer& c);
void interface_admin(vector<Park_spot>& spots);
@ -12,3 +12,16 @@ void park(Customer& c, vector<Park_spot>& spots);
void new_customer();
void new_admin();
void new_parkspot(vector<Park_spot>& spots);
void edit_information(Customer&);
// time creation
pair<int, int> create_month_period();
pair<int, int> create_week_period();
// report functions
void report_single_spot(bool weekly = false);
void report_all_spots(bool weekly = false);
void report_customer(int customerID, bool weekly = false);
// confirmation function
bool confirm();

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

@ -3,6 +3,7 @@
#pragma once
#include "Park_spot.h"
#include <iomanip>
using std::pair;
/*these are the functions that search the database and create objects from it.
@ -53,20 +54,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);
void reports_from_parkspot(int spotid, bool weekly = false);
void reports_from_allparkspots(bool weekly = false);
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);
pair<int, int> create_month_period(int month, int year) ;
pair<int, int> create_week_period(int day, int month, int year);
#endif // CUSTOMER_H

View File

@ -1,3 +1,4 @@
#include "headers/Interface.h"
/*
@ -44,19 +45,9 @@ static vector<Park_spot> parking_spots = populate_spots();
static vector<Customer> park_customers;
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) {
cin.clear();
interface(parking_spots);
cout<<"\nexit? Input 'y' or 'n'..";
char n;
cin >> n;
cin.clear();
if(n=='y'){
break;
}
}
}
@ -65,6 +56,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;");

Binary file not shown.

BIN
test.db3

Binary file not shown.