This commit is contained in:
Ayham Mamoun 2019-01-02 12:25:46 +03:00
commit 5e280f1e75
56 changed files with 4875 additions and 0 deletions

22
.vscode/c_cpp_properties.json vendored Normal file
View File

@ -0,0 +1,22 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/wx-3.0",
"/usr/lib/x86_64-linux-gnu/wx/include/gtk2-unicode-3.0",
"${workspaceFolder}/TimeSheet/",
"${workspaceFolder}/TimeSheet-API/",
"${workspaceFolder}/TimeSheet-API/api"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}

28
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,28 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "C/C++ Debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/Time_Manager",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/bin/",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "C/C++ Build"
}
]
}

44
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,44 @@
{
"code-runner.executorMap": {
"javascript": "nodejs",
"java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
"c": "cd $dir && gcc -g \"$fileName\" -o \"$fileNameWithoutExt\" && $dir\"$fileNameWithoutExt\"",
"cpp": "cd $dir && g++ -g \"$fileName\" -o \"$fileNameWithoutExt\" && $dir\"$fileNameWithoutExt\"",
"objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
"php": "php",
"python": "python3",
"perl": "perl",
"ruby": "ruby",
"go": "go run",
"lua": "lua",
"groovy": "groovy",
"powershell": "powershell -ExecutionPolicy ByPass -File",
"bat": "cmd /c",
"shellscript": "bash",
"fsharp": "fsi",
"csharp": "scriptcs",
"vbscript": "cscript //Nologo",
"typescript": "ts-node",
"coffeescript": "coffee",
"scala": "scala",
"swift": "swift",
"julia": "julia",
"crystal": "crystal",
"ocaml": "ocaml",
"r": "Rscript",
"applescript": "osascript",
"clojure": "lein exec",
"haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt",
"rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt",
"racket": "racket",
"ahk": "autohotkey",
"autoit": "autoit3",
"kotlin": "cd $dir && kotlinc $fileName -include-runtime -d $fileNameWithoutExt.jar && java -jar $fileNameWithoutExt.jar",
"dart": "dart",
"pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt",
"d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt",
"haskell": "runhaskell",
"nim": "nim compile --verbosity:0 --hints:off --run"
}
}

35
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,35 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "C/C++ Configure",
"type": "shell",
"command": "cmake .",
"problemMatcher": []
},
{
"label": "C/C++ Build",
"type": "shell",
"command": "make",
"problemMatcher": "$gcc",
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "C/C++ Clean",
"type": "shell",
"command": "make clean",
"problemMatcher": []
},
{
"label": "C/C++ ReBuild",
"type": "shell",
"command": "make clean && cmake . && make",
"problemMatcher": []
}
]
}

42
CMakeLists.txt Normal file
View File

@ -0,0 +1,42 @@
cmake_minimum_required(VERSION 3.5)
project(Time_Manager CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -fpermissive")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
find_package(wxWidgets COMPONENTS aui base core gl adv REQUIRED)
file(GLOB_RECURSE api_srcs "${CMAKE_SOURCE_DIR}/TimeSheet-API/*.cpp")
file(GLOB_RECURSE api_hdrs "${CMAKE_SOURCE_DIR}/TimeSHeet-API/*.h")
include_directories("${CMAKE_SOURCE_DIR}/TimeSheet-API/")
add_library(
"${PROJECT_NAME}-api"
${api_srcs}
${api_hdrs}
)
include("${wxWidgets_USE_FILE}")
target_link_libraries("${PROJECT_NAME}-api" ${wxWidgets_LIBRARIES})
file(GLOB_RECURSE gui_srcs "${CMAKE_SOURCE_DIR}/TimeSheet/*.cpp")
file(GLOB_RECURSE gui_hdrs "${CMAKE_SOURCE_DIR}/TimeSheet/*.h")
include_directories("${CMAKE_SOURCE_DIR}/TimeSheet/")
include_directories("${CMAKE_SOURCE_DIR}/TimeSheet-API/")
include("${wxWidgets_USE_FILE}")
add_executable(
"${PROJECT_NAME}"
${gui_srcs}
${gui_hdrs}
)
target_link_libraries("${PROJECT_NAME}" "${PROJECT_NAME}-api")
target_link_libraries("${PROJECT_NAME}" ${wxWidgets_LIBRARIES})

2
LICENSE.md Normal file
View File

@ -0,0 +1,2 @@
Copyright (C) 2018 Ayham Mamoun

1
README.md Normal file
View File

@ -0,0 +1 @@
Time Manager

View File

@ -0,0 +1,265 @@
#include "db_sys.h"
void DB_sys::Init(Log* _log) {
_db = new DataBase();
_db->_entries = new vector<Entry>();
_login = new LoginSys();
_Log = _log;
}
void DB_sys::DeInit() {
delete _db;
delete _login;
}
bool DB_sys::Load(std::string oldUser, std::string oldPass) {
//////// CHECK IF THERE
if (!IsThere()) return false;
//////// AUTHENTICATION
_login->Init(_Log, oldUser, oldPass);
if (_login->IsLogged() != true) {
_isLoaded = false;
return false;
}
//////// SETTINGS LOAD
vector<string> raw_settings;
file.Read(DATA_SETTINGS_PATH, &raw_settings);
if (!raw_settings.empty()) { // if not new
_db->_TotalDays = atoi(raw_settings[0].c_str());
_db->_SchoolDays = atoi(raw_settings[1].c_str());
_db->_NonSchoolDays = atoi(raw_settings[2].c_str());
_db->_TotalTime.set(raw_settings[3]);
_db->_TotalTimeWaisted.set(raw_settings[4]);
_db->_TotalTimenotWaisted.set(raw_settings[5]);
_db->_StudiedTime.set(raw_settings[6]);
_db->_CPTime.set(raw_settings[7]);
_db->_SideProjTime.set(raw_settings[8]);
_db->_GamesTime.set(raw_settings[9]);
_db->_ExerciseTime.set(raw_settings[10]);
}
////// ENTRIES LOAD
csv_loaders csv;
auto raw_entries = csv.Load(DATA_ENTRIES_PATH);
if (!raw_entries.empty()) { // if not new
_db->_entries = new vector<Entry>();
for (int i = 0; i < raw_entries.size(); i++) {
auto entry_data = raw_entries[i];
Entry entry;
entry._ID = atoi(entry_data[0].c_str());
entry._date.set(entry_data[1]);
entry._EnterTime.set(entry_data[2]);
entry._StudiedTime.set(entry_data[3]);
entry._CPTime.set(entry_data[4]);
entry._SideProjTime.set(entry_data[5]);
entry._ExerciseTime.set(entry_data[6]);
entry._GamesTime.set(entry_data[7]);
entry._isSchool = (entry_data[8] == "1") ? true : false;
entry._ExitTime.set(entry_data[9]);
entry._AvlbleTime.set(entry_data[10]);
entry._WaistedTime.set(entry_data[11]);
entry._NWaistedTime.set(entry_data[12]);
_db->_entries->push_back(entry);
}
(*_Log) << "[DB_SYS] Loaded " + to_string(_db->_entries->size()) +
" Entries successfully!";
}
_isLoaded = true;
return true;
}
bool DB_sys::CreateEmpty(std::string newUser, std::string newPass) {
createDir(DATA_PATH);
createFile(DATA_CRED_PATH);
createFile(DATA_SETTINGS_PATH);
createFile(DATA_ENTRIES_PATH);
_login->Init(_Log, newUser, newPass);
vector<string> _settings_data;
for (int i = 0; i < 11; i++) _settings_data.push_back("NULL");
file.Write(DATA_SETTINGS_PATH, _settings_data);
vector<string> _entries_data;
_entries_data.push_back("NULL");
file.Write(DATA_ENTRIES_PATH, _entries_data);
if (!IsThere()) {
(*_Log) << "[DB_SYS] Could Not Create Database!";
return false;
} else {
(*_Log) << "[DB_SYS] Created Database!";
return true;
}
}
void DB_sys::AddEntry(Entry entry) {
_db->_entries->push_back(entry);
ReCalc();
}
void DB_sys::ReCalc() {
if (IsEmpty() == true && IsDataEmpty() == true)
return; // db empty nothing to calc
//_db = new DataBase;
_db->_TotalDays = _db->_entries->size();
_db->_SchoolDays = 0;
_db->_NonSchoolDays = 0;
for (int i = 0; i < _db->_TotalDays; i++) {
if ((*_db->_entries)[i]._isSchool)
_db->_SchoolDays++;
else
_db->_NonSchoolDays++;
}
_db->_TotalTime.reset();
_db->_TotalTimeWaisted.reset();
_db->_TotalTimenotWaisted.reset();
for (int i = 0; i < _db->_TotalDays; i++) {
_db->_TotalTime.add((*_db->_entries)[i]._AvlbleTime._hr,
(*_db->_entries)[i]._AvlbleTime._min,
(*_db->_entries)[i]._AvlbleTime._sec, 0);
_db->_TotalTimeWaisted.add((*_db->_entries)[i]._WaistedTime._hr,
(*_db->_entries)[i]._WaistedTime._min,
(*_db->_entries)[i]._WaistedTime._sec, 0);
_db->_TotalTimenotWaisted.add((*_db->_entries)[i]._NWaistedTime._hr,
(*_db->_entries)[i]._NWaistedTime._min,
(*_db->_entries)[i]._NWaistedTime._sec,
0);
}
_db->_StudiedTime.reset();
_db->_CPTime.reset();
_db->_SideProjTime.reset();
_db->_GamesTime.reset();
_db->_ExerciseTime.reset();
for (int i = 0; i < _db->_TotalDays; i++) {
_db->_StudiedTime =
_db->_StudiedTime + (*_db->_entries)[i]._StudiedTime;
_db->_CPTime = _db->_CPTime + (*_db->_entries)[i]._CPTime;
_db->_SideProjTime =
_db->_SideProjTime + (*_db->_entries)[i]._SideProjTime;
_db->_GamesTime = _db->_GamesTime + (*_db->_entries)[i]._GamesTime;
_db->_ExerciseTime =
_db->_ExerciseTime + (*_db->_entries)[i]._ExerciseTime;
}
if (IsDataEmpty() == false) {
_db->_AvgWaistTime = _db->_TotalTimeWaisted / _db->_TotalDays;
_db->_AvgStudiedTime = _db->_StudiedTime / _db->_TotalDays;
_db->_AvgCPTime = _db->_CPTime / _db->_TotalDays;
_db->_AvgSideProjTime = _db->_SideProjTime / _db->_TotalDays;
_db->_AvgGamesTime = _db->_GamesTime / _db->_TotalDays;
_db->_AvgExerciseTime = _db->_ExerciseTime / _db->_TotalDays;
}
}
bool DB_sys::Save() {
/////// SETTINGS FILE
vector<string> _settings_data;
_settings_data.push_back(to_string(_db->_TotalDays));
_settings_data.push_back(to_string(_db->_SchoolDays));
_settings_data.push_back(to_string(_db->_NonSchoolDays));
_settings_data.push_back(_db->_TotalTime.get());
_settings_data.push_back(_db->_TotalTimeWaisted.get());
_settings_data.push_back(_db->_TotalTimenotWaisted.get());
_settings_data.push_back(_db->_StudiedTime.get());
_settings_data.push_back(_db->_CPTime.get());
_settings_data.push_back(_db->_SideProjTime.get());
_settings_data.push_back(_db->_GamesTime.get());
_settings_data.push_back(_db->_ExerciseTime.get());
file.Write(DATA_SETTINGS_PATH, _settings_data);
/////// ENTRIES FILE
vector<string> _entries_data;
auto entries = *_db->_entries;
for (int i = 0; i < _db->_entries->size(); i++) {
string entry_data = "";
entry_data.append(to_string(entries[i]._ID));
entry_data.append(",");
entry_data.append(entries[i]._date.get());
entry_data.append(",");
entry_data.append(entries[i]._EnterTime.get());
entry_data.append(",");
entry_data.append(entries[i]._StudiedTime.get());
entry_data.append(",");
entry_data.append(entries[i]._CPTime.get());
entry_data.append(",");
entry_data.append(entries[i]._SideProjTime.get());
entry_data.append(",");
entry_data.append(entries[i]._ExerciseTime.get());
entry_data.append(",");
entry_data.append(entries[i]._GamesTime.get());
entry_data.append(",");
entry_data.append((entries[i]._isSchool) ? "1" : "0");
entry_data.append(",");
entry_data.append(entries[i]._ExitTime.get());
entry_data.append(",");
entry_data.append(entries[i]._AvlbleTime.get());
entry_data.append(",");
entry_data.append(entries[i]._WaistedTime.get());
entry_data.append(",");
entry_data.append(entries[i]._NWaistedTime.get());
_entries_data.push_back(entry_data);
}
file.Write(DATA_ENTRIES_PATH, _entries_data);
return IsThere();
}
bool DB_sys::IsThere() {
if (!dirExists(DATA_PATH)) {
(*_Log) << "[DB_SYS] Could not find Database!";
return false;
}
if (!fileExists(DATA_CRED_PATH)) {
(*_Log) << "[DB_SYS] Could not find Database!";
return false;
}
if (!fileExists(DATA_SETTINGS_PATH)) {
(*_Log) << "[DB_SYS] Could not find Database!";
return false;
}
if (!fileExists(DATA_ENTRIES_PATH)) {
(*_Log) << "[DB_SYS] Could not find Database!";
return false;
}
(*_Log) << "[DB_SYS] Found Database!";
return true;
}
bool DB_sys::IsEmpty() {
File_Manager file;
vector<string> entries_data;
file.Read(DATA_ENTRIES_PATH, &entries_data);
if (entries_data[0] == "NULL")
return true;
else
return false;
}
bool DB_sys::IsDataEmpty() {
if (_db->_entries->size() == 0) return true;
return false;
}

View File

@ -0,0 +1,68 @@
#pragma once
#include "../../defines.h"
#include "../login_system/login_sys.h"
class DB_sys {
public:
void Init(Log *_log);
void DeInit();
bool Load(std::string oldUser, std::string oldPass);
bool CreateEmpty(std::string newUser,
std::string newPass); // deletes if already exists
void AddEntry(Entry entry);
void ReCalc();
bool Save();
DataBase *GetDataBase() { return _db; }
bool Loaded() { return _isLoaded; }
bool IsThere();
bool IsEmpty(); // checks file
bool IsDataEmpty(); // checks loaded data
private:
DataBase *_db = nullptr;
Log *_Log = nullptr;
LoginSys *_login = nullptr;
File_Manager file;
bool _isLoaded = false;
};
/*
Database Structure
-data/
-cred.info
-settings.conf
-entries.dat
-cred.info
[USER]
[PASS]
[KEY]
-settings.conf DEFAULTS:
-[TOTAL_DAYS] NULL
-[SCHOOL_DAYS] NULL
-[NONSCHOOL_DAYS] NULL
-[TOTAL_TIME] NULL
-[TOTAL_TIME_WAISTED] NULL
-[TOTAL_TIME_NOT_WAISTED] NULL
-[STUDIED_TIME] NULL
-[CP_TIME] NULL
-[SIDE_PROJ_TIME] NULL
-[GAMES_TIME] NULL
-[EXERCISE_TIME] NULL
-entries.dat Default: empty file
-[ID],[DATE],[ENTER_TIME],[STUDIED_TIME],[CP_TIME],[SIDE_PROJ_TIME],[EXERCISE_TIME],[GAMES_TIME],[IS_SCHOOL_DAY],[EXIT_TIME],[AVLBLE_TIME],[WAISTED_TIME],[NOT_WAISTED_TIME]
-[ID],[DATE],[ENTER_TIME],[STUDIED_TIME],[CP_TIME],[SIDE_PROJ_TIME],[EXERCISE_TIME],[GAMES_TIME],[IS_SCHOOL_DAY],[EXIT_TIME],[AVLBLE_TIME],[WAISTED_TIME],[NOT_WAISTED_TIME]
-[ID],[DATE],[ENTER_TIME],[STUDIED_TIME],[CP_TIME],[SIDE_PROJ_TIME],[EXERCISE_TIME],[GAMES_TIME],[IS_SCHOOL_DAY],[EXIT_TIME],[AVLBLE_TIME],[WAISTED_TIME],[NOT_WAISTED_TIME]
-[ID],[DATE],[ENTER_TIME],[STUDIED_TIME],[CP_TIME],[SIDE_PROJ_TIME],[EXERCISE_TIME],[GAMES_TIME],[IS_SCHOOL_DAY],[EXIT_TIME],[AVLBLE_TIME],[WAISTED_TIME],[NOT_WAISTED_TIME]
-[ID],[DATE],[ENTER_TIME],[STUDIED_TIME],[CP_TIME],[SIDE_PROJ_TIME],[EXERCISE_TIME],[GAMES_TIME],[IS_SCHOOL_DAY],[EXIT_TIME],[AVLBLE_TIME],[WAISTED_TIME],[NOT_WAISTED_TIME]
*/

View File

@ -0,0 +1,81 @@
#include "login_sys.h"
void LoginSys::Init(Log* log, std::string user, std::string pass)
{
this->_givenUser = user;
this->_givenPass = pass;
mLoggedIn = false;
_Log = log;
Login();
}
bool LoginSys::IsLogged()
{
return mLoggedIn;
}
void LoginSys::ChangeCred(std::string oldUser, std::string oldPass, std::string newUser, std::string newPass)
{
if (mLoggedIn &&
(oldUser == _givenUser && oldPass == _givenPass)) {
std::vector<std::string> data;
int key = createKey();
std::string user = crypt(newUser, key);
std::string pass = crypt(newPass, key);
data.push_back(user);
data.push_back(pass);
data.push_back(std::to_string(key));
File_Manager files;
files.Write(std::string(DATA_PATH) + "cred.info", data);
}
else {
(*_Log) << "[LOGIN_SYS] UnRecognized Change of Credentials";
}
}
void LoginSys::Login()
{
File_Manager files;
std::vector<std::string> read;
files.Read(std::string(DATA_PATH) + "cred.info", &read);
if (!read.empty()) {
// creds avlble
std::string user = decrypt(read[0], atoi(read[2].c_str()));
std::string pass = decrypt(read[1], atoi(read[2].c_str()));
if (_givenUser == user)
if (_givenPass == user) {
mLoggedIn = true;
(*_Log) << "[LOGIN_SYS] Logged In";
return;
}
(*_Log) << std::string("[LOGIN_SYS] User: ").append(_givenUser);
(*_Log) << std::string("[LOGIN_SYS] Pass: ").append(_givenPass);
(*_Log) << "[LOGIN_SYS] Loggin Failed!";
(*_Log).flush(false);
mLoggedIn = false;
}
else {
// create creds
createFile(std::string(DATA_PATH) + "cred.info");
std::vector<std::string> data;
int key = createKey();
string User = crypt(_givenUser, key);
string Pass = crypt(_givenPass, key);
data.push_back(User);
data.push_back(Pass);
data.push_back(to_string(key));
files.Write(std::string(DATA_PATH) + "cred.info", data);
Login();
}
}

View File

@ -0,0 +1,48 @@
#pragma once
#include "config.h"
#include "../../defines.h"
class LoginSys
{
public:
void Init(Log* log, std::string user = "", std::string pass = "");
bool IsLogged();
void ChangeCred(std::string oldUser, std::string oldPass, std::string newUser, std::string newPass);
private:
void Login();
bool mLoggedIn = false;
std::string _givenUser = ""; // true if mLoggedIn = true
std::string _givenPass = ""; // true if mLoggedIn = true
Log *_Log = nullptr;
int createKey() {
return random(0, 26);
}
std::string crypt (std::string str, int key) {
for (int i = 0; i < str.size(); i++)
str[i] += key;
return str;
};
std::string decrypt(std::string str, int key) {
for (int i = 0; i < str.size(); i++)
str[i] -= key;
return str;
}
};
/*
Structure of login file:
Name: cred.info
Ex. Data:
admin // user
admin123 // pass
14 // key
*/

View File

@ -0,0 +1,87 @@
#include "ranking_sys.h"
void Ranking_sys::Init(Log * log, DB_sys * api)
{
_log = log;
c_api = api;
Rank newbie, beginner, moderate, expert, lizard, wizard, mastermind,
grandmaster, god_like, god_mode, bots;
newbie._name = "Newbie";
newbie._min = 0;
newbie._max = 50;
beginner._name = "Beginner";
beginner._min = 50;
beginner._max = 100;
moderate._name = "Moderate";
moderate._min = 100;
moderate._max = 550;
expert._name = "Expert";
expert._min = 550;
expert._max = 650;
lizard._name = "Lizard";
lizard._min = 650;
lizard._max = 10000;
wizard._name = "Wizard";
wizard._min = 1000;
wizard._max = 1500;
mastermind._name = "Mastermind";
mastermind._min = 1500;
mastermind._max = 2500;
grandmaster._name = "GrandMaster";
grandmaster._min = 2500;
grandmaster._max = 5000;
god_like._name = "God-Like";
god_like._min = 5000;
god_like._max = 5500;
god_mode._name = "God-Mode";
god_mode._min = 5500;
god_mode._max = 10000;
bots._name = "B.O.T.S.";
bots._min = 10000;
bots._max = 20000;
_ranks.push_back(newbie);
_ranks.push_back(beginner);
_ranks.push_back(moderate);
_ranks.push_back(expert);
_ranks.push_back(lizard);
_ranks.push_back(wizard);
_ranks.push_back(mastermind);
_ranks.push_back(grandmaster);
_ranks.push_back(god_like);
_ranks.push_back(god_mode);
_ranks.push_back(bots);
*_log << "[RANK_SYS] Successfully Initialized !";
}
void Ranking_sys::DeInit()
{
}
void Ranking_sys::calc()
{
c_api->ReCalc();
auto time = c_api->GetDataBase()->_TotalTimenotWaisted;
float hour = time._hr + (time._min/10) + (time._sec/100);
for (int i = 0; i < _ranks.size(); i++) {
if (hour >= _ranks[i]._min && hour <= _ranks[i]._max) {
rank = _ranks[i];
break;
}
}
}

View File

@ -0,0 +1,38 @@
#pragma once
#include <vector>
#include <math.h>
#include <algorithm>
#include "../../defines.h"
#include "../../core/database_system/db_sys.h"
struct Rank {
std::string _name;
float _min = 0;
float _max = 0;
bool operator==(const Rank &rank) {
if (_name == rank._name &&
_min == rank._min &&
_max == rank._max)
return true;
return false;
}
};
class Ranking_sys
{
public:
void Init(Log* log, DB_sys *api);
void DeInit();
void calc();
Rank rank;
vector<Rank> _ranks;
private:
// 11 ranks
DB_sys *c_api = nullptr;
Log *_log = nullptr;
};

View File

@ -0,0 +1,83 @@
#pragma once
#include <map>
#include <string>
#include <vector>
#include "utils/files/File_Manager.h"
#include "utils/files/csv/csv_loaders.h"
#include "utils/files/csv/csv_saver.h"
#include "utils/log/Log.h"
#include "utils/misc/basic_str_parser.h"
#include "utils/misc/finder.h"
#include "utils/misc/random_rework.h"
#include "utils/misc/string_conv.h"
#include "utils/time/Date.h"
#include "utils/time/Time.h"
#include "utils/time/Timer.h"
#define DATA_CRED_NAME std::string("cred.info")
#define DATA_SETTINGS_NAME std::string("settings.conf")
#define DATA_ENTRIES_NAME std::string("entries.dat")
#define DATA_PATH std::string("data/")
#define DATA_CRED_PATH (DATA_PATH + DATA_CRED_NAME)
#define DATA_SETTINGS_PATH (DATA_PATH + DATA_SETTINGS_NAME)
#define DATA_ENTRIES_PATH (DATA_PATH + DATA_ENTRIES_NAME)
using namespace std;
struct Entry {
int _ID = -1; // invalid default
Date _date;
Time_PAM _EnterTime;
Time _StudiedTime;
Time _CPTime;
Time _SideProjTime;
Time _ExerciseTime;
Time _GamesTime;
Time_PAM _ExitTime;
bool _isSchool = false;
Time _AvlbleTime;
Time _WaistedTime;
Time _NWaistedTime;
};
struct DataBase {
vector<Entry> *_entries = nullptr;
int _TotalDays = -1;
int _SchoolDays = -1;
int _NonSchoolDays = -1;
Time _TotalTime;
Time _TotalTimeWaisted;
Time _TotalTimenotWaisted;
Time _StudiedTime;
Time _CPTime;
Time _SideProjTime;
Time _GamesTime;
Time _ExerciseTime;
Time _AvgStudiedTime;
Time _AvgCPTime;
Time _AvgSideProjTime;
Time _AvgGamesTime;
Time _AvgExerciseTime;
Time _AvgWaistTime;
};
static Entry CalcEntry(const Entry &entry) {
Entry _entry = entry;
_entry._AvlbleTime =
Time_PAM(_entry._ExitTime - _entry._EnterTime).convertTo24HrFormat();
_entry._WaistedTime =
_entry._AvlbleTime -
(_entry._StudiedTime + _entry._CPTime + _entry._SideProjTime +
_entry._GamesTime + _entry._ExerciseTime);
_entry._NWaistedTime = _entry._AvlbleTime - _entry._WaistedTime;
return _entry;
}

View File

@ -0,0 +1,39 @@
#include "API_driver.h"
void API_driver::Init(wxListBox *list) {
_log = new Log(list);
sys = new DB_sys();
sys->Init(_log);
ranking = new Ranking_sys();
ranking->Init(_log, sys);
*_log << "[API] Init Success";
}
void API_driver::DeInit() {
*_log << "[API] DeInitializing . . . ";
delete _log;
delete sys;
}
bool API_driver::VerifyDB() { return true; }
bool API_driver::VerifyLoadedDB() { return true; }
bool API_driver::LoadDB(string user, string pass) {
if ((sys->IsThere() == false)) // first time start
sys->CreateEmpty(user, pass);
if (sys->IsEmpty() == false)
if (sys->Load(user, pass)) { // load the data, it is sure that it will
// be present to load
// calculations
ranking->calc();
sys->ReCalc();
} else {
sys->GetDataBase()->_entries = new vector<Entry>();
return false;
}
}
bool API_driver::CreateDB(string user, string pass) {
return sys->CreateEmpty(user, pass);
}

View File

@ -0,0 +1,42 @@
#pragma once
#include <vector>
#include <string>
#include <wx/wx.h>
#include "../defines.h"
#include "../core/login_system/login_sys.h"
#include "../core/database_system/db_sys.h"
#include "../core/ranking_system/ranking_sys.h"
class API_driver
{
public:
void Init(wxListBox *list = nullptr); // creates log, and db system, locks db
void DeInit(); // deletes log,and db system, unlocks db
bool VerifyDB(); // verify db files and syntax
bool VerifyLoadedDB(); // verify loaded db values
bool LoadDB(string user, string pass); // login and loads and locks
bool CreateDB(string user, string pass); // creates logins and doesnt load or lock
string getLog() {
return _log->get();
}
auto getLogSys() { return _log; }
vector<string> getLogQueue() {
return *_log->_queue;
}
auto getRank() { return ranking; }
auto DB() {
return sys;
}
private:
Log *_log = nullptr;
DB_sys *sys = nullptr;
Ranking_sys *ranking = nullptr;
};

View File

@ -0,0 +1,3 @@
#pragma once

View File

@ -0,0 +1,33 @@
#include "File_Manager.h"
File_Manager::File_Manager()
{
}
File_Manager::~File_Manager()
{
}
void File_Manager::Write(string file, vector<string> _data)
{
ofstream stream(file);
for (unsigned int i = 0; i < _data.size(); i++)
stream << _data[i] + "\n";
stream.close();
}
void File_Manager::Read(string file, vector<string>* _data)
{
ifstream stream(file);
string temp;
while (stream >> temp)
_data->push_back(temp);
stream.close();
}

View File

@ -0,0 +1,22 @@
#ifndef _H_FILE_MANAGER_H_
#define _H_FILE_MANAGER_H_
#pragma once
#include "file_util.h"
#include <vector>
#include <string>
#include <fstream>
using namespace std;
class File_Manager
{
public:
File_Manager();
~File_Manager();
void Write(string file, vector<string> _data);
void Read(string file, vector<string> *_data);
};
#endif // !_H_FILE_MANAGER_H_

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,40 @@
#include "csv_loaders.h"
#include <wx/file.h>
csv_loaders::csv_loaders()
{
}
csv_loaders::~csv_loaders()
{
}
vector<vector<string>> csv_loaders::Load(string path)
{
vector<vector<string>> res;
wxString raw;
wxFile file(path);
file.ReadAll(&raw);
vector<string> raw2;
string _row = "";
for (int i = 0; i < raw.size(); i++) {
if (raw[i] == '\n') {
raw2.push_back(_row);
_row.clear();
}
else _row.push_back(raw[i]);
}
for (int i = 0; i < raw2.size(); i++) {
auto row = raw2[i];
auto row_data = split(row, ",");
res.push_back(row_data);
}
return res;
}

View File

@ -0,0 +1,34 @@
#pragma once
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
#include "../File_Manager.h"
using namespace std;
class csv_loaders
{
public:
csv_loaders();
~csv_loaders();
vector<vector<string> > Load(string path);
private:
vector<string> split(const string& str, const string& delim)
{
vector<string> tokens;
size_t prev = 0, pos = 0;
do
{
pos = str.find(delim, prev);
if (pos == string::npos) pos = str.length();
string token = str.substr(prev, pos - prev);
if (!token.empty()) tokens.push_back(token);
prev = pos + delim.length();
} while (pos < str.length() && prev < str.length());
return tokens;
}
};

View File

@ -0,0 +1,48 @@
#include "csv_saver.h"
csv_saver::csv_saver()
{
}
csv_saver::~csv_saver()
{
}
void csv_saver::SetRaw(std::vector<std::vector<std::string>> r)
{
m_Raw = r;
}
void csv_saver::Save(std::string path)
{
using namespace std;
ofstream stream(path);
for (unsigned int i = 0; i < m_Raw.size(); i++) {
string str;
for (unsigned int j = 0; j < m_Raw[i].size(); j++) {
bool isSpace = false;
if (m_Raw[i][j].find(' ') != string::npos) {
str.append("/");
isSpace = true;
}
for (unsigned int m = 0; m < m_Raw[i][j].size(); m++) {
if (m_Raw[i][j][m] == '"')
str.append("/");
str += m_Raw[i][j][m];
}
if (isSpace)
str.append("/");
str += ",";
}
str += "\n";
stream << str;
}
stream.flush();
stream.close();
}

View File

@ -0,0 +1,18 @@
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
class csv_saver
{
public:
csv_saver();
~csv_saver();
void SetRaw(std::vector<std::vector<std::string> >);
void Save(std::string);
private:
std::vector<std::vector<std::string> > m_Raw;
};

View File

@ -0,0 +1,48 @@
#ifndef _H_FILE_UTIL_H_
#define _H_FILE_UTIL_H_
#pragma once
#include "../misc/string_conv.h"
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
static int fileExists(std::string file) {
std::ifstream ffs(file);
return ffs.is_open();
}
static bool dirExists(const std::string& dirName_in) {
struct stat info;
if (stat(dirName_in.c_str(), &info) != 0) // might be a file
return false;
else if (info.st_mode & S_IFDIR) // it is a dir
return true;
else return false; // it is neither
}
static bool createFile(std::string str) {
FILE *fp = fopen(str.c_str(), "w");
return fp;
}
static bool createDir(std::string str) {
#ifdef _WINDOWS_
mkdir(str);
#else
mkdir(str.c_str(), 0755);
#endif
}
static bool deleteDir(std::string str) {
return false;
}
static bool deleteFile(std::string str) {
return remove(str.c_str());
}
#endif // !_H_FILE_UTIL_H_

View File

@ -0,0 +1,66 @@
#ifndef _H_LOG_H_
#define _H_LOG_H_
#pragma once
#include <vector>
#include <string>
#include <wx/wx.h>
#include "../time/Timer.h"
#include "../files/File_Manager.h"
#include "../misc/random_rework.h"
struct Log {
std::vector<std::string> *_queue = nullptr;
Timer *_timer = nullptr;
wxListBox *_list = nullptr;
Log(wxListBox *list = nullptr) {
_list = list;
_queue = new std::vector<std::string>();
_timer = new Timer;
_timer->Start();
}
void operator<<(const std::string str) {
append(str);
}
void append(std::string str) {
str += ", At ";
str += to_string(_timer->get());
str += "ms";
_queue->push_back(str);
if (_list != nullptr)
_list->AppendString(str);
}
std::string get() {
if (_queue->size() != 0)
return (*_queue)[_queue->size() - 1];
return "[LOG] Log Is Empty";
}
void clear(bool _flush = false) {
_queue->clear();
if (_flush)
flush(false);
}
void flush(bool _clear = true) {
File_Manager file;
std::string str = "LogFile_";
str.append(to_string(random(0, INT_MAX)));
str.append(".txt");
file.Write(str, *_queue);
if (_clear)
clear();
}
};
#endif // !_H_LOG_H_

View File

@ -0,0 +1,20 @@
#pragma once
#include <string>
#include <vector>
using namespace std;
static vector<string> split(const string& str, const string& delim)
{
vector<string> tokens;
size_t prev = 0, pos = 0;
do
{
pos = str.find(delim, prev);
if (pos == string::npos) pos = str.length();
string token = str.substr(prev, pos - prev);
if (!token.empty()) tokens.push_back(token);
prev = pos + delim.length();
} while (pos < str.length() && prev < str.length());
return tokens;
}

View File

@ -0,0 +1,10 @@
#pragma once
template <class T>
static int findInVec(vector<T> vec, T item) {
for (int i = 0; i < vec.size(); i++) {
if (vec[i] == item)
return i;
}
return -1;
}

View File

@ -0,0 +1,18 @@
#ifndef _H_RANDOM_REWORK_H_
#define _H_RANDOM_REWORK_H_
#pragma once
#include <vector>
#include <string>
#include <random>
static int random(int min, int max) //range : [min, max)
{
if (max < min) return 0;
std::random_device rd; // obtain a random number from hardware
std::mt19937 eng(rd()); // seed the generator
std::uniform_int_distribution<> distr(min, max); // define the range
return distr(eng);
}
#endif // !_H_RANDOM_REWORK_H_

View File

@ -0,0 +1,28 @@
#ifndef _H_STRING_CONV_H_
#define _H_STRING_CONV_H_
#pragma once
#include <string>
#include <vector>
static std::wstring s2ws(const std::string &s) {
std::wstring wsTmp(s.begin(), s.end());
return wsTmp;
}
static std::string ws2s(const std::wstring &ws) {
std::string sTmp(ws.begin(), ws.end());
return sTmp;
}
static std::string v2s(const std::vector<std::vector<std::string> > &data) {
std::string str;
for (unsigned int i = 0; i < data.size(); i++)
for (unsigned int j = 0; j < data[i].size(); j++)
str.append(data[i][j]);
return str;
}
#endif // !_H_STRING_CONV_H_

View File

@ -0,0 +1,48 @@
#ifndef _H_DATE_H_
#define _H_DATE_H_
#pragma once
#include "../../defines.h"
#include <string>
#include <vector>
#include <map>
struct Date {
int _year = 1;
int _month = 1;
int _day = 1;
string get() {
string str;
str.append(to_string(_day));
str.append("/");
str.append(to_string(_month));
str.append("/");
str.append(to_string(_year));
return str;
}
void set(string str) {
auto data = split(str, "/");
_year = atoi(data[data.size() - 1].c_str());
_month = atoi(data[data.size() - 2].c_str());
_day = atoi(data[data.size() - 3].c_str());
}
void set(int day, int month, int year) {
_day = day;
_month = month;
_year = year;
}
bool operator==(const Date& date) {
if (_year == date._year &&
_month == date._month &&
_day == date._day)
return true;
return false;
}
};
#endif // !_H_DATE_H_

View File

@ -0,0 +1,326 @@
#ifndef _H_TIME_H_
#define _H_TIME_H_
#pragma once
#include <string>
#include <math.h>
#include "../misc/basic_str_parser.h"
using namespace std;
struct Time {
// STRING FORMAT:
// HH:MM:SS
// DO NOT ALTER FROM THE VARS ITSELF
int _hr = 0;
int _min = 0;
int _sec = 0;
int _ms = 0;
Time operator+(const Time& other_time) {
Time time = *this;
time.add(other_time.get());
return time;
}
Time operator-(const Time& other_time) {
Time time = *this;
time.remove(other_time.get());
return time;
}
std::string get() const {
string hrs = to_string(_hr);
string mins = to_string(_min);
string secs = to_string(_sec);
if (hrs.size() <= 1) hrs = "0" + hrs;
if (mins.size() <= 1) mins = "0" + mins;
if (secs.size() <= 1) secs = "0" + secs;
return string((hrs)+":" + (mins)+":" + (secs));
}
void set(int hr, int min, int seconds, int ms) {
_ms = 0;
_sec = 0;
_hr = 0;
addMilliSeconds(ms);
addSeconds(seconds);
addMins(min);
addHours(hr);
}
// format: HH:MM:SS,
// THERE IS NO MS
void set(std::string str) {
auto data = split(str, ":");
addSeconds(atoi(data[data.size() - 1].c_str()));
addMins(atoi(data[data.size() - 2].c_str()));
addHours(atoi(data[data.size() - 3].c_str()));
}
void add(int hr, int min, int seconds, int ms) {
addMilliSeconds(ms);
addSeconds(seconds);
addMins(min);
addHours(hr);
}
void add(std::string str) {
auto data = split(str, ":");
addSeconds(atoi(data[data.size() - 1].c_str()));
addMins(atoi(data[data.size() - 2].c_str()));
addHours(atoi(data[data.size() - 3].c_str()));
}
void remove(int hr, int min, int seconds) {
removeSeconds(seconds);
removeMins(min);
removeHours(hr);
}
void remove(std::string str) {
auto data = split(str, ":");
removeSeconds(atoi(data[data.size() - 1].c_str()));
removeMins(atoi(data[data.size() - 2].c_str()));
removeHours(atoi(data[data.size() - 3].c_str()));
}
void addMilliSeconds(int ms) {
int givenSeconds = ms / 1000;
int givenMS = ms - ((ms / 1000) * 1000);
int finalMS;
int carry = 0;
if ((_ms + givenMS) >= 1000)
carry = (_ms + givenMS) / 1000;
finalMS = (_ms + givenMS) - (((_ms + givenMS) / 1000)*1000);
addSeconds(givenSeconds+carry);
_ms = finalMS;
}
void addSeconds(int secs) {
int givenMinutes = secs / 60;
int givenSeconds = secs - ((secs / 60) * 60);
int finalMin, finalSec;
int carry = 0;
if ((_sec + givenSeconds) >= 60) {
carry = (_sec + givenSeconds) / 60;
}
finalSec = (_sec + givenSeconds) - (((_sec + givenSeconds) / 60)*60);
addMins(givenMinutes + carry);
_sec = finalSec;
}
void removeSeconds(int secs) {
int givenMinutes = secs / 60;
int givenSeconds = secs - ((secs / 60) * 60);
int finalMin, finalSec;
// carry
if (_sec < givenSeconds) {
_sec += 60;
_min--;
}
finalSec = _sec - givenSeconds;
finalMin = _min - givenMinutes;
_sec = finalSec;
_min = finalMin;
}
void addMins(int mins) {
int givenHours = mins / 60;
int givenMins = mins - ((mins / 60) * 60);
int finalMins = 0, finalHrs = 0;
int carry = 0;
if (_min + givenMins >= 60) {
carry = (_min + givenMins) / 60;
}
finalMins = (_min + givenMins) - (((_min + givenMins) / 60)*60);
addHours(finalHrs + carry);
_min = finalMins;
}
void removeMins(int mins) {
int givenHours = mins / 60;
int givenMins = mins - ((mins / 60) * 60);
int finalHours, finalMins;
// carry
if (_min < givenMins) {
_min += 60;
_hr--;
}
finalMins = _min - givenMins;
finalHours = _hr - givenHours;
_min = finalMins;
_hr = finalHours;
}
void addHours(int hrs) {
_hr += hrs;
}
void removeHours(int hrs) {
_hr -= hrs;
}
Time operator/(int n) {
Time time = *this;
time.divide(n);
return time;
}
void divide(int n) {
if (!_sec) _sec = _sec / n;
if (!_min) {
float mins = _min / n;
string min = to_string(mins);
auto min_data = split(min, ".");
_min = atoi(min_data[0].c_str());
addSeconds(atoi(min_data[1].c_str()));
}
if (!_hr) {
float hrs = _hr / n;
string hr = to_string(hrs);
auto hr_data = split(hr, ".");
_hr = atoi(hr_data[0].c_str());
addMins(atoi(hr_data[1].c_str()));
}
}
void reset() {
_hr = 0;
_min = 0;
_sec = 0;
}
};
struct Time_PAM {
int _hour = 0;
int _min = 0;
bool _isAM = true;
std::string get() {
string hr = to_string(_hour);
string mins = to_string(_min);
if (hr.size() <= 1)
hr = "0" + hr;
if (mins.size() <= 1)
mins = "0" + mins;
string str = hr + ":" + mins + " ";
str.append((_isAM) ? "AM" : "PM");
return str;
}
void set(int hours, int mins, bool am) {
_hour = hours;
_min = mins;
_isAM = am;
}
void set(std::string str) {
if (str == "")
return;
auto data = split(str, ":");
auto last_split = split(data[data.size() - 1], " ");
_isAM = (last_split[last_split.size() - 1] == "AM") ? true : false;
_hour = atoi(data[0].c_str());
_min = atoi(data[1].c_str());
}
void add(int hours, int mins) {
addMins(mins);
addHours(hours);
}
void addMins(int mins) {
Time time1 = convertTo24HrFormat();
Time time2;
time2.addMins(mins);
time1 = time1 + time2;
*this = convertFrom24HrFormat(time1);
}
void addHours(int hours) {
Time time1 = convertTo24HrFormat();
Time time2;
time2.addHours(hours);
time1 = time1 + time2;
*this = convertFrom24HrFormat(time1);
}
Time_PAM operator-(Time_PAM &other) {
Time other_24hr = other.convertTo24HrFormat();
Time this_24hr = this->convertTo24HrFormat();
Time _final = this_24hr - other_24hr;
return convertFrom24HrFormat(_final);
}
Time convertTo24HrFormat() {
Time time;
if (_isAM)
time.addHours(_hour);
else time.addHours(_hour + 12);
time.addMins(_min);
time.addSeconds(00);
return time;
}
Time_PAM convertFrom24HrFormat(Time given) {
Time_PAM time;
if (given._hr > 12) {
time._isAM = false;
time._hour = given._hr - 12;
}
else {
time._isAM = true;
time._hour = given._hr;
}
if (_hour == 24) {
time._isAM = true;
time._hour = 0;
}
if (_hour == 12) {
time._isAM = false;
time._hour = 12;
}
time._min = given._min;
return time;
}
};
#endif // !_H_TIME_H_

View File

@ -0,0 +1,53 @@
#ifndef _H_TIMER_H_
#define _H_TIMER_H_
#pragma once
#include <chrono>
#include <string>
struct Timer
{
std::string _msg = "";
std::chrono::system_clock::time_point _start, _end, _getVal;
std::chrono::duration<float> duration;
void Start()
{
_start = std::chrono::high_resolution_clock::now();
}
float get()
{
std::chrono::duration<float> duration;
_getVal = std::chrono::high_resolution_clock::now();
duration = _getVal - _start;
float ms = duration.count() * 1000;
return ms;
}
~Timer()
{
_end = std::chrono::high_resolution_clock::now();
duration = _end - _start;
float ms = duration.count() * 1000;
_msg = "[TIMER] Timer Destruct at: ";
_msg += std::to_string(ms);
}
void Terminate(std::string msg = "")
{
_end = std::chrono::high_resolution_clock::now();
duration = _end - _start;
float ms = duration.count() * 1000;
_msg = "[TIMER] ";
_msg += msg;
_msg += " , At ";
_msg += std::to_string(get());
_msg += "ms";
}
};
#endif // !_H_TIMER_H_

367
TimeSheet/app_entry.cpp Normal file
View File

@ -0,0 +1,367 @@
#include <wx/wx.h>
#include <wx/aui/aui.h>
#include "config.h"
#include "api/core/login_system/login_sys.h"
#include "api/core/database_system/db_sys.h"
#include "api/driver/API_driver.h"
#include "api/utils/time/Time.h"
#include "dlgs/login_dlg.h"
#include "dlgs/dashboard_dlg.h"
//#define WX_TEST // for wx testing
//#define API_LOGIN_SYS_TEST
//#define API_TIME_SYS_TEST
//#define API_DB_SYS_TEST
//#define API_DRIVER_TEST
//#define API_STRESS_TEST
#define MAIN_APP // main app
/*
auto log = driver.getLogQueue();
for (int i = 0; i < log.size(); i++)
cout << log[i] << endl;
*/
#ifdef MAIN_APP
class Program : public wxApp
{
public:
virtual bool OnInit();
virtual int OnExit();
API_driver* driver = nullptr;
};
wxIMPLEMENT_APP(Program);
bool Program::OnInit() {
LoginDlg *dlg = new LoginDlg(nullptr);
dlg->Show();
return true;
}
int Program::OnExit() {
if (!driver)
delete driver;
return 0;
}
#endif // MAIN_APP
#ifdef API_LOGIN_SYS_TEST
int main() {
std::string user, pass;
cout << "User:";
cin >> user;
cout << "Pass:";
cin >> pass;
createDir("data/");
Log *log = new Log();
LoginSys login;
login.Init(log, user, pass);
cout << log->get() << endl;
system("PAUSE");
}
#endif // DEBUG
#ifdef API_TIME_SYS_TEST
int main() {
Time time;
time.set("14:32:00");
//cout << time.get() << endl;
//time.addMins(60);
Time_PAM time2;
time2.add(time._hour, time._min);
cout << "12Hr format: " << time2.get() << endl;
cout << "24Hr format: " << time.get() << endl;
cin.get();
}
#endif // API_TIME_SYS_TEST
#ifdef API_DB_SYS_TEST
int main() {
Log *log = new Log();
DB_sys sys;
sys.Init(log);
//sys.CreateEmpty("admin", "admin");
sys.Load("admin", "admin");
cout << log->get() << endl;
sys.ReCalc();
cout << "Total Time: " << sys.GetDataBase()->_TotalTime.get() << endl;
cout << "Total Time not waisted: " << sys.GetDataBase()->_TotalTimenotWaisted.get() << endl;
cout << "Time Waisted: " << sys.GetDataBase()->_TotalTimeWaisted.get() << endl;
cout << "" << endl;
sys.Save();
sys.IsThere();
cout << (*log).get() << endl;
cin.get();
}
#endif // API_DB_SYS_TEST
#ifdef API_DRIVER_TEST
int main() {
API_driver driver;
driver.Init();
driver.CreateDB("admin", "admin");
driver.LoadDB("admin", "admin");
auto log = driver.getLogQueue();
for (int i = 0; i < log.size(); i++)
cout << log[i] << endl;
driver.DeInit();
cin.get();
return 0;
}
#endif
#ifdef API_STRESS_TEST
void list() {
cout << "Welcome To the TimeSheet API stress test" << endl;
cout << "1. Create n Entries" << endl;
cout << "2. Load Entries" << endl;
cout << "3. Show Log" << endl;
cout << "99. Exit " << endl;
cout << "> ";
}
void createNEnteries(API_driver* api, int n) {
system("CLS");
cout << "Creating Entries . . . " << n << endl;
Timer time_create;
time_create.Start();
for (int i = 0; i < n; i++) {
Entry entry;
entry._ID = i;
entry._EnterTime.set(0, 0, 0);
entry._ExitTime.set(0,0,0);
api->DB()->AddEntry(entry);
cout << "Creating Entry Number " << i+1 << endl;
system("CLS");
}
auto create_duration = time_create.get();
cout << "Created Entries . . . " << endl;
cout << "================================" << endl;
cout << "Results: " << endl;
cout << "Created " << n << " Entries in " << create_duration << "ms" << endl;
cout << "Speed: " << (1000*n)/create_duration << " Entry/sec" << endl;
cout << "================================" << endl;
cout << "Calculating these Entries . . . " << endl;
Timer timer;
timer.Start();
api->DB()->ReCalc();
auto duration = timer.get();
cout << "================================" << endl;
cout << "Results: " << endl;
cout << "Calculated " << n << " in " << duration << "ms . . . " << endl;
/*
ms ents
5 100
1000 ?
*/
cout << "Speed: " << (1000*n)/duration << " Entry/sec" << endl;
cout << "================================" << endl;
timer.Terminate();
cout << "Finished Calculating Entries . . ." << endl;
cout << "Saving Entries . . . " << endl;
Timer timer2;
timer2.Start();
api->DB()->Save();
auto duration2 = timer2.get();
cout << "Finished Saving . . . " << endl;
cout << "================================" << endl;
cout << "Results:" << endl;
cout << "Saved " << n << " Entries in " << duration2 << endl;
cout << "Speed: " << (1000*n)/duration2 << " Entry/sec" << endl;
cout << "================================" << endl;
system("PAUSE");
system("CLS");
}
void loadEntries(API_driver* api, string user, string pass) {
system("CLS");
cout << "Loading Entries . . ." << endl;
Timer time;
time.Start();
api->LoadDB(user, pass);
auto duration = time.get();
cout << "Loaded Entries . . . " << endl;
cout << "================================" << endl;
cout << "Results: " << endl;
cout << "Loaded " << api->DB()->GetDataBase()->_entries->size() << " Entries in " << duration << "ms" << endl;
cout << "Speed: " << (1000*api->DB()->GetDataBase()->_entries->size())/duration << " Entry/sec" << endl;
cout << "================================" << endl;
system("PAUSE");
system("CLS");
//api->DeInit();
//api->Init();
}
int main() {
API_driver driver;
driver.Init();
int input = 0;
list();
cin >> input;
string str1, str2;
while (input != 99) {
auto log = driver.getLogQueue();
switch (input)
{
case 1:
int n;
cout << "Entires Count: ";
cin >> n;
createNEnteries(&driver, n);
break;
case 2:
cout << "User: ";
cin >> str1;
cout << "Pass: " ;
cin >> str2;
loadEntries(&driver, str1, str2);
break;
case 3:
cout << "All the Log:" << endl;
for (int i = 0; i < log.size(); i++)
cout << log[i] << endl;
break;
case 99:
driver.DeInit();
exit(0);
break;
default:
break;
}
list();
cin >> input;
}
driver.DeInit();
return 0;
}
#endif // API_STRESS_TEST
#ifdef WX_TEST
class MyFrame : public wxFrame
{
public:
MyFrame(wxWindow* parent) : wxFrame(parent, -1, _("wxAUI Test"),
wxDefaultPosition, wxSize(800, 600),
wxDEFAULT_FRAME_STYLE)
{
// notify wxAUI which frame to use
m_mgr.SetManagedWindow(this);
// create several text controls
wxTextCtrl* text1 = new wxTextCtrl(this, -1, _("Pane 1 - sample text"),
wxDefaultPosition, wxSize(200, 150),
wxNO_BORDER | wxTE_MULTILINE);
wxTextCtrl* text2 = new wxTextCtrl(this, -1, _("Pane 2 - sample text"),
wxDefaultPosition, wxSize(200, 150),
wxNO_BORDER | wxTE_MULTILINE);
wxTextCtrl* text3 = new wxTextCtrl(this, -1, _("Main content window"),
wxDefaultPosition, wxSize(200, 150),
wxNO_BORDER | wxTE_MULTILINE);
// add the panes to the manager
m_mgr.AddPane(text1, wxLEFT, wxT("Pane Number One"));
m_mgr.AddPane(text2, wxBOTTOM, wxT("Pane Number Two"));
m_mgr.AddPane(text3, wxCENTER);
// tell the manager to "commit" all the changes just made
m_mgr.Update();
}
~MyFrame()
{
// deinitialize the frame manager
m_mgr.UnInit();
}
private:
wxAuiManager m_mgr;
};
// our normal wxApp-derived class, as usual
class MyApp : public wxApp
{
public:
bool OnInit()
{
wxFrame* frame = new MyFrame(NULL);
SetTopWindow(frame);
frame->Show();
return true;
}
};
DECLARE_APP(MyApp);
IMPLEMENT_APP(MyApp);
#endif // WX_TEST

75
TimeSheet/config.h Normal file
View File

@ -0,0 +1,75 @@
#ifndef _H_CONFIG_H_
#define _H_CONFIG_H_
#pragma once
#include <wx/aui/aui.h>
#include <wx/wx.h>
#include "api/defines.h"
#define LOGIN_DLG_W 300
#define LOGIN_DLG_H 134
#define LOGIN_DLG_T "Login"
// 978, 573
#define DASHBOARD_DLG_W 978
#define DASHBOARD_DLG_H 573
#define DASHBOARD_DLG_T std::string("DashBoard | TimeSheet")
// 359, 203
#define NEW_DAY_DLG_W 359
#define NEW_DAY_DLG_H 203
#define NEW_DAY_DLG_T std::string("New Day | TimeSheet")
enum { // IDS
/////////////////////////////
//
// Login IDs
//
/////////////////////////////
ID_LOGIN_DLG_MAIN,
ID_LOGIN_DLG_PANEL,
ID_LOGIN_DLG_USER_BOX,
ID_LOGIN_DLG_PASS_BOX,
ID_LOGIN_DLG_LOGIN_BTN,
/////////////////////////////
//
// DashBoard IDs
//
/////////////////////////////
ID_DASHBOARD_MAIN,
ID_DASHBOARD_PANEL,
ID_DASHBOARD_TAB_CONTROL,
ID_DASHBOARD_LISTBOX,
ID_DASHBOARD_PROGRESS_BAR,
ID_DASHBOARD_SAVE_BTN,
ID_DASHBOARD_COMMAND_BTN,
ID_DASHBOARD_START_TIMER,
ID_DASHBOARD_STOP_TIMER,
ID_DASHBOARD_RESET_TIMER,
ID_DASHBOARD_ENTER_TIME,
ID_DASHBOARD_NEW_DAY,
ID_DASHBOARD_TIMER,
/////////////////////////////
//
// NewDay IDs
//
/////////////////////////////
ID_NEW_DAY_DLG_MAIN,
ID_NEW_DAY_DLG_PANEL,
ID_NEW_DAY_DLG_ID,
ID_NEW_DAY_DLG_DATE,
ID_NEW_DAY_DLG_START_TIME,
ID_NEW_DAY_DLG_EXIT_TIME,
ID_NEW_DAY_DLG_SCHOOL_DAY,
ID_NEW_DAY_DLG_CANCEL_BTN,
ID_NEW_DAY_DLG_CREATE_BTN,
};
#endif // !_H_CONFIG_H_

View File

@ -0,0 +1,541 @@
#include "dashboard_dlg.h"
DashBoard::DashBoard(wxWindow *pID, string user, string pass)
: wxFrame(nullptr, ID_DASHBOARD_MAIN, DASHBOARD_DLG_T, wxDefaultPosition,
wxSize(DASHBOARD_DLG_W, DASHBOARD_DLG_H)) {
CreateControls();
c_api = new API_driver();
c_api->Init(mLogList);
if (c_api->LoadDB(user, pass) && c_api->DB()->Loaded() == false) {
wxMessageBox("Wrong Pass or User.\n Exiting . . .", "ERROR");
c_api->DeInit();
exit(1);
return;
}
c_api->VerifyDB();
c_api->DB()->ReCalc();
SetTodayEntry();
ShowData();
GUILogic();
mTabs = new wxNotebook(mPanel, ID_DASHBOARD_TAB_CONTROL, wxDefaultPosition,
wxDefaultSize, wxNB_TOP);
mTabs->SetPosition(wxPoint(12, 12));
mTabs->SetSize(wxSize(594 + 75, 575));
mTimeSheetView =
new TimeSheetView(mTabs, c_api, mTabs->GetClientSize() - wxSize(8, 29));
mTabs->AddPage(mTimeSheetView, "TimeSheet View", true);
SizeControls();
SetMinSize(GetSize());
SetMaxSize(GetSize());
Center();
}
void DashBoard::CreateControls() {
#pragma region Declaration Of Controls
mPanel = new wxPanel(this, ID_DASHBOARD_PANEL);
mHours = new wxStaticText(mPanel, wxID_ANY, "");
mLevel = new wxStaticText(mPanel, wxID_ANY, "");
mFunnyText = new wxStaticText(mPanel, wxID_ANY, "");
mSaveBtn = new wxButton(mPanel, ID_DASHBOARD_SAVE_BTN, "Save");
mLogList = new wxListBox(mPanel, ID_DASHBOARD_LISTBOX);
mEnterLog = new wxButton(mPanel, ID_DASHBOARD_COMMAND_BTN, ">");
mCommand = new wxTextCtrl(mPanel, wxID_ANY);
mProgressText =
new wxStaticText(mPanel, wxID_ANY, "Progress For Next Level Up:");
mProgressBar = new wxGauge(mPanel, ID_DASHBOARD_PROGRESS_BAR, 0);
mTotalDays = new wxStaticText(mPanel, wxID_ANY, "Total Days:");
mSchoolDays = new wxStaticText(mPanel, wxID_ANY, "SchoolDays:");
mNonSchoolDays = new wxStaticText(mPanel, wxID_ANY, "Non-School Days:");
mTotalTime = new wxStaticText(mPanel, wxID_ANY, "Total Time:");
mTimeNWaisted =
new wxStaticText(mPanel, wxID_ANY, "Total Time Not Waisted:");
mTimeWaisted = new wxStaticText(mPanel, wxID_ANY, "Total Time Waisted:");
mStudiesTime = new wxStaticText(mPanel, wxID_ANY, "Studies Time:");
mCPTime = new wxStaticText(mPanel, wxID_ANY, "CP Time:");
mSideProjTime = new wxStaticText(mPanel, wxID_ANY, "Side Proj Time:");
mGamesTime = new wxStaticText(mPanel, wxID_ANY, "Games Time:");
mExcerciseTime = new wxStaticText(mPanel, wxID_ANY, "Excercises Time:");
mTotalDaysVal = new wxTextCtrl(mPanel, wxID_ANY);
mTotalDaysVal->SetEditable(false);
mSchoolDaysVal = new wxTextCtrl(mPanel, wxID_ANY);
mSchoolDaysVal->SetEditable(false);
mNonSchoolDaysVal = new wxTextCtrl(mPanel, wxID_ANY);
mNonSchoolDaysVal->SetEditable(false);
mTotalTimeVal = new wxTextCtrl(mPanel, wxID_ANY);
mTotalTimeVal->SetEditable(false);
mTotalTimeNWaistedVal = new wxTextCtrl(mPanel, wxID_ANY);
mTotalTimeNWaistedVal->SetEditable(false);
mTotalTimeWaistedVal = new wxTextCtrl(mPanel, wxID_ANY);
mTotalTimeWaistedVal->SetEditable(false);
mStudiesTimeVal = new wxTextCtrl(mPanel, wxID_ANY);
mStudiesTimeVal->SetEditable(false);
mCPTimeVal = new wxTextCtrl(mPanel, wxID_ANY);
mCPTimeVal->SetEditable(false);
mSideProjVal = new wxTextCtrl(mPanel, wxID_ANY);
mSideProjVal->SetEditable(false);
mGamesTimeVal = new wxTextCtrl(mPanel, wxID_ANY);
mGamesTimeVal->SetEditable(false);
mExcerciseVal = new wxTextCtrl(mPanel, wxID_ANY);
mExcerciseVal->SetEditable(false);
mTimerText = new wxStaticText(mPanel, wxID_ANY, "Timer:");
mTimerVal = new wxTextCtrl(mPanel, wxID_ANY, "--:--:--", wxDefaultPosition,
wxDefaultSize, wxTE_CENTRE);
mTimerVal->SetEditable(false);
mStartedText = new wxStaticText(mPanel, wxID_ANY, "Started:");
mStartedVal = new wxTextCtrl(mPanel, wxID_ANY, "--:--:--",
wxDefaultPosition, wxDefaultSize, wxTE_CENTRE);
mStartedVal->SetEditable(false);
mStartTimer = new wxButton(mPanel, ID_DASHBOARD_START_TIMER, "Start");
mEnterTime = new wxButton(mPanel, ID_DASHBOARD_ENTER_TIME, "Enter Time");
mNewDay = new wxButton(mPanel, ID_DASHBOARD_NEW_DAY, "New Day Entry");
mChoices = new wxComboBox(mPanel, wxID_ANY);
mChoices->AppendString("Study");
mChoices->AppendString("CP");
mChoices->AppendString("Side Proj");
mChoices->AppendString("Exercise");
mChoices->AppendString("Games");
mChoices->SetEditable(false);
mTimer = new wxTimer(this, ID_DASHBOARD_TIMER);
mStopTimer = new wxButton(mPanel, ID_DASHBOARD_STOP_TIMER, "Stop");
mResetTimer = new wxButton(mPanel, ID_DASHBOARD_RESET_TIMER, "Reset");
wxFont font1;
font1.SetPointSize(15);
mLevel->SetFont(font1);
wxFont font;
font.Bold();
font.SetPointSize(24);
mHours->SetFont(font);
wxFont font2;
font2.SetPointSize(8);
mFunnyText->SetPosition(wxPoint(758, 96));
#pragma endregion
ShowWithCurrentDay();
}
void DashBoard::SizeControls() {
#pragma region Controls Settings
mMainSizer = new wxBoxSizer(wxHORIZONTAL);
mLeftPane = new wxBoxSizer(wxVERTICAL);
mRightPane = new wxBoxSizer(wxVERTICAL);
mRightTopPane = new wxBoxSizer(wxVERTICAL);
mRightBotPane = new wxBoxSizer(wxVERTICAL);
mLeftPane->Add(mTabs, 0, wxEXPAND | wxLEFT, 5);
mLeftPane->AddSpacer(4);
mLeftPane->Add(mProgressText, 0, wxLEFT, 5);
mLeftPane->AddSpacer(4);
mLeftPane->Add(mProgressBar, 0, wxEXPAND | wxLEFT, 5);
mLeftPane->AddSpacer(4);
mRightTopPane->AddSpacer(25);
mRightTopPane->Add(mHours, 0, wxCENTER | wxRIGHT | wxLEFT, 125);
mRightTopPane->AddSpacer(5);
mRightTopPane->Add(mLevel, 0, wxCENTER | wxRIGHT | wxLEFT, 125);
mRightTopPane->AddSpacer(25);
#pragma region SummeryFields
wxBoxSizer *mSummeryFields = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *mSummeryLeftFields = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *mSummeryRightFields = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *mTotalDaysFields = new wxBoxSizer(wxHORIZONTAL);
mTotalDaysFields->Add(mTotalDays, 0, wxCENTER, 0);
mTotalDaysFields->Add(mTotalDaysVal, 0, wxCENTER, 0);
wxBoxSizer *mSchoolDaysFields = new wxBoxSizer(wxHORIZONTAL);
mSchoolDaysFields->Add(mSchoolDays, 0, wxCENTER, 0);
mSchoolDaysFields->Add(mSchoolDaysVal, 0, wxCENTER, 0);
wxBoxSizer *mNonSchoolDaysFields = new wxBoxSizer(wxHORIZONTAL);
mNonSchoolDaysFields->Add(mNonSchoolDays, 0, wxCENTER, 0);
mNonSchoolDaysFields->Add(mNonSchoolDaysVal, 0, wxCENTER, 0);
wxBoxSizer *mTotalTimeFields = new wxBoxSizer(wxHORIZONTAL);
mTotalTimeFields->Add(mTotalTime, 0, wxCENTER, 0);
mTotalTimeFields->Add(mTotalTimeVal, 0, wxCENTER, 0);
wxBoxSizer *mTotalTimeNWaistedFields = new wxBoxSizer(wxHORIZONTAL);
mTotalTimeNWaistedFields->Add(mTimeNWaisted, 0, wxCENTER, 0);
mTotalTimeNWaistedFields->Add(mTotalTimeNWaistedVal, 0, wxCENTER, 0);
wxBoxSizer *mTotalTimeWaistedFields = new wxBoxSizer(wxHORIZONTAL);
mTotalTimeWaistedFields->Add(mTimeWaisted, 0, wxCENTER, 0);
mTotalTimeWaistedFields->Add(mTotalTimeWaistedVal, 0, wxCENTER, 0);
mSummeryLeftFields->Add(mTotalDaysFields, 0, wxALIGN_RIGHT, 0);
mSummeryLeftFields->Add(mSchoolDaysFields, 0, wxALIGN_RIGHT, 0);
mSummeryLeftFields->Add(mNonSchoolDaysFields, 0, wxALIGN_RIGHT, 0);
mSummeryLeftFields->Add(mTotalTimeFields, 0, wxALIGN_RIGHT, 0);
mSummeryLeftFields->Add(mTotalTimeNWaistedFields, 0, wxALIGN_RIGHT, 0);
mSummeryLeftFields->Add(mTotalTimeWaistedFields, 0, wxALIGN_RIGHT, 0);
wxBoxSizer *mStudiedTimeFields = new wxBoxSizer(wxHORIZONTAL);
mStudiedTimeFields->Add(mStudiesTime, 0, wxCENTER, 0);
mStudiedTimeFields->Add(mStudiesTimeVal, 0, wxCENTER, 0);
wxBoxSizer *mCPTimeFields = new wxBoxSizer(wxHORIZONTAL);
mCPTimeFields->Add(mCPTime, 0, wxCENTER, 0);
mCPTimeFields->Add(mCPTimeVal, 0, wxCENTER, 0);
wxBoxSizer *mSideProjField = new wxBoxSizer(wxHORIZONTAL);
mSideProjField->Add(mSideProjTime, 0, wxCENTER, 0);
mSideProjField->Add(mSideProjVal, 0, wxCENTER, 0);
wxBoxSizer *mGamesTimeField = new wxBoxSizer(wxHORIZONTAL);
mGamesTimeField->Add(mGamesTime, 0, wxCENTER, 0);
mGamesTimeField->Add(mGamesTimeVal, 0, wxCENTER, 0);
wxBoxSizer *mExcerciseTimeField = new wxBoxSizer(wxHORIZONTAL);
mExcerciseTimeField->Add(mExcerciseTime, 0, wxCENTER, 0);
mExcerciseTimeField->Add(mExcerciseVal, 0, wxCENTER, 0);
mSummeryRightFields->Add(mStudiedTimeFields, 0, wxALIGN_RIGHT, 0);
mSummeryRightFields->Add(mCPTimeFields, 0, wxALIGN_RIGHT, 0);
mSummeryRightFields->Add(mSideProjField, 0, wxALIGN_RIGHT, 0);
mSummeryRightFields->Add(mGamesTimeField, 0, wxALIGN_RIGHT, 0);
mSummeryRightFields->Add(mExcerciseTimeField, 0, wxALIGN_RIGHT, 0);
mSummeryFields->Add(mSummeryLeftFields);
mSummeryFields->AddSpacer(5);
mSummeryFields->Add(mSummeryRightFields);
mSummeryFields->AddSpacer(5);
#pragma endregion
#pragma region GeneralControls
wxBoxSizer *mControls = new wxBoxSizer(wxHORIZONTAL);
// First col //
wxBoxSizer *mControlsColOne = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *mStartedFields = new wxBoxSizer(wxHORIZONTAL);
mStartedFields->Add(mStartedText, 0, wxCENTER, 0);
mStartedFields->Add(mStartedVal, 0, wxCENTER, 0);
wxBoxSizer *mTimerFields = new wxBoxSizer(wxHORIZONTAL);
mTimerFields->Add(mTimerText, 0, wxCENTER, 0);
mTimerFields->Add(mTimerVal, 0, wxCENTER, 0);
mControlsColOne->Add(mStartedFields, 0, wxALIGN_RIGHT, 0);
mControlsColOne->Add(mTimerFields, 0, wxALIGN_RIGHT, 0);
mControlsColOne->Add(mSaveBtn, 0, wxEXPAND | wxALIGN_RIGHT, 0);
/////////////
// Second Col //
wxBoxSizer *mControlsColTwo = new wxBoxSizer(wxVERTICAL);
mControlsColTwo->Add(mResetTimer, 0, wxEXPAND, 0);
wxBoxSizer *mControlsTimerCtrls = new wxBoxSizer(wxHORIZONTAL);
mControlsTimerCtrls->Add(mStartTimer);
mControlsTimerCtrls->Add(mStopTimer);
mControlsColTwo->Add(mControlsTimerCtrls);
mControlsColTwo->Add(mNewDay, 0, wxEXPAND, 0);
/////////////
// Third Col //
wxBoxSizer *mControlsColThree = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *mControlsEnterTime = new wxBoxSizer(wxVERTICAL);
mControlsEnterTime->Add(mChoices, 0, wxEXPAND, 0);
mControlsEnterTime->Add(mEnterTime, 0, wxEXPAND, 0);
mControlsColThree->Add(mControlsEnterTime, 0, wxEXPAND | wxALIGN_BOTTOM, 0);
/////////////
mControls->Add(mControlsColOne, 0, wxEXPAND | wxALIGN_RIGHT, 0);
mControls->Add(mControlsColTwo, 0, wxEXPAND | wxALIGN_CENTER, 0);
mControls->Add(mControlsColThree, 0,
wxEXPAND | wxALIGN_RIGHT | wxALIGN_BOTTOM, 0);
#pragma endregion
#pragma region ConsoleArea
wxBoxSizer *mConsoleSizer = new wxBoxSizer(wxVERTICAL);
mConsoleSizer->Add(mLogList, 0, wxEXPAND, 0);
wxFlexGridSizer *mEnterText = new wxFlexGridSizer(2, 4, 0);
mEnterText->AddGrowableCol(0, 4);
mEnterText->AddGrowableCol(1, 0);
mEnterText->Add(mCommand, 0, wxEXPAND | wxCENTER, 0);
mEnterText->Add(mEnterLog);
mConsoleSizer->Add(mEnterText, 0, wxCENTER | wxEXPAND, 0);
#pragma endregion
mRightTopPane->Add(mSummeryFields, 0, wxCENTER, 0);
mRightTopPane->AddSpacer(15);
mRightTopPane->Add(mControls, 0, wxCENTER, 0);
mRightBotPane->Add(mConsoleSizer, 0, wxEXPAND | wxCENTER, 0);
mRightPane->Add(mRightTopPane);
mRightPane->AddSpacer(10);
mRightPane->Add(mRightBotPane, 0, wxEXPAND | wxCENTER, 0);
mMainSizer->Add(mLeftPane);
mMainSizer->AddSpacer(4);
mMainSizer->Add(mRightPane);
mMainSizer->SetSizeHints(this);
SetSizerAndFit(mMainSizer);
#pragma endregion
Center();
}
void DashBoard::ShowData() {
c_api->DB()->ReCalc();
mHours->SetLabel(
to_string(c_api->DB()->GetDataBase()->_TotalTimenotWaisted._hr));
c_api->getRank()->calc();
mLevel->SetLabel(c_api->getRank()->rank._name);
mTotalDaysVal->SetValue(to_string(c_api->DB()->GetDataBase()->_TotalDays));
mSchoolDaysVal->SetValue(
to_string(c_api->DB()->GetDataBase()->_SchoolDays));
mNonSchoolDaysVal->SetValue(
to_string(c_api->DB()->GetDataBase()->_NonSchoolDays));
auto db = *c_api->DB()->GetDataBase();
mTotalTimeVal->SetValue(db._TotalTime.get());
mTotalTimeNWaistedVal->SetValue(db._TotalTimenotWaisted.get());
mTotalTimeWaistedVal->SetValue(db._TotalTimeWaisted.get());
mStudiesTimeVal->SetValue(db._StudiedTime.get());
mCPTimeVal->SetValue(db._CPTime.get());
mSideProjVal->SetValue(db._SideProjTime.get());
mGamesTimeVal->SetValue(db._GamesTime.get());
mExcerciseVal->SetValue(db._ExerciseTime.get());
mLevel->SetPosition(
wxPoint((mHours->GetPosition().x + (mHours->GetSize().x) / 2) -
(mLevel->GetSize().x / 2),
mHours->GetPosition().y + mHours->GetSize().y + 4));
Rank nextRank =
c_api->getRank()->_ranks[findInVec<Rank>(c_api->getRank()->_ranks,
c_api->getRank()->rank) +
1];
int range = nextRank._min - c_api->getRank()->rank._min;
int finished_range =
(atoi(mHours->GetLabel()) - c_api->getRank()->rank._min) * 1000;
range *= 1000;
mProgressBar->SetRange(range);
mProgressBar->SetValue(finished_range);
if (mTimeSheetView != nullptr) mTimeSheetView->ShowData();
}
void DashBoard::OnSaveBtn(wxCommandEvent &event) {
if (c_api->DB()->Save()) {
(*c_api->getLogSys()) << "[GUI] Save Succesfully !";
} else {
(*c_api->getLogSys()) << "[GUI] Could Save !";
}
}
void DashBoard::OnEnterCommmand(wxCommandEvent &event) {}
void DashBoard::OnQuit(wxCloseEvent &event) {
c_api->DeInit();
exit(0);
}
void DashBoard::OnIDLE(wxIdleEvent &event) { GUILogic(); }
void DashBoard::OnResize(wxSizeEvent &event) { SizeControls(); }
void DashBoard::OnNewDay(wxCommandEvent &event) {
NewDayDlg *dlg = new NewDayDlg(this, c_api);
dlg->ShowModal();
if (dlg->GetReturnCode() == wxID_OK) {
c_api->DB()->AddEntry(dlg->GetValue());
c_api->DB()->ReCalc();
ShowData();
GUILogic();
mTodayEntry =
&(*c_api->DB()
->GetDataBase()
->_entries)[c_api->DB()->GetDataBase()->_entries->size()];
} else
return;
}
void DashBoard::OnStartTimer(wxCommandEvent &event) {
mTimer->Start(1000);
mTimerStarted = true;
mTimerVal->SetValue(time.get());
Time_PAM timerStart;
auto timerStart_val = wxDateTime::Now();
timerStart.add(timerStart_val.GetHour(), timerStart_val.GetMinute());
mStartedVal->SetValue(timerStart.get());
}
void DashBoard::OnStopTimer(wxCommandEvent &event) { mTimer->Stop(); }
void DashBoard::OnResetTimer(wxCommandEvent &event) {
mTimer->Stop();
mTimerStarted = false;
mTimerVal->SetValue("--:--:--");
time.reset();
mStartedVal->SetValue("--:--:--");
}
void DashBoard::OnProgressTimer(wxTimerEvent &event) {
time.addMilliSeconds(event.GetInterval());
mTimerVal->SetValue(time.get());
}
void DashBoard::OnEndTimer(wxCommandEvent &event) {
auto choice = mChoices->GetString(mChoices->GetSelection());
Time time;
time.set(mTimerVal->GetValue().ToStdString());
OnResetTimer(event);
if (choice == "Study") {
// add time to studies
mTodayEntry->_StudiedTime = mTodayEntry->_StudiedTime + time;
} else if (choice == "CP") {
// add time to cp
mTodayEntry->_CPTime = mTodayEntry->_CPTime + time;
} else if (choice == "Side Proj") {
// add time to side proj
mTodayEntry->_SideProjTime = mTodayEntry->_SideProjTime + time;
} else if (choice == "Exercise") {
// add time to exercise
mTodayEntry->_ExerciseTime = mTodayEntry->_ExerciseTime + time;
} else if (choice == "Games") {
// add time to games
mTodayEntry->_GamesTime = mTodayEntry->_GamesTime + time;
}
mTimer->Stop();
mTimerStarted = false;
mChoices->SetValue("");
mTimerVal->SetValue("--:--:--");
mStartedVal->SetValue("--:--:--");
time.reset();
mTimeSheetView->ShowData();
}
void DashBoard::OnDraw(wxPaintEvent &event) {}
void DashBoard::ShowWithCurrentDay() {
mNewDay->Enable();
mTimerText->Disable();
mTimerVal->Disable();
mStartedText->Disable();
mStartedVal->Disable();
mStartTimer->Disable();
mStopTimer->Disable();
mResetTimer->Disable();
mChoices->Disable();
mEnterTime->Disable();
}
void DashBoard::ShowWithoutCurrentDay() {
mNewDay->Disable();
mTimerText->Enable();
mTimerVal->Enable();
mStartedText->Enable();
mStartedVal->Enable();
mStartTimer->Enable();
mStopTimer->Enable();
mResetTimer->Enable();
mChoices->Enable();
mEnterTime->Enable();
}
void DashBoard::GUILogic() {
if (c_api->DB()->IsEmpty() == true) return;
auto db = *c_api->DB()->GetDataBase();
// New Day check
auto today = wxDateTime::Now();
Date lastDayInDB = (*db._entries)[db._entries->size() - 1]._date;
Date today_comp;
today_comp.set(today.GetDay(), today.GetMonth() + 1, today.GetYear());
if (lastDayInDB == today_comp)
// Last created Day was today enable timer controls
ShowWithoutCurrentDay();
else
ShowWithCurrentDay();
// Enter Time Check
if (mTimerStarted) { // prevent disabling choices when stop is entered (for
// precision)
mChoices->Enable();
if (mChoices->GetString(mChoices->GetSelection()) != "")
mEnterTime->Enable();
} else {
mEnterTime->Disable();
mChoices->Disable();
}
SetTodayEntry();
}
wxBEGIN_EVENT_TABLE(DashBoard, wxFrame)
EVT_BUTTON(ID_DASHBOARD_SAVE_BTN,
DashBoard::OnSaveBtn) EVT_BUTTON(ID_DASHBOARD_SAVE_BTN,
DashBoard::OnEnterCommmand)
EVT_BUTTON(ID_DASHBOARD_START_TIMER, DashBoard::OnStartTimer)
EVT_BUTTON(ID_DASHBOARD_STOP_TIMER, DashBoard::OnStopTimer)
EVT_BUTTON(ID_DASHBOARD_RESET_TIMER, DashBoard::OnResetTimer)
EVT_BUTTON(ID_DASHBOARD_ENTER_TIME, DashBoard::OnEndTimer)
EVT_BUTTON(ID_DASHBOARD_NEW_DAY, DashBoard::OnNewDay)
EVT_CLOSE(DashBoard::OnQuit)
EVT_TIMER(ID_DASHBOARD_TIMER,
DashBoard::OnProgressTimer)
EVT_IDLE(DashBoard::OnIDLE)
wxEND_EVENT_TABLE()

View File

@ -0,0 +1,118 @@
#pragma once
#include "../config.h"
#include <wx/gbsizer.h>
#include <wx/sizer.h>
#include <wx/wx.h>
#include <thread>
#include "api/driver/API_driver.h"
#include "../panels/timesheet_view.h"
#include "newDay_dlg.h"
class DashBoard : public wxFrame {
public:
DashBoard(wxWindow *pID, string user, string pass);
void CreateControls();
void SizeControls();
void ShowData();
private:
void OnSaveBtn(wxCommandEvent &event);
void OnEnterCommmand(wxCommandEvent &event);
void OnQuit(wxCloseEvent &event);
void OnIDLE(wxIdleEvent &event);
void OnResize(wxSizeEvent &event);
void OnNewDay(wxCommandEvent &event);
void OnStartTimer(wxCommandEvent &event);
void OnStopTimer(wxCommandEvent &event);
void OnResetTimer(wxCommandEvent &event);
void OnProgressTimer(wxTimerEvent &event);
void OnEndTimer(wxCommandEvent &event);
void OnDraw(wxPaintEvent &event);
wxDECLARE_EVENT_TABLE();
void ShowWithCurrentDay();
void ShowWithoutCurrentDay();
void GUILogic();
void SetTodayEntry() {
auto db = c_api->DB()->GetDataBase();
if (c_api->DB()->IsEmpty() == true)
mTodayEntry = nullptr;
else
mTodayEntry = &(*db->_entries)[db->_entries->size() - 1];
}
wxPanel *mPanel = nullptr;
wxNotebook *mTabs = nullptr;
TimeSheetView *mTimeSheetView = nullptr;
wxStaticText *mHours = nullptr;
wxStaticText *mLevel = nullptr;
wxStaticText *mFunnyText = nullptr;
wxStaticText *mTotalDays = nullptr;
wxStaticText *mSchoolDays = nullptr;
wxStaticText *mNonSchoolDays = nullptr;
wxStaticText *mTotalTime = nullptr;
wxStaticText *mTimeWaisted = nullptr;
wxStaticText *mTimeNWaisted = nullptr;
wxStaticText *mTotalTimeWaisted = nullptr;
wxStaticText *mStudiesTime = nullptr;
wxStaticText *mCPTime = nullptr;
wxStaticText *mSideProjTime = nullptr;
wxStaticText *mGamesTime = nullptr;
wxStaticText *mExcerciseTime = nullptr;
wxTextCtrl *mTotalDaysVal = nullptr;
wxTextCtrl *mSchoolDaysVal = nullptr;
wxTextCtrl *mNonSchoolDaysVal = nullptr;
wxTextCtrl *mTotalTimeVal = nullptr;
wxTextCtrl *mTotalTimeNWaistedVal = nullptr;
wxTextCtrl *mTotalTimeWaistedVal = nullptr;
wxTextCtrl *mStudiesTimeVal = nullptr;
wxTextCtrl *mCPTimeVal = nullptr;
wxTextCtrl *mSideProjVal = nullptr;
wxTextCtrl *mGamesTimeVal = nullptr;
wxTextCtrl *mExcerciseVal = nullptr;
wxButton *mSaveBtn = nullptr;
wxListBox *mLogList = nullptr;
wxButton *mEnterLog = nullptr;
wxTextCtrl *mCommand = nullptr;
wxStaticText *mTimerText = nullptr;
wxTextCtrl *mTimerVal = nullptr;
wxStaticText *mStartedText = nullptr;
wxTextCtrl *mStartedVal = nullptr;
wxComboBox *mChoices = nullptr;
wxButton *mStartTimer = nullptr;
wxButton *mStopTimer = nullptr;
wxButton *mResetTimer = nullptr;
wxButton *mEnterTime = nullptr;
wxTimer *mTimer;
Time time;
Timer timer;
wxButton *mNewDay = nullptr;
bool mTimerStarted = false;
wxStaticText *mProgressText = nullptr;
wxGauge *mProgressBar = nullptr;
API_driver *c_api = nullptr;
Entry *mTodayEntry = nullptr;
wxBoxSizer *mMainSizer = nullptr;
wxBoxSizer *mLeftPane = nullptr;
wxBoxSizer *mRightPane = nullptr;
wxBoxSizer *mRightTopPane = nullptr;
wxBoxSizer *mRightBotPane = nullptr;
};

View File

@ -0,0 +1,67 @@
#include "login_dlg.h"
#include "dashboard_dlg.h"
LoginDlg::LoginDlg(wxWindow *pID)
: wxFrame(pID, ID_LOGIN_DLG_MAIN, LOGIN_DLG_T, wxDefaultPosition,
wxSize(LOGIN_DLG_W, LOGIN_DLG_H),
wxDEFAULT_FRAME_STYLE & ~wxMAXIMIZE_BOX) {
CreateControls();
SetMinSize(GetSize());
SetMaxSize(GetSize());
Center();
}
void LoginDlg::CreateControls() {
mPanel = new wxPanel(this, ID_LOGIN_DLG_PANEL);
mUserText = new wxStaticText(mPanel, wxID_ANY, "User: ");
mPassText = new wxStaticText(mPanel, wxID_ANY, "Pass: ");
mUserBox = new wxTextCtrl(mPanel, ID_LOGIN_DLG_USER_BOX);
mPassBox = new wxTextCtrl(mPanel, ID_LOGIN_DLG_PASS_BOX, "",
wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD);
mLoginBtn = new wxButton(mPanel, ID_LOGIN_DLG_LOGIN_BTN, "Login");
mLoginBtn->SetDefault();
wxBoxSizer *mSizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *mUserField = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *mPassField = new wxBoxSizer(wxHORIZONTAL);
wxSizerFlags flags;
flags.Center();
mUserField->Add(mUserText, 0, wxALIGN_CENTER);
mUserField->AddSpacer(4);
mUserField->Add(mUserBox, 0, wxALIGN_CENTER);
mPassField->Add(mPassText, 0, wxALIGN_CENTER);
mPassField->AddSpacer(4);
mPassField->Add(mPassBox, 0, wxALIGN_CENTER);
mSizer->Add(mUserField, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, 50);
mSizer->Add(mPassField, 0, wxALIGN_CENTER | wxLEFT | wxRIGHT, 50);
mSizer->Add(mLoginBtn, 0, wxALIGN_CENTER, 25);
mSizer->SetSizeHints(this);
this->SetSizer(mSizer);
}
string LoginDlg::GetPass() { return mPassBox->GetValue().ToStdString(); }
string LoginDlg::GetUser() { return mUserBox->GetValue().ToStdString(); }
void LoginDlg::OnLoginBtn(wxCommandEvent &event) {
if (GetPass() == "" || GetUser() == "") return;
this->Show(false);
DashBoard *dsh = new DashBoard(nullptr, GetUser(), GetPass());
dsh->Show();
this->Close(true);
}
wxBEGIN_EVENT_TABLE(LoginDlg, wxFrame)
EVT_BUTTON(ID_LOGIN_DLG_LOGIN_BTN, LoginDlg::OnLoginBtn)
wxEND_EVENT_TABLE()

View File

@ -0,0 +1,26 @@
#pragma once
#include "../config.h"
#include <wx/wx.h>
class LoginDlg : public wxFrame {
public:
LoginDlg(wxWindow* pID);
void CreateControls();
string GetPass();
string GetUser();
private:
void OnLoginBtn(wxCommandEvent& event);
wxDECLARE_EVENT_TABLE();
wxPanel* mPanel = nullptr;
wxStaticText* mUserText = nullptr;
wxStaticText* mPassText = nullptr;
wxTextCtrl* mUserBox = nullptr;
wxTextCtrl* mPassBox = nullptr;
wxButton* mLoginBtn = nullptr;
};

View File

@ -0,0 +1,114 @@
#include "newDay_dlg.h"
NewDayDlg::NewDayDlg(wxWindow *pID, API_driver *api)
: wxDialog(pID, ID_NEW_DAY_DLG_MAIN, NEW_DAY_DLG_T, wxDefaultPosition,
wxSize(NEW_DAY_DLG_W, NEW_DAY_DLG_H)) {
c_api = api;
CreateControls();
ShowData();
SetMinSize(GetSize());
SetMaxSize(GetSize());
Center();
}
void NewDayDlg::CreateControls() {
#pragma region Creation of Controls
mPanel = new wxPanel(this, ID_NEW_DAY_DLG_PANEL);
mIDText = new wxStaticText(mPanel, wxID_ANY, "ID:");
mDateText = new wxStaticText(mPanel, wxID_ANY, "Date:");
mStartTimeText = new wxStaticText(mPanel, wxID_ANY, "Start Time:");
mExitTimeText = new wxStaticText(mPanel, wxID_ANY, "Expected Exit Time:");
mIDVal = new wxTextCtrl(mPanel, ID_NEW_DAY_DLG_ID);
mIDVal->SetEditable(false);
mDateVal = new wxTextCtrl(mPanel, ID_NEW_DAY_DLG_DATE);
mDateVal->SetEditable(false);
mStartTimeVal = new wxTextCtrl(mPanel, ID_NEW_DAY_DLG_START_TIME);
mStartTimeVal->SetEditable(false);
mExitTimeVal = new wxTextCtrl(mPanel, ID_NEW_DAY_DLG_EXIT_TIME);
mIsSchoolDay =
new wxCheckBox(mPanel, ID_NEW_DAY_DLG_SCHOOL_DAY, "Is School Day");
mCancel = new wxButton(mPanel, ID_NEW_DAY_DLG_CANCEL_BTN, "Cancel");
mCreate = new wxButton(mPanel, ID_NEW_DAY_DLG_CREATE_BTN, "Create");
#pragma endregion
#pragma region Size of Controls
mIDText->SetPosition(wxPoint(105, 9));
mDateText->SetPosition(wxPoint(93, 35));
mStartTimeText->SetPosition(wxPoint(71, 61));
mExitTimeText->SetPosition(wxPoint(25, 87));
mIDVal->SetSize(wxSize(199, 20));
mIDVal->SetPosition(wxPoint(132, 6));
mDateVal->SetSize(wxSize(199, 20));
mDateVal->SetPosition(wxPoint(132, 32));
mStartTimeVal->SetSize(wxSize(199, 20));
mStartTimeVal->SetPosition(wxPoint(132, 58));
mExitTimeVal->SetSize(wxSize(199, 20));
mExitTimeVal->SetPosition(wxPoint(132, 84));
mIsSchoolDay->SetPosition(wxPoint(132, 106));
mCancel->SetSize(wxSize(75, 23));
mCancel->SetPosition(wxPoint(256, 129));
mCreate->SetSize(wxSize(118, 23));
mCreate->SetPosition(wxPoint(132, 129));
#pragma endregion
}
void NewDayDlg::ShowData() {
auto db = *c_api->DB()->GetDataBase();
if (db._TotalDays >= 0)
mIDVal->SetValue(to_string(db._TotalDays + 1));
else
mIDVal->SetValue(to_string(1)); // always show negative as 1
Date today_comp;
auto today = wxDateTime::Now();
today_comp.set(today.GetDay(), today.GetMonth() + 1, today.GetYear());
mDateVal->SetValue(today_comp.get());
Time_PAM timerStart;
auto timerStart_val = wxDateTime::Now();
timerStart.add(timerStart_val.GetHour(), timerStart_val.GetMinute());
mStartTimeVal->SetValue(timerStart.get());
}
void NewDayDlg::OnCancel(wxCommandEvent &event) {
this->Close();
this->SetReturnCode(wxID_CANCEL);
}
void NewDayDlg::OnCreate(wxCommandEvent &event) {
entry = new Entry;
entry->_ID = atoi(mIDVal->GetValue());
entry->_date.set(mDateVal->GetValue().ToStdString());
entry->_EnterTime.set(mStartTimeVal->GetValue().ToStdString());
entry->_ExitTime.set(mExitTimeVal->GetValue().ToStdString());
entry->_isSchool = mIsSchoolDay->GetValue();
*entry = CalcEntry(*entry);
this->Close();
this->SetReturnCode(wxID_OK);
}
wxBEGIN_EVENT_TABLE(NewDayDlg, wxDialog)
EVT_BUTTON(ID_NEW_DAY_DLG_CREATE_BTN, NewDayDlg::OnCreate)
EVT_BUTTON(ID_NEW_DAY_DLG_CANCEL_BTN, NewDayDlg::OnCancel)
wxEND_EVENT_TABLE()

View File

@ -0,0 +1,42 @@
#pragma once
#include "../config.h"
#include "api/driver/API_driver.h"
#include <wx/wx.h>
#include <thread>
class NewDayDlg : public wxDialog {
public:
NewDayDlg(wxWindow *pID, API_driver *c_api);
void CreateControls();
void ShowData();
Entry GetValue() { return *entry; }
private:
void OnCancel(wxCommandEvent &event);
void OnCreate(wxCommandEvent &event);
wxDECLARE_EVENT_TABLE();
wxPanel *mPanel = nullptr;
wxStaticText *mIDText = nullptr;
wxStaticText *mDateText = nullptr;
wxStaticText *mStartTimeText = nullptr;
wxStaticText *mExitTimeText = nullptr;
wxTextCtrl *mIDVal = nullptr;
wxTextCtrl *mDateVal = nullptr;
wxTextCtrl *mStartTimeVal = nullptr;
wxTextCtrl *mExitTimeVal = nullptr;
wxCheckBox *mIsSchoolDay = nullptr;
wxButton *mCancel = nullptr;
wxButton *mCreate = nullptr;
Entry *entry = nullptr;
API_driver *c_api = nullptr;
;
};

View File

@ -0,0 +1,65 @@
#include "timesheet_view.h"
TimeSheetView::TimeSheetView(wxWindow* pID, API_driver* api, wxSize size)
: wxPanel(pID, wxID_ANY, wxDefaultPosition, size) {
c_api = api;
// Parent size: 594, 468
// SetSize(wxSize(594, 468));
// SetSize(this->GetParent()->GetParent()->GetClientSize());
CreateControls();
ShowData();
}
void TimeSheetView::CreateControls() {
mGrid =
new wxGrid(this, wxID_ANY, wxDefaultPosition, wxSize(GetClientSize()));
mGrid->ShowScrollbars(wxScrollbarVisibility::wxSHOW_SB_ALWAYS,
wxScrollbarVisibility::wxSHOW_SB_ALWAYS);
mGrid->EnableEditing(false);
mGrid->CreateGrid(0, 13);
mGrid->SetColLabelValue(0, "ID");
mGrid->SetColLabelValue(1, "Date");
mGrid->SetColLabelValue(2, "Enter");
mGrid->SetColLabelValue(3, "Studied");
mGrid->SetColLabelValue(4, "CP");
mGrid->SetColLabelValue(5, "Side Proj");
mGrid->SetColLabelValue(6, "Exercise");
mGrid->SetColLabelValue(7, "Games");
mGrid->SetColLabelValue(8, "Is School");
mGrid->SetColLabelValue(9, "Exit");
mGrid->SetColLabelValue(10, "Avlble Time");
mGrid->SetColLabelValue(11, "Waisted Time");
mGrid->SetColLabelValue(12, "Not Waisted");
mGrid->HideRowLabels();
}
void TimeSheetView::ShowData() {
if (mGrid->GetNumberRows() > 0)
mGrid->DeleteRows(0, mGrid->GetNumberRows());
if (c_api->DB()->IsDataEmpty() == true) return;
auto db = c_api->DB()->GetDataBase()->_entries;
mGrid->AppendRows(db->size());
for (int i = 0; i < db->size(); i++) {
auto row = (*db)[i];
mGrid->SetCellValue(i, 0, to_string(row._ID));
mGrid->SetCellValue(i, 1, row._date.get());
mGrid->SetCellValue(i, 2, row._EnterTime.get());
mGrid->SetCellValue(i, 3, row._StudiedTime.get());
mGrid->SetCellValue(i, 4, row._CPTime.get());
mGrid->SetCellValue(i, 5, row._SideProjTime.get());
mGrid->SetCellValue(i, 6, row._ExerciseTime.get());
mGrid->SetCellValue(i, 7, row._GamesTime.get());
mGrid->SetCellValue(i, 8, to_string(row._isSchool));
mGrid->SetCellValue(i, 9, row._ExitTime.get());
mGrid->SetCellValue(i, 10, row._AvlbleTime.get());
mGrid->SetCellValue(i, 11, row._WaistedTime.get());
mGrid->SetCellValue(i, 12, row._NWaistedTime.get());
}
mGrid->AutoSizeColumns();
// mGrid->ShowScrollbars(wxScrollbarVisibility::wxSHOW_SB_ALWAYS,
// wxScrollbarVisibility::wxSHOW_SB_ALWAYS);
}

View File

@ -0,0 +1,27 @@
#pragma once
#include "../config.h"
#include "api/driver/API_driver.h"
#include <wx/wx.h>
#include <wx/grid.h>
#include <thread>
class TimeSheetView : public wxPanel
{
public:
TimeSheetView(wxWindow* pID, API_driver *api, wxSize size);
void CreateControls();
void ShowData();
private:
API_driver *c_api = nullptr;
wxGrid *mGrid = nullptr;
private:
enum {
ID_PANEL,
ID_GRID
};
};

3
bin/data/cred.info Normal file
View File

@ -0,0 +1,3 @@
ps|x}
ps|x}
15

108
bin/data/entries.dat Normal file
View File

@ -0,0 +1,108 @@
1,11/9/2018,01:15 PM,00:30:00,00:45:00,00:00:00,00:00:00,01:00:00,1,09:00 PM,07:45:00,05:30:00,02:15:00
2,12/9/2018,02:00 PM,00:33:00,02:00:00,00:00:00,00:00:00,00:38:00,1,08:00 PM,06:00:00,02:49:00,03:11:00
3,13/9/2018,02:00 PM,00:23:00,00:29:00,00:17:00,00:00:00,01:29:00,1,09:00 PM,07:00:00,04:22:00,02:38:00
4,14/9/2018,02:10 PM,00:35:00,00:00:00,01:46:00,00:00:00,02:00:00,1,09:00 PM,06:50:00,02:29:00,04:21:00
5,15/9/2018,06:00 AM,00:00:00,02:56:00,01:27:00,00:00:00,00:34:00,0,11:00 PM,17:00:00,12:03:00,04:57:00
6,16/9/2018,05:36 AM,02:45:00,01:47:00,01:33:00,00:00:00,00:35:00,0,09:45 PM,16:09:00,09:29:00,06:40:00
7,17/9/2018,07:35 AM,02:32:00,03:10:00,01:43:00,00:00:00,00:00:00,0,08:30 PM,12:55:00,05:30:00,07:25:00
8,18/9/2018,02:00 PM,01:26:00,02:25:00,00:00:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,03:09:00,03:51:00
9,19/9/2018,02:00 PM,01:09:00,00:24:00,04:00:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,01:27:00,05:33:00
10,20/9/2018,02:00 PM,01:16:00,01:24:00,01:54:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,02:26:00,04:34:00
11,21/9/2018,02:00 PM,01:43:00,02:25:00,00:42:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,02:10:00,04:50:00
12,22/9/2018,02:00 PM,00:00:00,01:47:00,00:00:00,00:00:00,00:00:00,1,09:50 PM,07:50:00,06:03:00,01:47:00
13,23/9/2018,05:00 AM,01:47:00,01:23:00,00:00:00,00:00:00,00:00:00,0,10:50 PM,17:50:00,14:40:00,03:10:00
14,24/9/2018,06:00 AM,00:08:00,06:21:00,00:25:00,00:00:00,00:00:00,0,10:00 PM,16:00:00,09:06:00,06:54:00
15,25/9/2018,06:30 AM,00:43:00,02:26:00,00:00:00,00:00:00,00:00:00,0,11:30 PM,17:00:00,13:51:00,03:09:00
16,26/9/2018,09:00 AM,02:05:00,02:15:00,00:00:00,00:00:00,00:00:00,0,09:00 PM,12:00:00,07:40:00,04:20:00
17,27/9/2018,02:00 PM,01:24:00,01:42:00,00:20:00,00:00:00,00:00:00,1,08:20 PM,06:20:00,02:54:00,03:26:00
18,28/9/2018,02:00 PM,00:50:00,02:47:00,00:00:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,02:53:00,03:37:00
19,29/9/2018,02:00 PM,00:30:00,01:02:00,01:41:00,00:00:00,00:00:00,1,09:40 PM,07:40:00,04:27:00,03:13:00
20,30/9/2018,09:00 AM,04:15:00,02:14:00,02:57:00,00:00:00,00:00:00,0,09:30 PM,12:30:00,03:04:00,09:26:00
21,1/10/2018,02:00 PM,01:04:00,00:00:00,02:55:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,03:31:00,03:59:00
22,2/10/2018,02:00 PM,01:08:00,00:00:00,03:03:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,03:19:00,04:11:00
23,3/10/2018,02:00 PM,00:51:00,01:24:00,00:00:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,05:15:00,02:15:00
24,4/10/2018,02:00 PM,01:14:00,01:06:00,02:00:00,00:20:00,00:15:00,1,09:30 PM,07:30:00,02:35:00,04:55:00
25,5/10/2018,02:00 PM,01:35:00,00:00:00,00:00:00,00:00:00,00:00:00,1,10:00 PM,08:00:00,06:25:00,01:35:00
26,6/10/2018,05:30 AM,01:11:00,00:00:00,00:00:00,00:00:00,04:21:00,0,09:45 PM,16:15:00,10:43:00,05:32:00
27,7/10/2018,06:30 AM,00:45:00,00:00:00,02:17:00,00:00:00,00:20:00,0,09:30 PM,15:00:00,11:38:00,03:22:00
28,8/10/2018,02:05 PM,01:14:00,00:00:00,00:00:00,00:00:00,01:10:00,1,09:00 PM,06:55:00,04:31:00,02:24:00
29,9/10/2018,02:00 PM,01:15:00,00:00:00,02:24:00,00:25:00,00:25:00,1,09:00 PM,07:00:00,02:31:00,04:29:00
30,10/10/2018,02:00 PM,01:15:00,00:00:00,00:35:00,00:00:00,01:45:00,1,09:00 PM,07:00:00,03:25:00,03:35:00
31,11/10/2018,02:00 PM,01:08:00,00:00:00,05:05:00,00:00:00,00:21:00,1,09:00 PM,07:00:00,00:26:00,06:34:00
32,12/10/2018,02:15 PM,00:00:00,00:00:00,03:20:00,00:00:00,03:00:00,1,11:20 PM,09:05:00,02:45:00,06:20:00
33,13/10/2018,07:00 AM,03:35:00,00:00:00,01:45:00,00:30:00,01:10:00,0,11:20 PM,16:20:00,09:20:00,07:00:00
34,14/10/2018,08:30 AM,00:30:00,00:00:00,03:46:00,00:20:00,04:15:00,0,08:30 PM,12:00:00,03:09:00,08:51:00
35,15/10/2018,02:00 PM,01:28:00,00:00:00,02:57:00,00:00:00,00:45:00,1,09:00 PM,07:00:00,01:50:00,05:10:00
36,16/10/2018,02:00 PM,01:16:00,00:10:00,03:23:00,00:00:00,00:30:00,1,08:30 PM,06:30:00,01:11:00,05:19:00
37,17/10/2018,02:00 PM,01:27:00,00:00:00,02:11:00,00:00:00,00:46:00,1,09:30 PM,07:30:00,03:06:00,04:24:00
38,18/10/2018,02:00 PM,01:28:00,00:00:00,02:39:00,00:00:00,00:46:00,1,08:30 PM,06:30:00,01:37:00,04:53:00
39,19/10/2018,02:00 PM,00:00:00,00:00:00,07:03:00,00:00:00,00:00:00,1,10:30 PM,08:30:00,01:27:00,07:03:00
40,20/10/2018,07:00 AM,01:24:00,00:00:00,11:30:00,00:00:00,02:15:00,0,11:59 PM,16:59:00,01:50:00,15:09:00
41,21/10/2018,06:55 AM,00:00:00,03:47:00,04:32:00,00:00:00,03:00:00,0,08:30 PM,13:35:00,02:16:00,11:19:00
42,22/10/2018,02:00 PM,02:03:00,04:00:00,00:00:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,00:27:00,06:03:00
43,23/10/2018,02:15 PM,00:52:00,00:00:00,03:38:00,00:00:00,00:00:00,1,08:55 PM,06:40:00,02:10:00,04:30:00
44,24/10/2018,02:00 PM,01:16:00,00:00:00,04:00:00,00:00:00,00:26:00,1,09:15 PM,07:15:00,01:33:00,05:42:00
45,25/10/2018,02:00 PM,01:32:00,00:00:00,05:00:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,00:58:00,06:32:00
46,26/10/2018,02:00 PM,00:00:00,00:00:00,05:00:00,00:00:00,01:18:00,1,09:15 PM,07:15:00,00:57:00,06:18:00
47,27/10/2018,05:50 AM,01:28:00,00:00:00,03:20:00,00:00:00,00:56:00,0,09:30 PM,15:40:00,09:56:00,05:44:00
48,28/10/2018,06:30 AM,02:10:00,00:00:00,09:06:00,00:00:00,01:59:00,0,08:30 PM,14:00:00,00:45:00,13:15:00
49,29/10/2018,02:10 PM,01:25:00,00:00:00,03:20:00,00:00:00,00:00:00,1,08:30 PM,06:20:00,01:35:00,04:45:00
50,30/10/2018,02:00 PM,01:26:00,00:00:00,03:27:00,00:00:00,00:44:00,1,08:30 PM,06:30:00,00:53:00,05:37:00
51,31/10/2018,02:00 PM,01:50:00,00:00:00,02:32:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,02:08:00,04:22:00
52,1/11/2018,02:00 PM,00:21:00,00:00:00,04:13:00,00:00:00,00:00:00,1,08:15 PM,06:15:00,01:41:00,04:34:00
53,2/11/2018,02:00 PM,00:38:00,00:00:00,04:30:00,00:00:00,01:16:00,1,10:00 PM,08:00:00,01:36:00,06:24:00
54,3/11/2018,06:18 AM,01:15:00,00:00:00,03:40:00,00:00:00,00:43:00,0,08:30 PM,14:12:00,08:34:00,05:38:00
55,4/11/2018,06:37 AM,01:50:00,00:00:00,02:15:00,00:00:00,04:20:00,0,08:30 PM,13:53:00,05:28:00,08:25:00
56,5/11/2018,02:00 PM,01:02:00,00:00:00,02:45:00,00:00:00,01:32:00,1,08:30 PM,06:30:00,01:11:00,05:19:00
57,6/11/2018,02:00 PM,00:43:00,00:00:00,03:00:00,00:00:00,01:58:00,1,08:30 PM,06:30:00,00:49:00,05:41:00
58,7/11/2018,02:00 PM,00:32:00,00:00:00,02:10:00,00:00:00,00:19:00,1,08:30 PM,06:30:00,03:29:00,03:01:00
59,8/11/2018,02:15 PM,02:49:00,00:00:00,01:39:00,00:00:00,00:00:00,1,08:30 PM,06:15:00,01:47:00,04:28:00
60,9/11/2018,02:00 PM,00:00:00,01:45:00,00:21:00,00:00:00,02:43:00,1,10:30 PM,08:30:00,03:41:00,04:49:00
61,10/11/2018,06:22 AM,04:31:00,01:46:00,01:50:00,00:45:00,02:34:00,0,10:00 PM,15:38:00,04:12:00,11:26:00
62,11/11/2018,06:00 AM,00:38:00,01:23:00,01:15:00,00:00:00,03:16:00,0,08:30 PM,14:30:00,07:58:00,06:32:00
63,12/11/2018,02:00 PM,00:47:00,00:00:00,04:25:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,01:18:00,05:12:00
64,13/11/2018,02:00 PM,01:52:00,00:00:00,02:07:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,02:31:00,03:59:00
65,14/11/2018,02:00 PM,00:33:00,01:15:00,01:15:00,00:00:00,00:21:00,1,08:30 PM,06:30:00,03:06:00,03:24:00
66,15/11/2018,02:00 PM,01:00:00,00:00:00,02:30:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,04:00:00,03:30:00
67,16/11/2018,02:00 PM,00:00:00,00:00:00,02:50:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,04:40:00,02:50:00
68,17/11/2018,08:27 AM,01:57:00,00:00:00,05:46:00,00:00:00,00:00:00,0,10:30 PM,14:03:00,06:20:00,07:43:00
69,18/11/2018,06:00 AM,00:00:00,00:00:00,08:15:00,00:00:00,01:45:00,0,08:00 PM,14:00:00,04:00:00,10:00:00
70,19/11/2018,02:00 PM,02:58:00,01:06:00,01:00:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,00:56:00,05:04:00
71,20/11/2018,02:00 PM,02:00:00,00:35:00,01:10:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,02:15:00,03:45:00
72,21/11/2018,02:00 PM,01:00:00,01:00:00,00:00:00,00:00:00,01:06:00,1,08:00 PM,06:00:00,02:54:00,03:06:00
73,22/11/2018,02:00 PM,01:22:00,01:45:00,01:08:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:45:00,04:15:00
74,23/11/2018,02:00 PM,00:00:00,00:00:00,01:38:00,00:00:00,03:32:00,1,08:00 PM,06:00:00,00:50:00,05:10:00
75,24/11/2018,06:00 AM,05:46:00,00:00:00,01:18:00,00:00:00,02:02:00,0,08:00 PM,14:00:00,04:54:00,09:06:00
76,25/11/2018,08:15 AM,03:42:00,00:00:00,00:32:00,00:00:00,05:00:00,0,08:00 PM,11:45:00,02:31:00,09:14:00
77,26/11/2018,02:00 PM,01:25:00,02:20:00,01:14:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:01:00,04:59:00
78,27/11/2018,02:00 PM,01:32:00,01:00:00,00:00:00,00:00:00,01:04:00,1,08:00 PM,06:00:00,02:24:00,03:36:00
79,28/11/2018,02:00 PM,02:30:00,00:30:00,01:50:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:10:00,04:50:00
80,29/11/2018,02:00 PM,00:45:00,00:30:00,00:30:00,00:00:00,01:26:00,1,08:00 PM,06:00:00,02:49:00,03:11:00
81,30/11/2018,02:15 PM,00:00:00,00:00:00,03:02:00,00:00:00,00:00:00,1,09:00 PM,06:45:00,03:43:00,03:02:00
82,1/12/2018,07:15 AM,03:00:00,00:00:00,02:55:00,00:00:00,00:00:00,0,09:00 PM,13:45:00,07:50:00,05:55:00
83,2/12/2018,08:40 AM,02:17:00,00:00:00,08:10:00,00:00:00,00:00:00,0,09:00 PM,12:20:00,01:53:00,10:27:00
84,3/12/2018,02:00 PM,01:15:00,00:00:00,03:00:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:45:00,04:15:00
85,4/12/2018,02:00 PM,01:30:00,00:00:00,01:30:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,03:00:00,03:00:00
86,5/12/2018,02:00 PM,05:00:00,00:00:00,01:00:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,00:00:00,06:00:00
87,6/12/2018,02:00 PM,01:00:00,00:00:00,05:00:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,01:00:00,06:00:00
88,7/12/2018,06:27 AM,00:45:00,00:00:00,04:00:00,00:00:00,00:00:00,0,10:00 PM,15:33:00,10:48:00,04:45:00
89,8/12/2018,08:00 AM,05:00:00,00:00:00,00:00:00,00:00:00,05:00:00,0,08:00 PM,12:00:00,02:00:00,10:00:00
90,9/12/2018,02:00 PM,01:50:00,00:00:00,00:00:00,00:00:00,02:00:00,1,08:00 PM,06:00:00,02:10:00,03:50:00
91,10/12/2018,07:00 AM,03:50:00,00:00:00,02:30:00,00:00:00,05:00:00,0,08:00 PM,13:00:00,01:40:00,11:20:00
92,11/12/2018,02:00 PM,01:16:00,00:00:00,00:28:00,00:00:00,02:16:00,1,08:00 PM,06:00:00,02:00:00,04:00:00
93,12/12/2018,07:00 AM,06:09:00,00:00:00,03:17:00,00:00:00,02:55:00,0,08:00 PM,13:00:00,00:39:00,12:21:00
94,13/12/2018,02:00 PM,00:00:00,02:30:00,01:37:00,00:00:00,02:20:00,1,09:30 PM,07:30:00,01:03:00,06:27:00
95,14/12/2018,06:20 AM,10:01:00,00:00:00,02:02:00,00:00:00,03:20:00,0,10:46 PM,16:26:00,01:03:00,15:23:00
96,15/12/2018,06:29 AM,01:49:00,00:00:00,09:44:00,00:00:00,01:35:00,0,08:00 PM,13:31:00,00:23:00,13:08:00
97,16/12/2018,02:00 PM,00:00:00,00:00:00,03:15:00,00:00:00,01:50:00,1,09:30 PM,07:30:00,02:25:00,05:05:00
98,17/12/2018,07:30 AM,01:30:00,05:48:00,00:47:00,00:00:00,03:47:00,0,08:15 PM,12:45:00,00:53:00,11:52:00
99,18/12/2018,11:00 AM,00:00:00,04:12:00,02:06:00,00:00:00,02:04:00,1,08:00 PM,09:00:00,00:38:00,08:22:00
100,19/12/2018,07:15 AM,05:59:00,03:27:00,00:57:00,00:00:00,01:08:00,0,08:00 PM,12:45:00,01:14:00,11:31:00
101,20/12/2018,12:20 PM,01:32:00,02:16:00,00:00:00,00:00:00,02:11:00,1,09:00 PM,08:40:00,02:41:00,05:59:00
102,21/12/2018,07:33 AM,09:44:00,00:54:00,03:06:00,00:45:00,00:00:00,0,11:59 PM,16:26:00,01:57:00,14:29:00
103,22/12/2018,09:00 AM,02:50:00,00:10:00,01:15:00,00:00:00,01:48:00,0,09:00 PM,12:00:00,05:57:00,06:03:00
104,23/12/2018,01:00 PM,00:00:00,00:00:00,00:28:00,00:00:00,01:36:00,1,08:00 PM,07:00:00,04:56:00,02:04:00
105,24/12/2018,07:30 AM,00:00:00,04:20:00,00:55:00,00:00:00,02:17:00,0,09:30 PM,14:00:00,06:28:00,07:32:00
106,25/12/2018,10:10 AM,00:00:00,00:00:00,00:00:00,00:00:00,03:17:00,0,09:30 PM,11:20:00,08:03:00,03:17:00
107,26/12/2018,08:12 AM,00:00:00,00:00:00,06:10:00,00:10:00,04:58:00,0,09:30 PM,13:18:00,02:00:00,11:18:00
108,27/12/2018,08:27 AM,00:00:00,00:00:00,01:33:00,00:00:00,02:34:00,0,09:30 PM,13:03:00,08:56:00,04:07:00

11
bin/data/settings.conf Normal file
View File

@ -0,0 +1,11 @@
108
68
40
1038:16:00
397:09:00
641:07:00
172:09:00
88:41:00
253:26:00
123:36:00
03:15:00

11
bin/data/settings.info Normal file
View File

@ -0,0 +1,11 @@
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL

View File

@ -0,0 +1,3 @@
ps|x}
ps|x}
15

108
bin/data_backup/entries.dat Normal file
View File

@ -0,0 +1,108 @@
1,11/9/2018,01:15 PM,00:30:00,00:45:00,00:00:00,00:00:00,01:00:00,1,09:00 PM,07:45:00,05:30:00,02:15:00
2,12/9/2018,02:00 PM,00:33:00,02:00:00,00:00:00,00:00:00,00:38:00,1,08:00 PM,06:00:00,02:49:00,03:11:00
3,13/9/2018,02:00 PM,00:23:00,00:29:00,00:17:00,00:00:00,01:29:00,1,09:00 PM,07:00:00,04:22:00,02:38:00
4,14/9/2018,02:10 PM,00:35:00,00:00:00,01:46:00,00:00:00,02:00:00,1,09:00 PM,06:50:00,02:29:00,04:21:00
5,15/9/2018,06:00 AM,00:00:00,02:56:00,01:27:00,00:00:00,00:34:00,0,11:00 PM,17:00:00,12:03:00,04:57:00
6,16/9/2018,05:36 AM,02:45:00,01:47:00,01:33:00,00:00:00,00:35:00,0,09:45 PM,16:09:00,09:29:00,06:40:00
7,17/9/2018,07:35 AM,02:32:00,03:10:00,01:43:00,00:00:00,00:00:00,0,08:30 PM,12:55:00,05:30:00,07:25:00
8,18/9/2018,02:00 PM,01:26:00,02:25:00,00:00:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,03:09:00,03:51:00
9,19/9/2018,02:00 PM,01:09:00,00:24:00,04:00:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,01:27:00,05:33:00
10,20/9/2018,02:00 PM,01:16:00,01:24:00,01:54:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,02:26:00,04:34:00
11,21/9/2018,02:00 PM,01:43:00,02:25:00,00:42:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,02:10:00,04:50:00
12,22/9/2018,02:00 PM,00:00:00,01:47:00,00:00:00,00:00:00,00:00:00,1,09:50 PM,07:50:00,06:03:00,01:47:00
13,23/9/2018,05:00 AM,01:47:00,01:23:00,00:00:00,00:00:00,00:00:00,0,10:50 PM,17:50:00,14:40:00,03:10:00
14,24/9/2018,06:00 AM,00:08:00,06:21:00,00:25:00,00:00:00,00:00:00,0,10:00 PM,16:00:00,09:06:00,06:54:00
15,25/9/2018,06:30 AM,00:43:00,02:26:00,00:00:00,00:00:00,00:00:00,0,11:30 PM,17:00:00,13:51:00,03:09:00
16,26/9/2018,09:00 AM,02:05:00,02:15:00,00:00:00,00:00:00,00:00:00,0,09:00 PM,12:00:00,07:40:00,04:20:00
17,27/9/2018,02:00 PM,01:24:00,01:42:00,00:20:00,00:00:00,00:00:00,1,08:20 PM,06:20:00,02:54:00,03:26:00
18,28/9/2018,02:00 PM,00:50:00,02:47:00,00:00:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,02:53:00,03:37:00
19,29/9/2018,02:00 PM,00:30:00,01:02:00,01:41:00,00:00:00,00:00:00,1,09:40 PM,07:40:00,04:27:00,03:13:00
20,30/9/2018,09:00 AM,04:15:00,02:14:00,02:57:00,00:00:00,00:00:00,0,09:30 PM,12:30:00,03:04:00,09:26:00
21,1/10/2018,02:00 PM,01:04:00,00:00:00,02:55:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,03:31:00,03:59:00
22,2/10/2018,02:00 PM,01:08:00,00:00:00,03:03:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,03:19:00,04:11:00
23,3/10/2018,02:00 PM,00:51:00,01:24:00,00:00:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,05:15:00,02:15:00
24,4/10/2018,02:00 PM,01:14:00,01:06:00,02:00:00,00:20:00,00:15:00,1,09:30 PM,07:30:00,02:35:00,04:55:00
25,5/10/2018,02:00 PM,01:35:00,00:00:00,00:00:00,00:00:00,00:00:00,1,10:00 PM,08:00:00,06:25:00,01:35:00
26,6/10/2018,05:30 AM,01:11:00,00:00:00,00:00:00,00:00:00,04:21:00,0,09:45 PM,16:15:00,10:43:00,05:32:00
27,7/10/2018,06:30 AM,00:45:00,00:00:00,02:17:00,00:00:00,00:20:00,0,09:30 PM,15:00:00,11:38:00,03:22:00
28,8/10/2018,02:05 PM,01:14:00,00:00:00,00:00:00,00:00:00,01:10:00,1,09:00 PM,06:55:00,04:31:00,02:24:00
29,9/10/2018,02:00 PM,01:15:00,00:00:00,02:24:00,00:25:00,00:25:00,1,09:00 PM,07:00:00,02:31:00,04:29:00
30,10/10/2018,02:00 PM,01:15:00,00:00:00,00:35:00,00:00:00,01:45:00,1,09:00 PM,07:00:00,03:25:00,03:35:00
31,11/10/2018,02:00 PM,01:08:00,00:00:00,05:05:00,00:00:00,00:21:00,1,09:00 PM,07:00:00,00:26:00,06:34:00
32,12/10/2018,02:15 PM,00:00:00,00:00:00,03:20:00,00:00:00,03:00:00,1,11:20 PM,09:05:00,02:45:00,06:20:00
33,13/10/2018,07:00 AM,03:35:00,00:00:00,01:45:00,00:30:00,01:10:00,0,11:20 PM,16:20:00,09:20:00,07:00:00
34,14/10/2018,08:30 AM,00:30:00,00:00:00,03:46:00,00:20:00,04:15:00,0,08:30 PM,12:00:00,03:09:00,08:51:00
35,15/10/2018,02:00 PM,01:28:00,00:00:00,02:57:00,00:00:00,00:45:00,1,09:00 PM,07:00:00,01:50:00,05:10:00
36,16/10/2018,02:00 PM,01:16:00,00:10:00,03:23:00,00:00:00,00:30:00,1,08:30 PM,06:30:00,01:11:00,05:19:00
37,17/10/2018,02:00 PM,01:27:00,00:00:00,02:11:00,00:00:00,00:46:00,1,09:30 PM,07:30:00,03:06:00,04:24:00
38,18/10/2018,02:00 PM,01:28:00,00:00:00,02:39:00,00:00:00,00:46:00,1,08:30 PM,06:30:00,01:37:00,04:53:00
39,19/10/2018,02:00 PM,00:00:00,00:00:00,07:03:00,00:00:00,00:00:00,1,10:30 PM,08:30:00,01:27:00,07:03:00
40,20/10/2018,07:00 AM,01:24:00,00:00:00,11:30:00,00:00:00,02:15:00,0,11:59 PM,16:59:00,01:50:00,15:09:00
41,21/10/2018,06:55 AM,00:00:00,03:47:00,04:32:00,00:00:00,03:00:00,0,08:30 PM,13:35:00,02:16:00,11:19:00
42,22/10/2018,02:00 PM,02:03:00,04:00:00,00:00:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,00:27:00,06:03:00
43,23/10/2018,02:15 PM,00:52:00,00:00:00,03:38:00,00:00:00,00:00:00,1,08:55 PM,06:40:00,02:10:00,04:30:00
44,24/10/2018,02:00 PM,01:16:00,00:00:00,04:00:00,00:00:00,00:26:00,1,09:15 PM,07:15:00,01:33:00,05:42:00
45,25/10/2018,02:00 PM,01:32:00,00:00:00,05:00:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,00:58:00,06:32:00
46,26/10/2018,02:00 PM,00:00:00,00:00:00,05:00:00,00:00:00,01:18:00,1,09:15 PM,07:15:00,00:57:00,06:18:00
47,27/10/2018,05:50 AM,01:28:00,00:00:00,03:20:00,00:00:00,00:56:00,0,09:30 PM,15:40:00,09:56:00,05:44:00
48,28/10/2018,06:30 AM,02:10:00,00:00:00,09:06:00,00:00:00,01:59:00,0,08:30 PM,14:00:00,00:45:00,13:15:00
49,29/10/2018,02:10 PM,01:25:00,00:00:00,03:20:00,00:00:00,00:00:00,1,08:30 PM,06:20:00,01:35:00,04:45:00
50,30/10/2018,02:00 PM,01:26:00,00:00:00,03:27:00,00:00:00,00:44:00,1,08:30 PM,06:30:00,00:53:00,05:37:00
51,31/10/2018,02:00 PM,01:50:00,00:00:00,02:32:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,02:08:00,04:22:00
52,1/11/2018,02:00 PM,00:21:00,00:00:00,04:13:00,00:00:00,00:00:00,1,08:15 PM,06:15:00,01:41:00,04:34:00
53,2/11/2018,02:00 PM,00:38:00,00:00:00,04:30:00,00:00:00,01:16:00,1,10:00 PM,08:00:00,01:36:00,06:24:00
54,3/11/2018,06:18 AM,01:15:00,00:00:00,03:40:00,00:00:00,00:43:00,0,08:30 PM,14:12:00,08:34:00,05:38:00
55,4/11/2018,06:37 AM,01:50:00,00:00:00,02:15:00,00:00:00,04:20:00,0,08:30 PM,13:53:00,05:28:00,08:25:00
56,5/11/2018,02:00 PM,01:02:00,00:00:00,02:45:00,00:00:00,01:32:00,1,08:30 PM,06:30:00,01:11:00,05:19:00
57,6/11/2018,02:00 PM,00:43:00,00:00:00,03:00:00,00:00:00,01:58:00,1,08:30 PM,06:30:00,00:49:00,05:41:00
58,7/11/2018,02:00 PM,00:32:00,00:00:00,02:10:00,00:00:00,00:19:00,1,08:30 PM,06:30:00,03:29:00,03:01:00
59,8/11/2018,02:15 PM,02:49:00,00:00:00,01:39:00,00:00:00,00:00:00,1,08:30 PM,06:15:00,01:47:00,04:28:00
60,9/11/2018,02:00 PM,00:00:00,01:45:00,00:21:00,00:00:00,02:43:00,1,10:30 PM,08:30:00,03:41:00,04:49:00
61,10/11/2018,06:22 AM,04:31:00,01:46:00,01:50:00,00:45:00,02:34:00,0,10:00 PM,15:38:00,04:12:00,11:26:00
62,11/11/2018,06:00 AM,00:38:00,01:23:00,01:15:00,00:00:00,03:16:00,0,08:30 PM,14:30:00,07:58:00,06:32:00
63,12/11/2018,02:00 PM,00:47:00,00:00:00,04:25:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,01:18:00,05:12:00
64,13/11/2018,02:00 PM,01:52:00,00:00:00,02:07:00,00:00:00,00:00:00,1,08:30 PM,06:30:00,02:31:00,03:59:00
65,14/11/2018,02:00 PM,00:33:00,01:15:00,01:15:00,00:00:00,00:21:00,1,08:30 PM,06:30:00,03:06:00,03:24:00
66,15/11/2018,02:00 PM,01:00:00,00:00:00,02:30:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,04:00:00,03:30:00
67,16/11/2018,02:00 PM,00:00:00,00:00:00,02:50:00,00:00:00,00:00:00,1,09:30 PM,07:30:00,04:40:00,02:50:00
68,17/11/2018,08:27 AM,01:57:00,00:00:00,05:46:00,00:00:00,00:00:00,0,10:30 PM,14:03:00,06:20:00,07:43:00
69,18/11/2018,06:00 AM,00:00:00,00:00:00,08:15:00,00:00:00,01:45:00,0,08:00 PM,14:00:00,04:00:00,10:00:00
70,19/11/2018,02:00 PM,02:58:00,01:06:00,01:00:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,00:56:00,05:04:00
71,20/11/2018,02:00 PM,02:00:00,00:35:00,01:10:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,02:15:00,03:45:00
72,21/11/2018,02:00 PM,01:00:00,01:00:00,00:00:00,00:00:00,01:06:00,1,08:00 PM,06:00:00,02:54:00,03:06:00
73,22/11/2018,02:00 PM,01:22:00,01:45:00,01:08:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:45:00,04:15:00
74,23/11/2018,02:00 PM,00:00:00,00:00:00,01:38:00,00:00:00,03:32:00,1,08:00 PM,06:00:00,00:50:00,05:10:00
75,24/11/2018,06:00 AM,05:46:00,00:00:00,01:18:00,00:00:00,02:02:00,0,08:00 PM,14:00:00,04:54:00,09:06:00
76,25/11/2018,08:15 AM,03:42:00,00:00:00,00:32:00,00:00:00,05:00:00,0,08:00 PM,11:45:00,02:31:00,09:14:00
77,26/11/2018,02:00 PM,01:25:00,02:20:00,01:14:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:01:00,04:59:00
78,27/11/2018,02:00 PM,01:32:00,01:00:00,00:00:00,00:00:00,01:04:00,1,08:00 PM,06:00:00,02:24:00,03:36:00
79,28/11/2018,02:00 PM,02:30:00,00:30:00,01:50:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:10:00,04:50:00
80,29/11/2018,02:00 PM,00:45:00,00:30:00,00:30:00,00:00:00,01:26:00,1,08:00 PM,06:00:00,02:49:00,03:11:00
81,30/11/2018,02:15 PM,00:00:00,00:00:00,03:02:00,00:00:00,00:00:00,1,09:00 PM,06:45:00,03:43:00,03:02:00
82,1/12/2018,07:15 AM,03:00:00,00:00:00,02:55:00,00:00:00,00:00:00,0,09:00 PM,13:45:00,07:50:00,05:55:00
83,2/12/2018,08:40 AM,02:17:00,00:00:00,08:10:00,00:00:00,00:00:00,0,09:00 PM,12:20:00,01:53:00,10:27:00
84,3/12/2018,02:00 PM,01:15:00,00:00:00,03:00:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,01:45:00,04:15:00
85,4/12/2018,02:00 PM,01:30:00,00:00:00,01:30:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,03:00:00,03:00:00
86,5/12/2018,02:00 PM,05:00:00,00:00:00,01:00:00,00:00:00,00:00:00,1,08:00 PM,06:00:00,00:00:00,06:00:00
87,6/12/2018,02:00 PM,01:00:00,00:00:00,05:00:00,00:00:00,00:00:00,1,09:00 PM,07:00:00,01:00:00,06:00:00
88,7/12/2018,06:27 AM,00:45:00,00:00:00,04:00:00,00:00:00,00:00:00,0,10:00 PM,15:33:00,10:48:00,04:45:00
89,8/12/2018,08:00 AM,05:00:00,00:00:00,00:00:00,00:00:00,05:00:00,0,08:00 PM,12:00:00,02:00:00,10:00:00
90,9/12/2018,02:00 PM,01:50:00,00:00:00,00:00:00,00:00:00,02:00:00,1,08:00 PM,06:00:00,02:10:00,03:50:00
91,10/12/2018,07:00 AM,03:50:00,00:00:00,02:30:00,00:00:00,05:00:00,0,08:00 PM,13:00:00,01:40:00,11:20:00
92,11/12/2018,02:00 PM,01:16:00,00:00:00,00:28:00,00:00:00,02:16:00,1,08:00 PM,06:00:00,02:00:00,04:00:00
93,12/12/2018,07:00 AM,06:09:00,00:00:00,03:17:00,00:00:00,02:55:00,0,08:00 PM,13:00:00,00:39:00,12:21:00
94,13/12/2018,02:00 PM,00:00:00,02:30:00,01:37:00,00:00:00,02:20:00,1,09:30 PM,07:30:00,01:03:00,06:27:00
95,14/12/2018,06:20 AM,10:01:00,00:00:00,02:02:00,00:00:00,03:20:00,0,10:46 PM,16:26:00,01:03:00,15:23:00
96,15/12/2018,06:29 AM,01:49:00,00:00:00,09:44:00,00:00:00,01:35:00,0,08:00 PM,13:31:00,00:23:00,13:08:00
97,16/12/2018,02:00 PM,00:00:00,00:00:00,03:15:00,00:00:00,01:50:00,1,09:30 PM,07:30:00,02:25:00,05:05:00
98,17/12/2018,07:30 AM,01:30:00,05:48:00,00:47:00,00:00:00,03:47:00,0,08:15 PM,12:45:00,00:53:00,11:52:00
99,18/12/2018,11:00 AM,00:00:00,04:12:00,02:06:00,00:00:00,02:04:00,1,08:00 PM,09:00:00,00:38:00,08:22:00
100,19/12/2018,07:15 AM,05:59:00,03:27:00,00:57:00,00:00:00,01:08:00,0,08:00 PM,12:45:00,01:14:00,11:31:00
101,20/12/2018,12:20 PM,01:32:00,02:16:00,00:00:00,00:00:00,02:11:00,1,09:00 PM,08:40:00,02:41:00,05:59:00
102,21/12/2018,07:33 AM,09:44:00,00:54:00,03:06:00,00:45:00,00:00:00,0,11:59 PM,16:26:00,01:57:00,14:29:00
103,22/12/2018,09:00 AM,02:50:00,00:10:00,01:15:00,00:00:00,01:48:00,0,09:00 PM,12:00:00,05:57:00,06:03:00
104,23/12/2018,01:00 PM,00:00:00,00:00:00,00:28:00,00:00:00,01:36:00,1,08:00 PM,07:00:00,04:56:00,02:04:00
105,24/12/2018,07:30 AM,00:00:00,04:20:00,00:55:00,00:00:00,02:17:00,0,09:30 PM,14:00:00,06:28:00,07:32:00
106,25/12/2018,10:10 AM,00:00:00,00:00:00,00:00:00,00:00:00,03:17:00,0,09:30 PM,11:20:00,08:03:00,03:17:00
107,26/12/2018,08:12 AM,00:00:00,00:00:00,06:10:00,00:10:00,04:58:00,0,09:30 PM,13:18:00,02:00:00,11:18:00
108,27/12/2018,08:27 AM,00:00:00,00:00:00,01:33:00,00:00:00,02:34:00,0,09:30 PM,13:03:00,08:56:00,04:07:00

View File

@ -0,0 +1,11 @@
108
68
40
1038:16:00
397:09:00
641:07:00
172:09:00
88:41:00
253:26:00
123:36:00
03:15:00

3
data/cred.info Normal file
View File

@ -0,0 +1,3 @@
sv{€
sv{€
18

1
data/entries.dat Normal file
View File

@ -0,0 +1 @@
NULL

11
data/settings.info Normal file
View File

@ -0,0 +1,11 @@
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL

108
testing/entries.csv Normal file
View File

@ -0,0 +1,108 @@
1,11/9/2018,1:15 PM,0:30:00,0:45:00,0:00:00,0:00:00,1:00:00,1,9:00 PM,7:45:00,5:30:00,2:15:00
2,12/9/2018,2:00 PM,0:33:00,2:00:00,0:00:00,0:00:00,0:38:00,1,8:00 PM,6:00:00,2:49:00,3:11:00
3,13/09/2018,2:00 PM,0:23:00,0:29:00,0:17:00,0:00:00,1:29:00,1,9:00 PM,7:00:00,4:22:00,2:38:00
4,14/09/2018,2:10 PM,0:35:00,0:00:00,1:46:00,0:00:00,2:00:00,1,9:00 PM,6:50:00,2:29:00,4:21:00
5,15/09/2018,6:00 AM,0:00:00,2:56:00,1:27:00,0:00:00,0:34:00,,11:00 PM,17:00:00,12:03:00,4:57:00
6,16/09/2018,5:36 AM,2:45:00,1:47:00,1:33:00,0:00:00,0:35:00,,9:45 PM,16:09:00,9:29:00,6:40:00
7,17/09/2018,7:35 AM,2:32:00,3:10:00,1:43:00,0:00:00,0:00:00,,8:30 PM,12:55:00,5:30:00,7:25:00
8,18/09/2018,2:00 PM,1:26:00,2:25:00,0:00:00,0:00:00,0:00:00,1,9:00 PM,7:00:00,3:09:00,3:51:00
9,19/09/2018,2:00 PM,1:09:00,0:24:00,4:00:00,0:00:00,0:00:00,1,9:00 PM,7:00:00,1:27:00,5:33:00
10,20/09/2018,2:00 PM,1:16:00,1:24:00,1:54:00,0:00:00,0:00:00,1,9:00 PM,7:00:00,2:26:00,4:34:00
11,21/09/2018,2:00 PM,1:43:00,2:25:00,0:42:00,0:00:00,0:00:00,1,9:00 PM,7:00:00,2:10:00,4:50:00
12,22/09/2018,2:00 PM,0:00:00,1:47:00,0:00:00,0:00:00,0:00:00,1,9:50 PM,7:50:00,6:03:00,1:47:00
13,23/09/2018,5:00 AM,1:47:00,1:23:00,0:00:00,0:00:00,0:00:00,0,10:50 PM,17:50:00,14:40:00,3:10:00
14,24/09/2018,6:00 AM,0:08:00,6:21:00,0:25:00,0:00:00,0:00:00,0,10:00 PM,16:00:00,9:06:00,6:54:00
15,25/09/2018,6:30 AM,0:43:00,2:26:00,0:00:00,0:00:00,0:00:00,0,11:30 PM,17:00:00,13:51:00,3:09:00
16,26/09/2018,9:00 AM,2:05:00,2:15:00,0:00:00,0:00:00,0:00:00,0,9:00 PM,12:00:00,7:40:00,4:20:00
17,27/09/2018,2:00 PM,1:24:00,1:42:00,0:20:00,0:00:00,0:00:00,1,8:20 PM,6:20:00,2:54:00,3:26:00
18,28/09/2018,2:00 PM,0:50:00,2:47:00,0:00:00,0:00:00,0:00:00,1,8:30 PM,6:30:00,2:53:00,3:37:00
19,29/09/2018,2:00 PM,0:30:00,1:02:00,1:41:00,0:00:00,0:00:00,1,9:40 PM,7:40:00,4:27:00,3:13:00
20,30/09/2018,9:00 AM,4:15:00,2:14:00,2:57:00,0:00:00,0:00:00,0,9:30 PM,12:30:00,3:04:00,9:26:00
21,1/10/2018,2:00 PM,1:04:00,0:00:00,2:55:00,0:00:00,0:00:00,1,9:30 PM,7:30:00,3:31:00,3:59:00
22,2/10/2018,2:00 PM,1:08:00,0:00:00,3:03:00,0:00:00,0:00:00,1,9:30 PM,7:30:00,3:19:00,4:11:00
23,3/10/2018,2:00 PM,0:51:00,1:24:00,0:00:00,0:00:00,0:00:00,1,9:30 PM,7:30:00,5:15:00,2:15:00
24,4/10/2018,2:00 PM,1:14:00,1:06:00,2:00:00,0:20:00,0:15:00,1,9:30 PM,7:30:00,2:35:00,4:55:00
25,5/10/2018,2:00 PM,1:35:00,0:00:00,0:00:00,0:00:00,0:00:00,1,10:00 PM,8:00:00,6:25:00,1:35:00
26,6/10/2018,5:30 AM,1:11:00,0:00:00,0:00:00,0:00:00,4:21:00,0,9:45 PM,16:15:00,10:43:00,5:32:00
27,7/10/2018,6:30 AM,0:45:00,0:00:00,2:17:00,0:00:00,0:20:00,0,9:30 PM,15:00:00,11:38:00,3:22:00
28,8/10/2018,2:05 PM,1:14:00,0:00:00,0:00:00,0:00:00,1:10:00,1,9:00 PM,6:55:00,4:31:00,2:24:00
29,9/10/2018,2:00 PM,1:15:00,0:00:00,2:24:00,0:25:00,0:25:00,1,9:00 PM,7:00:00,2:31:00,4:29:00
30,10/10/2018,2:00 PM,1:15:00,0:00:00,0:35:00,0:00:00,1:45:00,1,9:00 PM,7:00:00,3:25:00,3:35:00
31,11/10/2018,2:00 PM,1:08:00,0:00:00,5:05:00,0:00:00,0:21:00,1,9:00 PM,7:00:00,0:26:00,6:34:00
32,12/10/2018,2:15 PM,0:00:00,0:00:00,3:20:00,0:00:00,3:00:00,1,11:20 PM,9:05:00,2:45:00,6:20:00
33,13/10/2018,7:00 AM,3:35:00,0:00:00,1:45:00,0:30:00,1:10:00,0,11:20 PM,16:20:00,9:20:00,7:00:00
34,14/10/2018,8:30 AM,0:30:00,0:00:00,3:46:00,0:20:00,4:15:00,0,8:30 PM,12:00:00,3:09:00,8:51:00
35,15/10/2018,2:00 PM,1:28:00,0:00:00,2:57:00,0:00:00,0:45:00,1,9:00 PM,7:00:00,1:50:00,5:10:00
36,16/10/2018,2:00 PM,1:16:00,0:10:00,3:23:00,0:00:00,0:30:00,1,8:30 PM,6:30:00,1:11:00,5:19:00
37,17/10/2018,2:00 PM,1:27:00,0:00:00,2:11:00,0:00:00,0:46:00,1,9:30 PM,7:30:00,3:06:00,4:24:00
38,18/10/2018,2:00 PM,1:28:00,0:00:00,2:39:00,0:00:00,0:46:00,1,8:30 PM,6:30:00,1:37:00,4:53:00
39,19/10/2018,2:00 PM,0:00:00,0:00:00,7:03:00,0:00:00,0:00:00,1,10:30 PM,8:30:00,1:27:00,7:03:00
40,20/10/2018,7:00 AM,1:24:00,0:00:00,11:30:00,0:00:00,2:15:00,0,11:59 PM,16:59:00,1:50:00,15:09:00
41,21/10/2018,6:55 AM,0:00:00,3:47:00,4:32:00,0:00:00,3:00:00,0,8:30 PM,13:35:00,2:16:00,11:19:00
42,22/10/2018,2:00 PM,2:03:00,4:00:00,0:00:00,0:00:00,0:00:00,1,8:30 PM,6:30:00,0:27:00,6:03:00
43,23/10/2018,2:15 PM,0:52:00,0:00:00,3:38:00,0:00:00,0:00:00,1,8:55 PM,6:40:00,2:10:00,4:30:00
44,24/10/2018,2:00 PM,1:16:00,0:00:00,4:00:00,0:00:00,0:26:00,1,9:15 PM,7:15:00,1:33:00,5:42:00
45,25/10/2018,2:00 PM,1:32:00,0:00:00,5:00:00,0:00:00,0:00:00,1,9:30 PM,7:30:00,0:58:00,6:32:00
46,26/10/2018,2:00 PM,0:00:00,0:00:00,5:00:00,0:00:00,1:18:00,1,9:15 PM,7:15:00,0:57:00,6:18:00
47,27/10/2018,5:50 AM,1:28:00,0:00:00,3:20:00,0:00:00,0:56:00,0,9:30 PM,15:40:00,9:56:00,5:44:00
48,28/10/2018,6:30 AM,2:10:00,0:00:00,9:06:00,0:00:00,1:59:00,0,8:30 PM,14:00:00,0:45:00,13:15:00
49,29/10/2018,2:10 PM,1:25:00,0:00:00,3:20:00,0:00:00,0:00:00,1,8:30 PM,6:20:00,1:35:00,4:45:00
50,30/10/2018,2:00 PM,1:26:00,0:00:00,3:27:00,0:00:00,0:44:00,1,8:30 PM,6:30:00,0:53:00,5:37:00
51,31/10/2018,2:00 PM,1:50:00,0:00:00,2:32:00,0:00:00,0:00:00,1,8:30 PM,6:30:00,2:08:00,4:22:00
52,1/11/2018,2:00 PM,0:21:00,0:00:00,4:13:00,0:00:00,0:00:00,1,8:15 PM,6:15:00,1:41:00,4:34:00
53,2/11/2018,2:00 PM,0:38:00,0:00:00,4:30:00,0:00:00,1:16:00,1,10:00 PM,8:00:00,1:36:00,6:24:00
54,3/11/2018,6:18 AM,1:15:00,0:00:00,3:40:00,0:00:00,0:43:00,0,8:30 PM,14:12:00,8:34:00,5:38:00
55,4/11/2018,6:37 AM,1:50:00,0:00:00,2:15:00,0:00:00,4:20:00,0,8:30 PM,13:53:00,5:28:00,8:25:00
56,5/11/2018,2:00 PM,1:02:00,0:00:00,2:45:00,0:00:00,1:32:00,1,8:30 PM,6:30:00,1:11:00,5:19:00
57,6/11/2018,2:00 PM,0:43:00,0:00:00,3:00:00,0:00:00,1:58:00,1,8:30 PM,6:30:00,0:49:00,5:41:00
58,7/11/2018,2:00 PM,0:32:00,0:00:00,2:10:00,0:00:00,0:19:00,1,8:30 PM,6:30:00,3:29:00,3:01:00
59,8/11/2018,2:15 PM,2:49:00,0:00:00,1:39:00,0:00:00,0:00:00,1,8:30 PM,6:15:00,1:47:00,4:28:00
60,9/11/2018,2:00 PM,0:00:00,1:45:00,0:21:00,0:00:00,2:43:00,1,10:30 PM,8:30:00,3:41:00,4:49:00
61,10/11/2018,6:22 AM,4:31:00,1:46:00,1:50:00,0:45:00,2:34:00,0,10:00 PM,15:38:00,4:12:00,11:26:00
62,11/11/2018,6:00 AM,0:38:00,1:23:00,1:15:00,0:00:00,3:16:00,0,8:30 PM,14:30:00,7:58:00,6:32:00
63,12/11/2018,2:00 PM,0:47:00,0:00:00,4:25:00,0:00:00,0:00:00,1,8:30 PM,6:30:00,1:18:00,5:12:00
64,13/11/2018,2:00 PM,1:52:00,0:00:00,2:07:00,0:00:00,0:00:00,1,8:30 PM,6:30:00,2:31:00,3:59:00
65,14/11/2018,2:00 PM,0:33:00,1:15:00,1:15:00,0:00:00,0:21:00,1,8:30 PM,6:30:00,3:06:00,3:24:00
66,15/11/2018,2:00 PM,1:00:00,0:00:00,2:30:00,0:00:00,0:00:00,1,9:30 PM,7:30:00,4:00:00,3:30:00
67,16/11/2018,2:00 PM,0:00:00,0:00:00,2:50:00,0:00:00,0:00:00,1,9:30 PM,7:30:00,4:40:00,2:50:00
68,17/11/2018,8:27 AM,1:57:00,0:00:00,5:46:00,0:00:00,0:00:00,0,10:30 PM,14:03:00,6:20:00,7:43:00
69,18/11/2018,6:00 AM,0:00:00,0:00:00,8:15:00,0:00:00,1:45:00,0,8:00 PM,14:00:00,4:00:00,10:00:00
70,19/11/2018,2:00 PM,2:58:00,1:06:00,1:00:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,0:56:00,5:04:00
71,20/11/2018,2:00 PM,2:00:00,0:35:00,1:10:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,2:15:00,3:45:00
72,21/11/2018,2:00 PM,1:00:00,1:00:00,0:00:00,0:00:00,1:06:00,1,8:00 PM,6:00:00,2:54:00,3:06:00
73,22/11/2018,2:00 PM,1:22:00,1:45:00,1:08:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,1:45:00,4:15:00
74,23/11/2018,2:00 PM,0:00:00,0:00:00,1:38:00,0:00:00,3:32:00,1,8:00 PM,6:00:00,0:50:00,5:10:00
75,24/11/2018,6:00 AM,5:46:00,0:00:00,1:18:00,0:00:00,2:02:00,0,8:00 PM,14:00:00,4:54:00,9:06:00
76,25/11/2018,8:15 AM,3:42:00,0:00:00,0:32:00,0:00:00,5:00:00,0,8:00 PM,11:45:00,2:31:00,9:14:00
77,26/11/2018,2:00 PM,1:25:00,2:20:00,1:14:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,1:01:00,4:59:00
78,27/11/2018,2:00 PM,1:32:00,1:00:00,0:00:00,0:00:00,1:04:00,1,8:00 PM,6:00:00,2:24:00,3:36:00
79,28/11/2018,2:00 PM,2:30:00,0:30:00,1:50:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,1:10:00,4:50:00
80,29/11/2018,2:00 PM,0:45:00,0:30:00,0:30:00,0:00:00,1:26:00,1,8:00 PM,6:00:00,2:49:00,3:11:00
81,30/11/2018,2:15 PM,0:00:00,0:00:00,3:02:00,0:00:00,0:00:00,1,9:00 PM,6:45:00,3:43:00,3:02:00
82,1/12/2018,7:15 AM,3:00:00,0:00:00,2:55:00,0:00:00,0:00:00,0,9:00 PM,13:45:00,7:50:00,5:55:00
83,2/12/2018,8:40 AM,2:17:00,0:00:00,8:10:00,0:00:00,0:00:00,0,9:00 PM,12:20:00,1:53:00,10:27:00
84,3/12/2018,2:00 PM,1:15:00,0:00:00,3:00:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,1:45:00,4:15:00
85,4/12/2018,2:00 PM,1:30:00,0:00:00,1:30:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,3:00:00,3:00:00
86,5/12/2018,2:00 PM,5:00:00,0:00:00,1:00:00,0:00:00,0:00:00,1,8:00 PM,6:00:00,0:00:00,6:00:00
87,6/12/2018,2:00 PM,1:00:00,0:00:00,5:00:00,0:00:00,0:00:00,1,9:00 PM,7:00:00,1:00:00,6:00:00
88,7/12/2018,6:27 AM,0:45:00,0:00:00,4:00:00,0:00:00,0:00:00,0,10:00 PM,15:33:00,10:48:00,4:45:00
89,8/12/2018,8:00 AM,5:00:00,0:00:00,0:00:00,0:00:00,5:00:00,0,8:00 PM,12:00:00,2:00:00,10:00:00
90,9/12/2018,2:00 PM,1:50:00,0:00:00,0:00:00,0:00:00,2:00:00,1,8:00 PM,6:00:00,2:10:00,3:50:00
91,10/12/2018,7:00 AM,3:50:00,0:00:00,2:30:00,0:00:00,5:00:00,0,8:00 PM,13:00:00,1:40:00,11:20:00
92,11/12/2018,2:00 PM,1:16:00,0:00:00,0:28:00,0:00:00,2:16:00,1,8:00 PM,6:00:00,2:00:00,4:00:00
93,12/12/2018,7:00 AM,6:09:00,0:00:00,3:17:00,0:00:00,2:55:00,0,8:00 PM,13:00:00,0:39:00,12:21:00
94,13/12/2018,2:00 PM,0:00:00,2:30:00,1:37:00,0:00:00,2:20:00,1,9:30 PM,7:30:00,1:03:00,6:27:00
95,14/12/2018,6:20 AM,10:01:00,0:00:00,2:02:00,0:00:00,3:20:00,0,10:46 PM,16:26:00,1:03:00,15:23:00
96,15/12/2018,6:29 AM,1:49:00,0:00:00,9:44:00,0:00:00,1:35:00,0,8:00 PM,13:31:00,0:23:00,13:08:00
97,16/12/2018,2:00 PM,0:00:00,0:00:00,3:15:00,0:00:00,1:50:00,1,9:30 PM,7:30:00,2:25:00,5:05:00
98,17/12/2018,7:30 AM,1:30:00,5:48:00,0:47:00,0:00:00,3:47:00,0,8:15 PM,12:45:00,0:53:00,11:52:00
99,18/12/2018,11:00 AM,0:00:00,4:12:00,2:06:00,0:00:00,2:04:00,1,8:00 PM,9:00:00,0:38:00,8:22:00
100,19/12/2018,7:15 AM,5:59:00,3:27:00,0:57:00,0:00:00,1:08:00,0,8:00 PM,12:45:00,1:14:00,11:31:00
101,20/12/2018,12:20 PM,1:32:00,2:16:00,0:00:00,0:00:00,2:11:00,1,9:00 PM,8:40:00,2:41:00,5:59:00
102,21/12/2018,7:33 AM,9:44:00,0:54:00,3:06:00,0:45:00,0:00:00,0,11:59 PM,16:26:00,1:57:00,14:29:00
103,22/12/2018,9:00 AM,2:50:00,0:10:00,1:15:00,0:00:00,1:48:00,0,9:00 PM,12:00:00,5:57:00,6:03:00
104,23/12/2018,1:00 PM,0:00:00,0:00:00,0:28:00,0:00:00,1:36:00,1,8:00 PM,7:00:00,4:56:00,2:04:00
105,24/12/2018,7:30 AM,0:00:00,4:20:00,0:55:00,0:00:00,2:17:00,0,9:30 PM,14:00:00,6:28:00,7:32:00
106,25/12/2018,10:10 AM,0:00:00,0:00:00,0:00:00,0:00:00,3:17:00,0,9:30 PM,11:20:00,8:03:00,3:17:00
107,26/12/2018,8:12 AM,0:00:00,0:00:00,6:10:00,0:10:00,4:58:00,0,9:30 PM,13:18:00,2:00:00,11:18:00
108,27/12/2018,8:27 AM,0:00:00,0:00:00,1:33:00,0:00:00,2:34:00,0,9:30 PM,13:03:00,8:56:00,4:07:00
1 1 11/9/2018 1:15 PM 0:30:00 0:45:00 0:00:00 0:00:00 1:00:00 1 9:00 PM 7:45:00 5:30:00 2:15:00
2 2 12/9/2018 2:00 PM 0:33:00 2:00:00 0:00:00 0:00:00 0:38:00 1 8:00 PM 6:00:00 2:49:00 3:11:00
3 3 13/09/2018 2:00 PM 0:23:00 0:29:00 0:17:00 0:00:00 1:29:00 1 9:00 PM 7:00:00 4:22:00 2:38:00
4 4 14/09/2018 2:10 PM 0:35:00 0:00:00 1:46:00 0:00:00 2:00:00 1 9:00 PM 6:50:00 2:29:00 4:21:00
5 5 15/09/2018 6:00 AM 0:00:00 2:56:00 1:27:00 0:00:00 0:34:00 11:00 PM 17:00:00 12:03:00 4:57:00
6 6 16/09/2018 5:36 AM 2:45:00 1:47:00 1:33:00 0:00:00 0:35:00 9:45 PM 16:09:00 9:29:00 6:40:00
7 7 17/09/2018 7:35 AM 2:32:00 3:10:00 1:43:00 0:00:00 0:00:00 8:30 PM 12:55:00 5:30:00 7:25:00
8 8 18/09/2018 2:00 PM 1:26:00 2:25:00 0:00:00 0:00:00 0:00:00 1 9:00 PM 7:00:00 3:09:00 3:51:00
9 9 19/09/2018 2:00 PM 1:09:00 0:24:00 4:00:00 0:00:00 0:00:00 1 9:00 PM 7:00:00 1:27:00 5:33:00
10 10 20/09/2018 2:00 PM 1:16:00 1:24:00 1:54:00 0:00:00 0:00:00 1 9:00 PM 7:00:00 2:26:00 4:34:00
11 11 21/09/2018 2:00 PM 1:43:00 2:25:00 0:42:00 0:00:00 0:00:00 1 9:00 PM 7:00:00 2:10:00 4:50:00
12 12 22/09/2018 2:00 PM 0:00:00 1:47:00 0:00:00 0:00:00 0:00:00 1 9:50 PM 7:50:00 6:03:00 1:47:00
13 13 23/09/2018 5:00 AM 1:47:00 1:23:00 0:00:00 0:00:00 0:00:00 0 10:50 PM 17:50:00 14:40:00 3:10:00
14 14 24/09/2018 6:00 AM 0:08:00 6:21:00 0:25:00 0:00:00 0:00:00 0 10:00 PM 16:00:00 9:06:00 6:54:00
15 15 25/09/2018 6:30 AM 0:43:00 2:26:00 0:00:00 0:00:00 0:00:00 0 11:30 PM 17:00:00 13:51:00 3:09:00
16 16 26/09/2018 9:00 AM 2:05:00 2:15:00 0:00:00 0:00:00 0:00:00 0 9:00 PM 12:00:00 7:40:00 4:20:00
17 17 27/09/2018 2:00 PM 1:24:00 1:42:00 0:20:00 0:00:00 0:00:00 1 8:20 PM 6:20:00 2:54:00 3:26:00
18 18 28/09/2018 2:00 PM 0:50:00 2:47:00 0:00:00 0:00:00 0:00:00 1 8:30 PM 6:30:00 2:53:00 3:37:00
19 19 29/09/2018 2:00 PM 0:30:00 1:02:00 1:41:00 0:00:00 0:00:00 1 9:40 PM 7:40:00 4:27:00 3:13:00
20 20 30/09/2018 9:00 AM 4:15:00 2:14:00 2:57:00 0:00:00 0:00:00 0 9:30 PM 12:30:00 3:04:00 9:26:00
21 21 1/10/2018 2:00 PM 1:04:00 0:00:00 2:55:00 0:00:00 0:00:00 1 9:30 PM 7:30:00 3:31:00 3:59:00
22 22 2/10/2018 2:00 PM 1:08:00 0:00:00 3:03:00 0:00:00 0:00:00 1 9:30 PM 7:30:00 3:19:00 4:11:00
23 23 3/10/2018 2:00 PM 0:51:00 1:24:00 0:00:00 0:00:00 0:00:00 1 9:30 PM 7:30:00 5:15:00 2:15:00
24 24 4/10/2018 2:00 PM 1:14:00 1:06:00 2:00:00 0:20:00 0:15:00 1 9:30 PM 7:30:00 2:35:00 4:55:00
25 25 5/10/2018 2:00 PM 1:35:00 0:00:00 0:00:00 0:00:00 0:00:00 1 10:00 PM 8:00:00 6:25:00 1:35:00
26 26 6/10/2018 5:30 AM 1:11:00 0:00:00 0:00:00 0:00:00 4:21:00 0 9:45 PM 16:15:00 10:43:00 5:32:00
27 27 7/10/2018 6:30 AM 0:45:00 0:00:00 2:17:00 0:00:00 0:20:00 0 9:30 PM 15:00:00 11:38:00 3:22:00
28 28 8/10/2018 2:05 PM 1:14:00 0:00:00 0:00:00 0:00:00 1:10:00 1 9:00 PM 6:55:00 4:31:00 2:24:00
29 29 9/10/2018 2:00 PM 1:15:00 0:00:00 2:24:00 0:25:00 0:25:00 1 9:00 PM 7:00:00 2:31:00 4:29:00
30 30 10/10/2018 2:00 PM 1:15:00 0:00:00 0:35:00 0:00:00 1:45:00 1 9:00 PM 7:00:00 3:25:00 3:35:00
31 31 11/10/2018 2:00 PM 1:08:00 0:00:00 5:05:00 0:00:00 0:21:00 1 9:00 PM 7:00:00 0:26:00 6:34:00
32 32 12/10/2018 2:15 PM 0:00:00 0:00:00 3:20:00 0:00:00 3:00:00 1 11:20 PM 9:05:00 2:45:00 6:20:00
33 33 13/10/2018 7:00 AM 3:35:00 0:00:00 1:45:00 0:30:00 1:10:00 0 11:20 PM 16:20:00 9:20:00 7:00:00
34 34 14/10/2018 8:30 AM 0:30:00 0:00:00 3:46:00 0:20:00 4:15:00 0 8:30 PM 12:00:00 3:09:00 8:51:00
35 35 15/10/2018 2:00 PM 1:28:00 0:00:00 2:57:00 0:00:00 0:45:00 1 9:00 PM 7:00:00 1:50:00 5:10:00
36 36 16/10/2018 2:00 PM 1:16:00 0:10:00 3:23:00 0:00:00 0:30:00 1 8:30 PM 6:30:00 1:11:00 5:19:00
37 37 17/10/2018 2:00 PM 1:27:00 0:00:00 2:11:00 0:00:00 0:46:00 1 9:30 PM 7:30:00 3:06:00 4:24:00
38 38 18/10/2018 2:00 PM 1:28:00 0:00:00 2:39:00 0:00:00 0:46:00 1 8:30 PM 6:30:00 1:37:00 4:53:00
39 39 19/10/2018 2:00 PM 0:00:00 0:00:00 7:03:00 0:00:00 0:00:00 1 10:30 PM 8:30:00 1:27:00 7:03:00
40 40 20/10/2018 7:00 AM 1:24:00 0:00:00 11:30:00 0:00:00 2:15:00 0 11:59 PM 16:59:00 1:50:00 15:09:00
41 41 21/10/2018 6:55 AM 0:00:00 3:47:00 4:32:00 0:00:00 3:00:00 0 8:30 PM 13:35:00 2:16:00 11:19:00
42 42 22/10/2018 2:00 PM 2:03:00 4:00:00 0:00:00 0:00:00 0:00:00 1 8:30 PM 6:30:00 0:27:00 6:03:00
43 43 23/10/2018 2:15 PM 0:52:00 0:00:00 3:38:00 0:00:00 0:00:00 1 8:55 PM 6:40:00 2:10:00 4:30:00
44 44 24/10/2018 2:00 PM 1:16:00 0:00:00 4:00:00 0:00:00 0:26:00 1 9:15 PM 7:15:00 1:33:00 5:42:00
45 45 25/10/2018 2:00 PM 1:32:00 0:00:00 5:00:00 0:00:00 0:00:00 1 9:30 PM 7:30:00 0:58:00 6:32:00
46 46 26/10/2018 2:00 PM 0:00:00 0:00:00 5:00:00 0:00:00 1:18:00 1 9:15 PM 7:15:00 0:57:00 6:18:00
47 47 27/10/2018 5:50 AM 1:28:00 0:00:00 3:20:00 0:00:00 0:56:00 0 9:30 PM 15:40:00 9:56:00 5:44:00
48 48 28/10/2018 6:30 AM 2:10:00 0:00:00 9:06:00 0:00:00 1:59:00 0 8:30 PM 14:00:00 0:45:00 13:15:00
49 49 29/10/2018 2:10 PM 1:25:00 0:00:00 3:20:00 0:00:00 0:00:00 1 8:30 PM 6:20:00 1:35:00 4:45:00
50 50 30/10/2018 2:00 PM 1:26:00 0:00:00 3:27:00 0:00:00 0:44:00 1 8:30 PM 6:30:00 0:53:00 5:37:00
51 51 31/10/2018 2:00 PM 1:50:00 0:00:00 2:32:00 0:00:00 0:00:00 1 8:30 PM 6:30:00 2:08:00 4:22:00
52 52 1/11/2018 2:00 PM 0:21:00 0:00:00 4:13:00 0:00:00 0:00:00 1 8:15 PM 6:15:00 1:41:00 4:34:00
53 53 2/11/2018 2:00 PM 0:38:00 0:00:00 4:30:00 0:00:00 1:16:00 1 10:00 PM 8:00:00 1:36:00 6:24:00
54 54 3/11/2018 6:18 AM 1:15:00 0:00:00 3:40:00 0:00:00 0:43:00 0 8:30 PM 14:12:00 8:34:00 5:38:00
55 55 4/11/2018 6:37 AM 1:50:00 0:00:00 2:15:00 0:00:00 4:20:00 0 8:30 PM 13:53:00 5:28:00 8:25:00
56 56 5/11/2018 2:00 PM 1:02:00 0:00:00 2:45:00 0:00:00 1:32:00 1 8:30 PM 6:30:00 1:11:00 5:19:00
57 57 6/11/2018 2:00 PM 0:43:00 0:00:00 3:00:00 0:00:00 1:58:00 1 8:30 PM 6:30:00 0:49:00 5:41:00
58 58 7/11/2018 2:00 PM 0:32:00 0:00:00 2:10:00 0:00:00 0:19:00 1 8:30 PM 6:30:00 3:29:00 3:01:00
59 59 8/11/2018 2:15 PM 2:49:00 0:00:00 1:39:00 0:00:00 0:00:00 1 8:30 PM 6:15:00 1:47:00 4:28:00
60 60 9/11/2018 2:00 PM 0:00:00 1:45:00 0:21:00 0:00:00 2:43:00 1 10:30 PM 8:30:00 3:41:00 4:49:00
61 61 10/11/2018 6:22 AM 4:31:00 1:46:00 1:50:00 0:45:00 2:34:00 0 10:00 PM 15:38:00 4:12:00 11:26:00
62 62 11/11/2018 6:00 AM 0:38:00 1:23:00 1:15:00 0:00:00 3:16:00 0 8:30 PM 14:30:00 7:58:00 6:32:00
63 63 12/11/2018 2:00 PM 0:47:00 0:00:00 4:25:00 0:00:00 0:00:00 1 8:30 PM 6:30:00 1:18:00 5:12:00
64 64 13/11/2018 2:00 PM 1:52:00 0:00:00 2:07:00 0:00:00 0:00:00 1 8:30 PM 6:30:00 2:31:00 3:59:00
65 65 14/11/2018 2:00 PM 0:33:00 1:15:00 1:15:00 0:00:00 0:21:00 1 8:30 PM 6:30:00 3:06:00 3:24:00
66 66 15/11/2018 2:00 PM 1:00:00 0:00:00 2:30:00 0:00:00 0:00:00 1 9:30 PM 7:30:00 4:00:00 3:30:00
67 67 16/11/2018 2:00 PM 0:00:00 0:00:00 2:50:00 0:00:00 0:00:00 1 9:30 PM 7:30:00 4:40:00 2:50:00
68 68 17/11/2018 8:27 AM 1:57:00 0:00:00 5:46:00 0:00:00 0:00:00 0 10:30 PM 14:03:00 6:20:00 7:43:00
69 69 18/11/2018 6:00 AM 0:00:00 0:00:00 8:15:00 0:00:00 1:45:00 0 8:00 PM 14:00:00 4:00:00 10:00:00
70 70 19/11/2018 2:00 PM 2:58:00 1:06:00 1:00:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 0:56:00 5:04:00
71 71 20/11/2018 2:00 PM 2:00:00 0:35:00 1:10:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 2:15:00 3:45:00
72 72 21/11/2018 2:00 PM 1:00:00 1:00:00 0:00:00 0:00:00 1:06:00 1 8:00 PM 6:00:00 2:54:00 3:06:00
73 73 22/11/2018 2:00 PM 1:22:00 1:45:00 1:08:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 1:45:00 4:15:00
74 74 23/11/2018 2:00 PM 0:00:00 0:00:00 1:38:00 0:00:00 3:32:00 1 8:00 PM 6:00:00 0:50:00 5:10:00
75 75 24/11/2018 6:00 AM 5:46:00 0:00:00 1:18:00 0:00:00 2:02:00 0 8:00 PM 14:00:00 4:54:00 9:06:00
76 76 25/11/2018 8:15 AM 3:42:00 0:00:00 0:32:00 0:00:00 5:00:00 0 8:00 PM 11:45:00 2:31:00 9:14:00
77 77 26/11/2018 2:00 PM 1:25:00 2:20:00 1:14:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 1:01:00 4:59:00
78 78 27/11/2018 2:00 PM 1:32:00 1:00:00 0:00:00 0:00:00 1:04:00 1 8:00 PM 6:00:00 2:24:00 3:36:00
79 79 28/11/2018 2:00 PM 2:30:00 0:30:00 1:50:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 1:10:00 4:50:00
80 80 29/11/2018 2:00 PM 0:45:00 0:30:00 0:30:00 0:00:00 1:26:00 1 8:00 PM 6:00:00 2:49:00 3:11:00
81 81 30/11/2018 2:15 PM 0:00:00 0:00:00 3:02:00 0:00:00 0:00:00 1 9:00 PM 6:45:00 3:43:00 3:02:00
82 82 1/12/2018 7:15 AM 3:00:00 0:00:00 2:55:00 0:00:00 0:00:00 0 9:00 PM 13:45:00 7:50:00 5:55:00
83 83 2/12/2018 8:40 AM 2:17:00 0:00:00 8:10:00 0:00:00 0:00:00 0 9:00 PM 12:20:00 1:53:00 10:27:00
84 84 3/12/2018 2:00 PM 1:15:00 0:00:00 3:00:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 1:45:00 4:15:00
85 85 4/12/2018 2:00 PM 1:30:00 0:00:00 1:30:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 3:00:00 3:00:00
86 86 5/12/2018 2:00 PM 5:00:00 0:00:00 1:00:00 0:00:00 0:00:00 1 8:00 PM 6:00:00 0:00:00 6:00:00
87 87 6/12/2018 2:00 PM 1:00:00 0:00:00 5:00:00 0:00:00 0:00:00 1 9:00 PM 7:00:00 1:00:00 6:00:00
88 88 7/12/2018 6:27 AM 0:45:00 0:00:00 4:00:00 0:00:00 0:00:00 0 10:00 PM 15:33:00 10:48:00 4:45:00
89 89 8/12/2018 8:00 AM 5:00:00 0:00:00 0:00:00 0:00:00 5:00:00 0 8:00 PM 12:00:00 2:00:00 10:00:00
90 90 9/12/2018 2:00 PM 1:50:00 0:00:00 0:00:00 0:00:00 2:00:00 1 8:00 PM 6:00:00 2:10:00 3:50:00
91 91 10/12/2018 7:00 AM 3:50:00 0:00:00 2:30:00 0:00:00 5:00:00 0 8:00 PM 13:00:00 1:40:00 11:20:00
92 92 11/12/2018 2:00 PM 1:16:00 0:00:00 0:28:00 0:00:00 2:16:00 1 8:00 PM 6:00:00 2:00:00 4:00:00
93 93 12/12/2018 7:00 AM 6:09:00 0:00:00 3:17:00 0:00:00 2:55:00 0 8:00 PM 13:00:00 0:39:00 12:21:00
94 94 13/12/2018 2:00 PM 0:00:00 2:30:00 1:37:00 0:00:00 2:20:00 1 9:30 PM 7:30:00 1:03:00 6:27:00
95 95 14/12/2018 6:20 AM 10:01:00 0:00:00 2:02:00 0:00:00 3:20:00 0 10:46 PM 16:26:00 1:03:00 15:23:00
96 96 15/12/2018 6:29 AM 1:49:00 0:00:00 9:44:00 0:00:00 1:35:00 0 8:00 PM 13:31:00 0:23:00 13:08:00
97 97 16/12/2018 2:00 PM 0:00:00 0:00:00 3:15:00 0:00:00 1:50:00 1 9:30 PM 7:30:00 2:25:00 5:05:00
98 98 17/12/2018 7:30 AM 1:30:00 5:48:00 0:47:00 0:00:00 3:47:00 0 8:15 PM 12:45:00 0:53:00 11:52:00
99 99 18/12/2018 11:00 AM 0:00:00 4:12:00 2:06:00 0:00:00 2:04:00 1 8:00 PM 9:00:00 0:38:00 8:22:00
100 100 19/12/2018 7:15 AM 5:59:00 3:27:00 0:57:00 0:00:00 1:08:00 0 8:00 PM 12:45:00 1:14:00 11:31:00
101 101 20/12/2018 12:20 PM 1:32:00 2:16:00 0:00:00 0:00:00 2:11:00 1 9:00 PM 8:40:00 2:41:00 5:59:00
102 102 21/12/2018 7:33 AM 9:44:00 0:54:00 3:06:00 0:45:00 0:00:00 0 11:59 PM 16:26:00 1:57:00 14:29:00
103 103 22/12/2018 9:00 AM 2:50:00 0:10:00 1:15:00 0:00:00 1:48:00 0 9:00 PM 12:00:00 5:57:00 6:03:00
104 104 23/12/2018 1:00 PM 0:00:00 0:00:00 0:28:00 0:00:00 1:36:00 1 8:00 PM 7:00:00 4:56:00 2:04:00
105 105 24/12/2018 7:30 AM 0:00:00 4:20:00 0:55:00 0:00:00 2:17:00 0 9:30 PM 14:00:00 6:28:00 7:32:00
106 106 25/12/2018 10:10 AM 0:00:00 0:00:00 0:00:00 0:00:00 3:17:00 0 9:30 PM 11:20:00 8:03:00 3:17:00
107 107 26/12/2018 8:12 AM 0:00:00 0:00:00 6:10:00 0:10:00 4:58:00 0 9:30 PM 13:18:00 2:00:00 11:18:00
108 108 27/12/2018 8:27 AM 0:00:00 0:00:00 1:33:00 0:00:00 2:34:00 0 9:30 PM 13:03:00 8:56:00 4:07:00

8
testing/time_test.cpp Normal file
View File

@ -0,0 +1,8 @@
#include <iostream>
#include <chrono>
#include <string>
int main() {
std::cout << std::chrono::system_clock::now() << endl;
return 0;
}

BIN
ui-designs/login-ui.vsdx Normal file

Binary file not shown.