1 Commits

Author SHA1 Message Date
5e33eaeede Label for admin exit, main interface looped 2019-07-16 18:26:49 -03:00
14 changed files with 178 additions and 312 deletions

View File

@ -1,5 +1,3 @@
cmake_minimum_required(VERSION 3.10)
project(park)
@ -51,4 +49,3 @@ elseif (MSYS OR MINGW)
libsodium
)
endif()

View File

@ -2,13 +2,12 @@
// constructors
Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role_)
Customer::Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_)
: id{auto_increment_db() + 1},
name{name_},
password{hash_password(password_)},
vehicle{vehicle_},
telephone{telephone_},
role{role_} {
telephone{telephone_} {
save_db();
}
@ -55,9 +54,8 @@ int Customer::parked_at() { return park_instances[park_instances.size() - 1].spo
// functions that interact with the database
void Customer::save_db() {
string statement{"insert into Customer values (, '', '', ,'', );"};
string statement{"insert into Customer values (, '', '', ,'');"};
// after ( = 28)
statement.insert(43, to_string(role));
statement.insert(41, telephone);
statement.insert(38, to_string(int(vehicle)));
statement.insert(36, password);
@ -72,9 +70,8 @@ void Customer::save_db() {
void Customer::update_db() {
string statement =
"UPDATE Customer SET name = '', password = '', "
"vehicle = '', telephone = '', role = '' where id = '';";
statement.insert(89, to_string(id));
statement.insert(84, to_string(role));
"vehicle = '', telephone = '' where id = '';";
statement.insert(87, to_string(id));
statement.insert(73, telephone);
statement.insert(57, to_string(int(vehicle)));
statement.insert(43, password);

View File

@ -7,36 +7,43 @@
// so it skips to the next newline, in essence clearing the cin buffer
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);
*/
int selector;
cout << "\nHello and welcome to the parking spot! Please select a suitable "
"option:";
cout << "\n[1]Log in as member";
cout << "\n[2]Log in as administrator";
cin >> selector;
cin.ignore(10000, '\n');
switch (selector) {
case 1: {
interface_member(spots);
break;
}
case 2: {
interface_admin(spots);
break;
}
}
}
cout << "\nWelcome to the parking system. Please login..";
void interface_member(vector<Park_spot>& spots) {
__label__ exit;
int id;
string password;
cout << "\nEnter your id: ";
cout << "\nPlease input id:";
cin >> id;
cin.ignore(10000, '\n');
Customer c = query_customer_with_id(id);
cout << "\nEnter your password: ";
cout << "\nPlease input 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 enter [exit] to exit :\n";
std::getline(cin, password);
}
if(query_role_customer(id)==1){
interface_admin(spots);
} else if(query_role_customer(id)==0){
interface_member(spots, c);
} else {
cout << "ERROR ROLE_INVALID!";
}
if (password=="exit") goto exit;
}
void interface_member(vector<Park_spot>& spots,Customer& c) {
cout << "\nLogged in succesfully!\n";
cout << "select an option:\n [1] Parking\n[2]Monthly report\n";
cout << "Logged in succesfully\n";
cout << "select an option\n [1] Parking options\n[2]monthy report\n";
int option;
cin >> option;
cin.ignore(10000, '\n');
@ -53,30 +60,26 @@ void interface_member(vector<Park_spot>& spots,Customer& c) {
default:
break;
}
exit: ;
}
void interface_admin(vector<Park_spot>& spots) {
cout << "\nWelcome to the admin interface.\n";
cout << "\n[1] Reports & analytics";
cout << "\n[2] Parking spots";
cout << "\n[3] Make new user";
cout << "\nEnter option number: ";
int option;
cin >> option;
cin.ignore(10000, '\n');
switch (option) {
case 1: {
__label__ exit, begin;
begin: ;
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 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;
cout << "[5] See current status of parking spots\n";
cout << "[6] Make new customer\n";
cout << "[7] Make new parking spot\n";
cout << "[8] Exit\n";
cout << "option[1-7]:";
int option;
cin >> option;
cin.ignore(10000, '\n');
switch (option_1) {
switch (option) {
case 1: {
reports_from_allparkspots();
break;
@ -86,117 +89,73 @@ void interface_admin(vector<Park_spot>& spots) {
break;
}
case 3: {
cout << "Which parking spot would you like a report on?\n";
cout << "Parking spot ID: ";
int spotID;
cin >> spotID;
cout << "Which parking spot would you like a report on?ID:";
int spotid;
cin >> spotid;
cin.ignore(10000, '\n');
reports_from_parkspot(spotID);
reports_from_parkspot(spotid);
break;
}
case 4: {
cout << "Which parking spot would you like a report on?\n";
cout << "Parking spot ID: ";
int spotID;
cin >> spotID;
cout << "Which parking spot would you like a report on?ID:";
int spotid;
cin >> spotid;
cin.ignore(10000, '\n');
reports_from_parkspot(spotID, true);
reports_from_parkspot(spotid, 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;
}
}
case 2: {
cout << "[1] See current status of parking spots\n";
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: {
case 5: {
current_status_parkspots(spots);
break;
}
case 2: {
new_parkspot(spots);
}
default:
break;
}
}
case 3: {
cout << "[1] Make new customer\n";
cout << "[2] Make new admin\n";
cout << "Enter option number: ";
int option_3;
cin >> option_3;
cin.ignore(10000, '\n');
switch (option_3) {
case 1: {
case 6: {
new_customer();
break;
}
case 2: {
new_admin();
case 7: {
new_parkspot(spots);
break;
}
case 8: {
goto exit;
break;
}
default:
break;
}
}
default:
break;
}
goto begin;
exit: ;
}
// --------- individual things.
void park(Customer& c, vector<Park_spot>& spots) {
cout << "You have selected parking option.\n";
cout << "You have selected parking option";
if (!(c.parked())) {
cout << "The following spots fit your vehicle and are available: ";
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 << ", ";
}
}
cout << "\nWhere do you want to park?";
int parkID;
cin >> parkID;
cout << "where do you want to park?";
int parkid;
cin >> parkid;
cin.ignore(10000, '\n');
for (Park_spot& i : spots) {
if (i.id == parkID) {
if (i.id == parkid) {
i.clock(c);
cout << "You have parked sucessfully!";
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 enter [1] for yes and [0] for no";
int answer = 0;
cin >> answer;
cin.ignore(10000, '\n');
@ -204,7 +163,7 @@ 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";
}
}
}
@ -214,40 +173,22 @@ void new_customer() {
string name;
string password;
string telephone;
int role = 0;
cout << "\nWhat's the name of the customer? ";
cout << "What's the name of the customer? ";
std::getline(cin, name);
cout << "\nWhat's the vehicle type? \n[1]twoweeler\n[2] fourweeler\n";
cout << "What's the vehicle type? [1]twoweeler, [2] fourweeler: ";
cin >> vtype;
cin.ignore(10000, '\n');
cout << "What's the telephone number? +";
cout << "What's the telephone number? ";
std::getline(cin, telephone);
cout << "\nWhat's the password? ";
cout << "What's the password?";
std::getline(cin, password);
Customer newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created\n";
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 newcustomer{name, password, Vehicle_type(vtype), telephone, role};
cout << "\nNew customer sucessfully created\n";
Customer newcustomer{name, password, Vehicle_type(vtype), telephone};
cout << "New customer sucessfully created\n";
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? [1] Twowheeler, [2] Fourwheeler: ";
int vtype;
cin >> vtype;
cin.ignore(10000, '\n');

View File

@ -122,13 +122,3 @@ cpp/header
*/
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));
}
}

View File

@ -72,47 +72,8 @@ Customer query_customer_with_id(int id) {
}
}
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
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) {
for (Park_spot& i : parkspots) {
if (i.id == id) {
@ -193,3 +154,19 @@ void current_status_parkspots(vector<Park_spot>& spots) {
}
}
// -------------- parking spots
// vector<Park_spot> populate_spots(){
// vector<Park_spot> spots;
// SQLite::Statement query(data::db, "SELECT * FROM Park_spot WHERE id >
// 0;");
// // 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

@ -40,8 +40,7 @@ class Customer {
string password;
Vehicle_type vehicle;
string telephone;
int role;
Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_, int role);
Customer(string name_, string password_, Vehicle_type vehicle_, string telephone_);
Customer(int id_, string name_, string password_, Vehicle_type vehicle_,
vector<Park_time> instances, string telephone_);
void clock_in(int s_id);

View File

@ -6,9 +6,8 @@
using std::cin;
void interface(vector<Park_spot>& spots);
void interface_member(vector<Park_spot>& spots, Customer& c);
void interface_member(vector<Park_spot>& spots);
void interface_admin(vector<Park_spot>& spots);
void park(Customer& c, vector<Park_spot>& spots);
void new_customer();
void new_admin();
void new_parkspot(vector<Park_spot>& spots);

View File

@ -12,11 +12,8 @@
using namespace std::chrono;
using std::cout;
using std::flush;
using std::string;
using std::to_string;
using std::this_thread::sleep_for;
using std::chrono::milliseconds;
/*
@ -67,10 +64,7 @@ class Park_time {
int start_to_int(); // helper
};
// test function
// test funciton
void Wait(int sec);
// 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,7 +3,6 @@
#pragma once
#include "Park_spot.h"
using std::pair;
/*these are the functions that search the database and create objects from it.
@ -60,13 +59,9 @@ 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);
void current_status_parkspots(vector<Park_spot>& spots);
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

@ -47,17 +47,7 @@ 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;
}
}
do { interface(parking_spots);} while (true);
}
/*

View File

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

BIN
park

Binary file not shown.

View File

@ -12,14 +12,6 @@ Or click the build icon in vscode *shrugs*
# Parkmanne
## 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.
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.