25 Commits

Author SHA1 Message Date
ec089c66e7 id fix 2019-07-22 10:28:44 -03:00
ef607e7ffc cosmetic merge 2019-07-22 10:19:52 -03:00
aa52f96beb fixed customer role 2019-07-22 10:16:07 -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
6706f6a58e timme functs, not incorporated yet 2019-07-20 10:33:19 -03:00
dafa1ab97a Menu with sub menu, revised the UI of the interface.cpp 2019-07-18 18:42:37 -03:00
cd2f723a04 implementation of admin added, animation commented out for faster testing and while loop added with exit in main() 2019-07-17 22:30:47 -03:00
0c06192f81 while loop in admin and exit 2019-07-17 10:26:22 -03:00
3eb00a0da9 Merge branch 'animation'
Adding animation, 2n try
2019-07-12 11:43:00 -03:00
574092db34 Animation added 2019-07-08 20:46:19 -03:00
17 changed files with 626 additions and 308 deletions

View File

@ -1,51 +1,54 @@
cmake_minimum_required(VERSION 3.10)
project(park)
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11) project(park)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp)
set(CMAKE_CXX_STANDARD 11)
include_directories( add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp)
${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp/include
) include_directories(
${CMAKE_CURRENT_LIST_DIR}/thirdparty/SQLiteCpp/include
)
add_executable(park
main.cpp
add_executable(park
data.cpp main.cpp
headers/data.h
encrypt.cpp data.cpp
headers/encrypt.h headers/data.h
encrypt.cpp
Customer.cpp headers/encrypt.h
headers/Customer.h
Park_spot.cpp Customer.cpp
headers/Park_spot.h headers/Customer.h
Park_time.cpp Park_spot.cpp
headers/Park_time.h headers/Park_spot.h
Query.cpp Park_time.cpp
headers/Query.h headers/Park_time.h
Interface.cpp Query.cpp
headers/Interface.h headers/Query.h
) Interface.cpp
headers/Interface.h
)
if (UNIX)
target_link_libraries(park
SQLiteCpp if (UNIX)
sqlite3 target_link_libraries(park
pthread SQLiteCpp
dl sqlite3
sodium pthread
) dl
elseif (MSYS OR MINGW) sodium
target_link_libraries(park )
SQLiteCpp elseif (MSYS OR MINGW)
sqlite3 target_link_libraries(park
pthread SQLiteCpp
ssp sqlite3
libsodium pthread
) ssp
endif() libsodium
)
endif()

View File

@ -2,23 +2,25 @@
// constructors // constructors
Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_) Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role_)
: id{auto_increment_db() + 1}, : id{auto_increment_db() + 1},
name{name_}, name{name_},
password{hash_password(password_)}, password{hash_password(password_)},
vehicle{vehicle_}, vehicle{vehicle_},
telephone{telephone_} { telephone{telephone_},
role{role_} {
save_db(); save_db();
} }
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_) vector<Park_time> instances, string telephone_, int role_)
: 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
// ==================================================================================== // ====================================================================================
@ -54,8 +56,9 @@ int Customer::parked_at() { return park_instances[park_instances.size() - 1].spo
// functions that interact with the database // functions that interact with the database
void Customer::save_db() { void Customer::save_db() {
string statement{"insert into Customer values (, '', '', ,'');"}; string statement{"insert into Customer values (, '', '', ,'', );"};
// after ( = 28) // after ( = 28)
statement.insert(43, to_string(role));
statement.insert(41, telephone); statement.insert(41, telephone);
statement.insert(38, to_string(int(vehicle))); statement.insert(38, to_string(int(vehicle)));
statement.insert(36, password); statement.insert(36, password);
@ -70,8 +73,9 @@ void Customer::save_db() {
void Customer::update_db() { void Customer::update_db() {
string statement = string statement =
"UPDATE Customer SET name = '', password = '', " "UPDATE Customer SET name = '', password = '', "
"vehicle = '', telephone = '' where id = '';"; "vehicle = '', telephone = '', role = '' where id = '';";
statement.insert(87, to_string(id)); statement.insert(98, to_string(id));
statement.insert(84, to_string(role));
statement.insert(73, telephone); statement.insert(73, telephone);
statement.insert(57, to_string(int(vehicle))); statement.insert(57, to_string(int(vehicle)));
statement.insert(43, password); statement.insert(43, password);

View File

@ -1,185 +1,442 @@
#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) { void interface(vector<Park_spot>& spots) {
int selector; /*
cout << "\nHello and welcome to the parking spot! Please select a suitable " string introduction = "P A R K M A N N E"; //logo animation, disable during testing
"option:"; text_animation(introduction, 50);
cout << "\n[1]Log in as member"; */
cout << "\n[2]Log in as administrator"; __label__ exit;
cin >> selector; system("CLS");
cin.ignore(10000, '\n'); cout << "\nWelcome to the parking system. Please login...";
switch (selector) { int id;
case 1: { string password;
interface_member(spots); cout << "\nEnter your id: ";
break; cin >> id;
} cin.ignore(10000, '\n');
case 2: { Customer c = query_customer_with_id(id);
interface_admin(spots); cout << "\nEnter your password: ";
break;
}
}
}
void interface_member(vector<Park_spot>& spots) {
int id;
string password;
cout << "\nPlease input id:";
cin >> id;
cin.ignore(10000, '\n');
Customer c = query_customer_with_id(id);
cout << "\nPlease input password:";
std::getline(cin, password);
while (!(verify_password(c.password, password))) {
cout << "ERROR: wrong password. Please retype your password:\n";
std::getline(cin, password); std::getline(cin, password);
}
cout << "Logged in succesfully\n"; while (!(verify_password(c.password, password))) {
cout << "select an option\n [1] Parking options\n[2]monthy report\n"; cout << "ERROR: wrong password. Please retype your password or type [x] to exit:\n";
int option; std::getline(cin, password);
cin >> option; if (password == "x")
cin.ignore(10000, '\n'); goto exit;
switch (option) {
case 1: {
park(c, spots);
break;
}
case 2: {
cout << "Has not been implemented yet\n";
break;
}
default:
break;
}
}
void interface_admin(vector<Park_spot>& spots) {
cout << "Welcome to the admin interface. It is not completely ready yet.\n";
cout << "[1] See monthly 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 << "[4] See weekly report of a specific parking spot\n";
cout << "[5] See current status of parking spots\n";
cout << "[6] Make new customer\n";
cout << "[7] Make new parking spot\n";
cout << "option[1-7]:";
int option;
cin >> option;
cin.ignore(10000, '\n');
switch (option) {
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?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?ID:";
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_parkspot(spots);
break;
}
default:
break;
}
}
// --------- individual things.
void park(Customer& c, vector<Park_spot>& spots) {
cout << "You have selected parking option";
if (!(c.parked())) {
cout << "The following spots[which can fit your vehicle] are "
"available: ";
for (Park_spot i : spots) {
if (i.v_type == c.vehicle) {
cout << i.id << ", ";
}
} }
if (query_role_customer(id) == 1) {
cout << "where do you want to park?"; interface_admin(spots);
int parkid; } else if (query_role_customer(id) == 0) {
cin >> parkid; interface_member(spots, c);
cin.ignore(10000, '\n');
for (Park_spot& i : spots) {
if (i.id == parkid) {
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 enter [1] for yes and [0] for no";
int answer = 0;
cin >> answer;
cin.ignore(10000, '\n');
if (answer) {
query_parkspot_with_id(c.parked_at(), spots).clock(c);
cout << "You have sucessfully clocked out.";
} else { } else {
cout << "OK, have a nice day"; cout << "ERROR ROLE_INVALID!";
}
exit:;
}
void interface_member(vector<Park_spot>& spots, Customer& c) {
__label__ begin, exit;
cout << "\nLogged in succesfully!\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');
switch (option) {
case 1: {
park(c, spots);
break;
}
case 2: {
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) {
__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;
cin.ignore(10000, '\n');
switch (option) {
case 1: {
cout << "[1] See monthly 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 << "[4] See weekly report of a specific parking spot\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: {
report_all_spots();
break;
}
case 2: {
report_all_spots(true);
break;
}
case 3: {
report_single_spot();
break;
}
case 4: {
report_single_spot(true);
break;
}
case 5: {
report_customer(0);
break;
}
case 6: {
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;
cin.ignore(10000, '\n');
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;
cin.ignore(10000, '\n');
switch (option_3) {
case 1: {
new_customer();
break;
}
case 2: {
new_admin();
break;
}
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: \n";
for (Park_spot i : spots) {
if ((i.v_type == c.vehicle) & (i.taken == false)) {
cout << i.id << ", ";
}
}
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";
int answer = 0;
cin >> answer;
cin.ignore(10000, '\n');
if (answer) {
query_parkspot_with_id(c.parked_at(), spots).clock(c);
cout << "You have sucessfully clocked out.";
} else {
cout << "OK, have a nice day.";
}
}
exit:;
}
void new_customer() {
int vtype;
string name;
string password;
string telephone;
int role = 0;
cout << "\nWhat's the name of the customer? ";
std::getline(cin, name);
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? +";
std::getline(cin, telephone);
cout << "\nWhat's the password? ";
std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created with ID:" << newcustomer.id << "\n";
if (confirm())
newcustomer.update_db();
}
void new_admin() {
int vtype = 2; // revision required! Needs to be set to NULL
string name;
string password;
string telephone;
int role = 1;
cout << "\nWhat's the name of the admin? ";
std::getline(cin, name);
cout << "\nWhat's the telephone number? +";
std::getline(cin, telephone);
cout << "\nWhat's the password?";
std::getline(cin, password);
Customer newadmin{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created with ID=" << newadmin.id << "\n";
if (confirm())
newadmin.update_db();
}
void new_parkspot(vector<Park_spot>& spots) {
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 new_customer() { void edit_information(Customer& c)
int vtype; {
string name; string string0; int int0;
string password; /*std::cout<<"\nInput to update name or press [0] to keep name:\n";
string telephone; std::getline(cin,string0);
cout << "What's the name of the customer? "; if (string0=="0");
std::getline(cin, name); else c.name=string0;*/
cout << "What's the vehicle type? [1]twoweeler, [2] fourweeler: ";
cin >> vtype;
cin.ignore(10000, '\n');
cout << "What's the telephone number? ";
std::getline(cin, telephone);
cout << "What's the password?";
std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone};
cout << "New customer sucessfully created\n";
newcustomer.update_db();
}
void new_parkspot(vector<Park_spot>& spots) { std::cout<<"\n Input to update vehicle to [1]Two-Wheeler,"
cout << "What type of parking spot? [1] twoweeler, [2] fourweeler: "; "[2]Four-Wheeler or press [0] to keep vehicle type:\n";
int vtype; std::cin>>int0;
cin >> vtype; if (!int0);
cin.ignore(10000, '\n'); else c.vehicle=Vehicle_type(int0);
Park_spot newspot{Vehicle_type(vtype)}; cin.ignore();
spots.push_back(newspot); std::cout<<"\n Input to update password or press [0] to keep current password:\n";
cout << "new parking spot sucessfully created.\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 << "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_);
os << "duration : " << pt.duration << "\n"; float dur_h = pt.duration / 3600.0;
os << "duration : " << dur_h << " h\n";
os << "- - - - - - - - - - - - - - - - - - - -\n"; os << "- - - - - - - - - - - - - - - - - - - -\n";
return os; return os;
} }
@ -121,4 +122,13 @@ purposes mostly. TODO: Needs to be removed at completion of project, or seperate
cpp/header cpp/header
*/ */
std::this_thread::sleep_for(seconds{sec}); std::this_thread::sleep_for(seconds{sec});
} }
// 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));
}
}

107
Query.cpp
View File

@ -41,9 +41,10 @@ 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}); Customer{id, name_, password, Vehicle_type(vehicle), park_instances, telephone, role});
} }
return result; return result;
} }
@ -63,17 +64,27 @@ 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}; Customer result{id, name, password, Vehicle_type(vehicle), park_instances, telephone, role};
// DEBUG
// cout << "{" << result.id << "," <<result.password <<"," <<
// int(vehicle) << "}\n";
return result; return result;
} }
} }
int query_role_customer(int id) {
SQLite::Statement query(data::db, "SELECT * FROM Customer WHERE id = ?;");
query.bind(1, id);
while (query.executeStep()) {
int role = query.getColumn(5);
return role;
}
}
//------------------------------- 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) {
@ -82,22 +93,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);
@ -113,20 +115,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);
@ -144,29 +138,40 @@ void reports_from_allparkspots(bool weekly) {
} }
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"; cout << "\n" << i.id << "\t\t" << ((i.taken) ? "true" : "false");
cout << "PS #" << i.id << "\n";
cout << "Taken: " << ((i.taken) ? "true" : "false") << "\n";
if (i.taken) { if (i.taken) {
cout << "Customer#" << i.parked_customer << " parked there\n"; cout << "\t\t" << i.parked_customer;
} }
} }
cout << "\n";
} }
// -------------- paroking spots 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();
// vector<Park_spot> populate_spots(){ for (auto i : park_times) {
// vector<Park_spot> spots; cout << std::setprecision(2) << i;
// SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id > sum += i.duration / 3600.0;
// 0;"); }
// // query.bind(1, 2); cout << "Your fees for this month: $" << std::setprecision(4) << sum * verhicle << "\n";
// while (query.executeStep()) { return park_times;
// 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;
// }

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 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(
"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)"); "text, password text, vehicle int, telephone text, role int)");
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

@ -40,9 +40,10 @@ class Customer {
string password; string password;
Vehicle_type vehicle; Vehicle_type vehicle;
string telephone; string telephone;
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_); vector<Park_time> instances, string telephone_, int role_);
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,13 +1,27 @@
#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); void interface_member(vector<Park_spot>& spots, Customer& c);
void interface_admin(vector<Park_spot>& spots); 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_parkspot(vector<Park_spot>& spots); 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

@ -12,8 +12,11 @@
using namespace std::chrono; using namespace std::chrono;
using std::cout; using std::cout;
using std::flush;
using std::string; using std::string;
using std::to_string; using std::to_string;
using std::chrono::milliseconds;
using std::this_thread::sleep_for;
/* /*
@ -64,7 +67,10 @@ class Park_time {
int start_to_int(); // helper int start_to_int(); // helper
}; };
// test funciton // test function
void Wait(int sec); void Wait(int sec);
#endif // Park_time // function that slowly outputs each character one by one
void text_animation(const string& text, unsigned int pause_time);
#endif // Park_time

View File

@ -3,6 +3,8 @@
#pragma once #pragma once
#include "Park_spot.h" #include "Park_spot.h"
#include <iomanip>
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,16 +54,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);
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots);
int query_role_customer(int id);
vector<Park_spot> populate_spots(); vector<Park_spot> populate_spots();
Park_spot query_parkspot_with_id(int id, vector<Park_spot>& parkspots); void reports_from_parkspot(int spotid, pair<int, int> period);
void reports_from_allparkspots(pair<int, int> period);
void reports_from_parkspot(int spotid, bool weekly = false);
void reports_from_allparkspots(bool weekly = false);
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,3 +1,4 @@
#include "headers/Interface.h" #include "headers/Interface.h"
/* /*
@ -44,11 +45,10 @@ static vector<Park_spot> parking_spots = populate_spots();
static vector<Customer> park_customers; static vector<Customer> park_customers;
int main() { 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"
interface(parking_spots); while (true) {
interface(parking_spots);
}
} }
/* /*
@ -56,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 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;");
@ -67,4 +68,4 @@ vector<Park_spot> populate_spots() {
spots.push_back({id, taken, cid, vtype}); spots.push_back({id, taken, cid, vtype});
} }
return spots; return spots;
} }

5
newParkManne.cpp Normal file
View File

@ -0,0 +1,5 @@
#include <iostream>
void say_hello(){
std::cout << "Hello, from newParkManne!\n";
}

Binary file not shown.

BIN
park Executable file

Binary file not shown.

View File

@ -12,6 +12,14 @@ Or click the build icon in vscode *shrugs*
# Parkmanne # Parkmanne
## A stroll in the park ## A stroll in the park
######TO-DO List:
- [x] Admin login
- [ ] Billing report menu
- [ ] Report from a specific month i.e. january
- [ ] Edit option in menu
- [ ] Option to confirm edit after input
- [ ] Divide menu in sub menus
- [ ] Analytics of customer (e.g. # customers with 2-wheeler or list of customer and telephone numbers etc.)
This is a graph of how everything is connected. This is a graph of how everything is connected.
If you need to add functionality that doesn't fall in any of these, and you're unsure of what to include, you can decide something like this: If you need to add functionality that doesn't fall in any of these, and you're unsure of what to include, you can decide something like this:

BIN
test.db3

Binary file not shown.