6 Commits

Author SHA1 Message Date
ad188addfd Parktimes populated 2019-07-21 22:29:38 -03:00
61c27028bf working 2019-07-21 22:10:27 -03:00
9fcd1214c7 db -address 2019-07-21 21:58:51 -03:00
1c840a04f5 Revert "Add some address line"
This reverts commit 97dc792773.
2019-07-21 21:54:19 -03:00
97dc792773 Add some address line 2019-07-21 21:43:48 -03:00
5b39b46ec8 Added labels and are u sure? msg 2019-07-21 20:28:49 -03:00
11 changed files with 340 additions and 430 deletions

View File

@ -13,14 +13,13 @@ Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string
} }
Customer::Customer(int id_, string name_, string password_, Vehicle_type vehicle_, Customer::Customer(int id_, string name_, string password_, Vehicle_type vehicle_,
vector<Park_time> instances, string telephone_, int role_) vector<Park_time> instances, string telephone_)
: id{id_}, : id{id_},
name{name_}, name{name_},
password{password_}, password{password_},
vehicle{vehicle_}, vehicle{vehicle_},
park_instances{instances}, park_instances{instances},
telephone{telephone_}, telephone{telephone_} {}
role{role_} {}
// clock in/out methods // clock in/out methods
// ==================================================================================== // ====================================================================================

View File

@ -1,18 +1,19 @@
#include "headers/Interface.h" #include "headers/Interface.h"
// I added it to pass spots, because the parking options need it to check where // 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 // is free parking_spots is declared in main, and if i declare it
// liberal use of // liberal use of
// cin.ignore(10000, '\n'); // cin.ignore(10000, '\n');
// so it skips to the next newline, in essence clearing the cin buffer // so it skips to the next newline, in essence clearing the cin buffer
void interface(vector<Park_spot>& spots) { bool verify(void);
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);
*/ */
__label__ exit; __label__ exit;
system("CLS");
cout << "\nWelcome to the parking system. Please login..."; cout << "\nWelcome to the parking system. Please login...";
int id; int id;
string password; string password;
@ -26,8 +27,7 @@
while (!(verify_password(c.password, password))) { while (!(verify_password(c.password, password))) {
cout << "ERROR: wrong password. Please retype your password or type [x] to exit:\n"; cout << "ERROR: wrong password. Please retype your password or type [x] to exit:\n";
std::getline(cin, password); std::getline(cin, password);
if (password == "x") if(password=="x")goto exit;
goto exit;
} }
if (query_role_customer(id) == 1) { if (query_role_customer(id) == 1) {
interface_admin(spots); interface_admin(spots);
@ -37,16 +37,14 @@
cout << "ERROR ROLE_INVALID!"; cout << "ERROR ROLE_INVALID!";
} }
exit:; exit:;
} }
void interface_member(vector<Park_spot>& spots, Customer& c) { void interface_member(vector<Park_spot>& spots, Customer& c) {
__label__ begin, exit; __label__ begin, exit;
cout << "\nLogged in succesfully!\n"; cout << "\nLogged in succesfully!\n";
begin: begin:
system("CLS"); cout <<"Hello! "<<c.name<< ", please select an option:\n[1]Parking\n[2]Monthly report\n"
cout << "Hello! " << c.name
<< ", please select an option:\n[1]Parking\n[2]Monthly report\n"
"[3]Edit information\n[4]Exit\n"; "[3]Edit information\n[4]Exit\n";
int option; int option;
cin >> option; cin >> option;
@ -57,21 +55,17 @@
break; break;
} }
case 2: { case 2: {
report_customer(c.id); cout << "Has not been implemented yet\n";
string lol;
std::cout<<"Enter any character to continue...";
std::cin>>lol;
break; break;
} }
case 3: { case 3: {
edit_information(c); cout << "Has not been implemented yet\n";
break; break;
} }
case 4: { case 4: {
cout << "Exiting...\n"; cout << "Exiting...\n";
Sleep(2000);
goto exit; goto exit;
break; break;
} }
@ -81,12 +75,11 @@
} }
goto begin; goto begin;
exit:; exit:;
} }
void interface_admin(vector<Park_spot>& spots) { void interface_admin(vector<Park_spot>& spots) {
__label__ begin, exit; __label__ begin,exit;
begin: begin:
system("CLS");
cout << "\nWelcome to the admin interface\n"; cout << "\nWelcome to the admin interface\n";
cout << "\n[1] Reports & analytics"; cout << "\n[1] Reports & analytics";
cout << "\n[2] Parking spots"; cout << "\n[2] Parking spots";
@ -102,9 +95,7 @@
cout << "[2] See weekly 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 << "[3] See monthly report of a specific parking spot\n";
cout << "[4] See weekly 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 customer\n"; cout << "[5] Return\n";
cout << "[6] See weekly report of a specific customer\n";
cout << "[7] Return\n";
cout << "Enter option number: "; cout << "Enter option number: ";
int option_1; int option_1;
cin >> option_1; cin >> option_1;
@ -126,25 +117,12 @@
report_single_spot(true); report_single_spot(true);
break; break;
} }
case 5: { case 5:{
report_customer(0);
break;
}
case 6: {
report_customer(0, true);
break;
}
case 7: {
goto begin; goto begin;
break; break;
} }
default:
break; break;
} }
string lol;
std::cout<<"Enter any character to continue...";
std::cin>>lol;
break;
} }
case 2: { case 2: {
cout << "[1] See current status of parking spots\n"; cout << "[1] See current status of parking spots\n";
@ -157,27 +135,22 @@
switch (option_2) { switch (option_2) {
case 1: { case 1: {
current_status_parkspots(spots); current_status_parkspots(spots);
string lol;
std::cout<<"Enter any character to continue...";
std::cin>>lol;
break; break;
} }
case 2: { case 2: {
new_parkspot(spots); new_parkspot(spots);
break; break;
} }
case 3: { case 3:{
goto begin; goto begin;
break; break;
} }
default: default:
break; break;
} }
break; break;
} }
case 3: { case 3: {
system("CLS");
cout << "[1] Make new customer\n"; cout << "[1] Make new customer\n";
cout << "[2] Make new admin\n"; cout << "[2] Make new admin\n";
cout << "[3] Return\n"; cout << "[3] Return\n";
@ -194,19 +167,15 @@
new_admin(); new_admin();
break; break;
} }
case 3: { case 3:{
goto begin; goto begin;
break; break;
} }
default: default:
break; break;
} }
case 4: { case 4: {goto exit;break;}
std::cout<<"Exiting...";
Sleep(2000);
goto exit;
break; break;
} break;
} }
default: default:
@ -214,18 +183,17 @@
} }
goto begin; goto begin;
exit:; exit:;
}
} // --------- individual things.
// --------- individual things. void park(Customer& c, vector<Park_spot>& spots) {
void park(Customer& c, vector<Park_spot>& spots) {
__label__ exit; __label__ exit;
cout << "You have selected parking option.\n"; cout << "You have selected parking option.\n";
if (!(c.parked())) { if (!(c.parked())) {
cout << "The following spots fit your vehicle and are available: \n"; cout << "The following spots fit your vehicle and are available: \n";
for (Park_spot i : spots) { for (Park_spot i : spots) {
if ((i.v_type == c.vehicle) & (i.taken == false)) { if ((i.v_type == c.vehicle)&(i.taken==false)) {
cout << i.id << ", "; cout << i.id << ", ";
} }
} }
@ -233,12 +201,12 @@
cout << "\nWhere do you want to park? Or type [0] to exit."; cout << "\nWhere do you want to park? Or type [0] to exit.";
int parkID; int parkID;
cin >> parkID; cin >> parkID;
if (!parkID) if (!parkID)goto exit;
goto exit;
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) {
if (confirm()) { if (verify())
{
i.clock(c); i.clock(c);
cout << "You have parked sucessfully!"; cout << "You have parked sucessfully!";
} }
@ -255,13 +223,13 @@
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
} }
} }
exit:; exit:;
} }
void new_customer() { void new_customer() {
int vtype; int vtype;
string name; string name;
string password; string password;
@ -277,12 +245,11 @@
cout << "\nWhat'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 << "\nNew customer sucessfully created with ID:" << newcustomer.id << "\n"; cout << "\nNew customer sucessfully created\n";
if (confirm()) if (verify())newcustomer.update_db();
newcustomer.update_db(); }
}
void new_admin() { 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 name;
string password; string password;
@ -294,54 +261,24 @@
std::getline(cin, telephone); std::getline(cin, telephone);
cout << "\nWhat's the password?"; cout << "\nWhat's the password?";
std::getline(cin, password); std::getline(cin, password);
Customer newadmin{name, password, Vehicle_type(vtype), telephone, role}; Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created with ID=" << newadmin.id << "\n"; cout << "\nNew customer sucessfully created\n";
if (confirm()) if(verify())newcustomer.update_db();
newadmin.update_db(); }
}
void new_parkspot(vector<Park_spot>& spots) { void new_parkspot(vector<Park_spot>& spots) {
cout << "What type of parking spot? \n[1] Two-wheeler\n[2] Four-wheeler\n"; cout << "What type of parking spot? \n[1] Twowheeler\n[2] Fourwheeler\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)};
if (confirm()) { if(verify()){spots.push_back(newspot);
spots.push_back(newspot); cout << "New parking spot sucessfully created.\n";}
cout << "New parking spot sucessfully created.\n"; }
}
}
void edit_information(Customer& c) // time stuff-----------------------------------------------------
{
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," pair<int, int> create_month_period() {
"[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::time_t t = std::time(0);
std::tm* date = std::localtime(&t); std::tm* date = std::localtime(&t);
int month, year = 0; int month, year = 0;
@ -355,9 +292,9 @@
date->tm_mon = month; date->tm_mon = month;
period.second = mktime(date); period.second = mktime(date);
return period; return period;
} }
pair<int, int> create_week_period() { pair<int, int> create_week_period() {
std::time_t t = std::time(0); std::time_t t = std::time(0);
std::tm* date = std::localtime(&t); std::tm* date = std::localtime(&t);
int day, month, year = 0; int day, month, year = 0;
@ -372,31 +309,11 @@
period.first = mktime(date); 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; return period;
} }
bool confirm(void) { // ------------------------------ report stuff
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) {
void report_all_spots(bool weekly) {
pair<int, int> period; pair<int, int> period;
if (weekly) { if (weekly) {
period = create_week_period(); // remove the pair<int, int> period = create_week_period(); // remove the pair<int, int>
@ -407,9 +324,9 @@
cout << "working timeperiods: " << period.first << ", " << period.second; // DEBUG cout << "working timeperiods: " << period.first << ", " << period.second; // DEBUG
reports_from_allparkspots(period); // TODO: namechange of reports_from_allparkspots in query? reports_from_allparkspots(period); // TODO: namechange of reports_from_allparkspots in query?
} }
void report_single_spot(bool weekly) { void report_single_spot(bool weekly) {
cout << "Which parking spot would you like a report on?\n"; cout << "Which parking spot would you like a report on?\n";
cout << "Parking spot ID: "; cout << "Parking spot ID: ";
int spotID; int spotID;
@ -422,9 +339,9 @@
period = create_month_period(); period = create_month_period();
} }
reports_from_parkspot(spotID, period); reports_from_parkspot(spotID, period);
} }
void report_customer(int customerID, bool weekly) { void report_customer(int customerID, bool weekly) {
// use report_customer(0) to make interactive // use report_customer(0) to make interactive
// so admin can call the interactive version, but customer can only call // so admin can call the interactive version, but customer can only call
// report_customer(own_cid) // report_customer(own_cid)
@ -434,9 +351,21 @@
} }
pair<int, int> period; pair<int, int> period;
if (weekly) { if (weekly) {
period = create_week_period(); pair<int, int> period = create_week_period();
} else { } else {
period = create_month_period(); pair<int, int> period = create_month_period();
} }
reports_from_customer(customerID, period); reports_from_customer(customerID, period);
} }
bool verify(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") return true;
else return false;
}

View File

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

View File

@ -41,10 +41,9 @@ vector<Customer> query_customer_with_name(string name) {
string password = query.getColumn(2); string password = query.getColumn(2);
int vehicle = query.getColumn(3); // cast to vehicle int vehicle = query.getColumn(3); // cast to vehicle
string telephone = query.getColumn(4); string telephone = query.getColumn(4);
int role = query.getColumn(5);
vector<Park_time> park_instances = query_parktimes_for_customer(id); vector<Park_time> park_instances = query_parktimes_for_customer(id);
result.push_back( result.push_back(
Customer{id, name_, password, Vehicle_type(vehicle), park_instances, telephone, role}); Customer{id, name_, password, Vehicle_type(vehicle), park_instances, telephone});
} }
return result; return result;
} }
@ -64,10 +63,8 @@ Customer query_customer_with_id(int id) {
string password = query.getColumn(2); string password = query.getColumn(2);
int vehicle = query.getColumn(3); // cast to vehicle int vehicle = query.getColumn(3); // cast to vehicle
string telephone = query.getColumn(4); string telephone = query.getColumn(4);
int role = query.getColumn(5);
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, role}; Customer result{id, name, password, Vehicle_type(vehicle), park_instances, telephone};
return result; return result;
} }
} }
@ -138,20 +135,18 @@ void reports_from_allparkspots(pair<int, int> period) {
} }
void current_status_parkspots(vector<Park_spot>& spots) { void current_status_parkspots(vector<Park_spot>& spots) {
cout << "P.spot \t\tStatus\t\t Customer\n";
for (auto& i : spots) { for (auto& i : spots) {
cout << "\n" << i.id << "\t\t" << ((i.taken) ? "true" : "false"); cout << "---------------------------\n";
cout << "PS #" << i.id << "\n";
cout << "Taken: " << ((i.taken) ? "true" : "false") << "\n";
if (i.taken) { if (i.taken) {
cout << "\t\t" << i.parked_customer; cout << "Customer#" << i.parked_customer << " parked there\n";
} }
} }
cout << "\n";
} }
vector<Park_time> reports_from_customer(int cid, pair<int, int> period) { vector<Park_time> reports_from_customer(int cid, pair<int, int> period) {
vector<Park_time> park_times; vector<Park_time> park_times;
int verhicle = int(query_customer_with_id(cid).vehicle);
float sum = 0;
SQLite::Statement query( SQLite::Statement query(
data::db, "SELECT * FROM Park_time WHERE customer_id = ? AND start > ? AND end < ?;"); data::db, "SELECT * FROM Park_time WHERE customer_id = ? AND start > ? AND end < ?;");
query.bind(1, cid); query.bind(1, cid);
@ -164,14 +159,11 @@ vector<Park_time> reports_from_customer(int cid, pair<int, int> period) {
int duration = query.getColumn(5); int duration = query.getColumn(5);
Park_time result{id, cid, spotid, start, duration}; Park_time result{id, cid, spotid, start, duration};
park_times.push_back(result); park_times.push_back(result);
sum += duration/3600;
} }
query.reset(); query.reset();
for (auto i : park_times) { for (auto i : park_times) {
cout << std::setprecision(2) << i; cout << i;
sum += i.duration / 3600.0;
} }
cout << "Your fees for this month: $" << std::setprecision(4) << sum * verhicle << "\n";
return park_times; return park_times;
} }

BIN
_test.db3

Binary file not shown.

View File

@ -20,7 +20,7 @@ SQLite::Database start_db() {
} }
db.exec( db.exec(
"create table if not exists Customer (id integer primary key, name " "create table if not exists Customer (id integer primary key, name "
"text, password text, vehicle int, telephone text, role int)"); "text, password text, vehicle int, telephone text)");
db.exec( db.exec(
"create table if not exists Park_spot (id integer primary key, taken " "create table if not exists Park_spot (id integer primary key, taken "
"int, customer_id int, vehicle_type int)"); "int, customer_id int, vehicle_type int)");

View File

@ -41,9 +41,9 @@ class Customer {
Vehicle_type vehicle; Vehicle_type vehicle;
string telephone; string telephone;
int role; int role;
Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role_); Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role);
Customer(int id_, string name_, string password_, Vehicle_type vehicle_, Customer(int id_, string name_, string password_, Vehicle_type vehicle_,
vector<Park_time> instances, string telephone_, int role_); vector<Park_time> instances, string telephone_);
void clock_in(int s_id); void clock_in(int s_id);
void clock_out(int s_id); void clock_out(int s_id);
bool parked(); bool parked();

View File

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

View File

@ -3,7 +3,6 @@
#pragma once #pragma once
#include "Park_spot.h" #include "Park_spot.h"
#include <iomanip>
using std::pair; 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.

View File

@ -1,6 +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
@ -46,10 +46,10 @@ static vector<Customer> park_customers;
int main() { int main() {
while (true) { while (true) {interface(parking_spots); }
interface(parking_spots);
} }
}
/* /*
Why is this not in query.cpp? Because somehow, it errors out when it's there. Why is this not in query.cpp? Because somehow, it errors out when it's there.

BIN
test.db3

Binary file not shown.