Update!
This commit is contained in:
commit
5e280f1e75
|
@ -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
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
|
@ -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": []
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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})
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
Copyright (C) 2018 Ayham Mamoun
|
|
@ -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;
|
||||
}
|
|
@ -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]
|
||||
|
||||
*/
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
||||
*/
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
#pragma once
|
||||
|
||||
|
|
@ -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();
|
||||
}
|
|
@ -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
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
};
|
|
@ -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();
|
||||
}
|
|
@ -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;
|
||||
};
|
|
@ -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_
|
|
@ -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_
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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_
|
|
@ -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_
|
|
@ -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_
|
|
@ -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_
|
|
@ -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_
|
|
@ -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
|
|
@ -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_
|
|
@ -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()
|
|
@ -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;
|
||||
};
|
|
@ -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()
|
|
@ -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;
|
||||
};
|
|
@ -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()
|
|
@ -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;
|
||||
;
|
||||
};
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
};
|
||||
};
|
|
@ -0,0 +1,3 @@
|
|||
ps|x}
|
||||
ps|x}
|
||||
15
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,11 @@
|
|||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
|
@ -0,0 +1,3 @@
|
|||
ps|x}
|
||||
ps|x}
|
||||
15
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1,3 @@
|
|||
sv{€
|
||||
sv{€
|
||||
18
|
|
@ -0,0 +1 @@
|
|||
NULL
|
|
@ -0,0 +1,11 @@
|
|||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
|
@ -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
|
|
|
@ -0,0 +1,8 @@
|
|||
#include <iostream>
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
|
||||
int main() {
|
||||
std::cout << std::chrono::system_clock::now() << endl;
|
||||
return 0;
|
||||
}
|
Binary file not shown.
Loading…
Reference in New Issue