TimeKeeper is a project from Dylan DeVries, Paul Pace, Thomas Judge (TJ) for a Database Design course at Mercer University. This project was designed to help track hours worked for various projects currently focusing on capturing punch-in times such as clocking in, leaving for lunch, returning from lunch, and clocking out. The project also allows the user to view data points from the database in relationship to projects, and charge codes. The Current state of the project is rather rudimentary focusing on the database design and retrieving data from it, but could easily be expanded to a enterprise grade project, task and time keeping system. This project should be considered more of a proof of concept design rather than a final implementation.
Timekeeper is a flutter application designed to work dynamically for each companies specific use case with little modification. This requires a simplistic design with modifiable styles, and page toggling. To start we have designed a minimum viable product that will allow employees to enter their punch-in times and track how many hours they have worked in a day. Additionally we have added views for charge codes, and projects for each user so that users can see the current budget for these items. Future development would include the ability to add user permissions for projects and charged codes allowing them to add, view or edit these fields and the ability for the company to establish which views they would like to use.
The design of our Flutter app is fairly typical. We are using the Firestore database service from Firebase and are using a simplistic Model View for all of our data.
The Framework for this database is rather simple.
flowchart LR
GUI-->FirestoreSDK-->Database
This is the common structure for any application using Firebase. The GUI connects the Firestore SDK and that communicates with the database. This makes the database connection simple if configured properly. Future development may move away from Firestore to a self-host alternative allowing for companies to own their own data.
The Complex part is how our database connects internally. Below you can see a connected database graph or our whole database.
If you would like to know about the different fields please the Database Dictionary.
This database has been filled with temporary data for engineering purposes. Below is our sample data on the Firestore Database.
We currently have one sample client:
One sample Project:
Two sample Charge Codes:
One sample user budget:
And three sample users:
For our UI we have working versions of several of our UI Elements planned. Below is an example of our Projects view which we filled with dummy data. This same view is going to be used in the Charge Codes and Stats View. These are primary used to show the user status of a project or the charge codes they have available.
To connect to the database one must first login so we can provide all information they are allowed to see.
After entering their information the database checks if they are really users and logs them in.
If the yare the console does print out some information for develop usage.
If not they will similarly be informed.
Finally after login they will land on our pinch in Home page. In future development we will post to the database their clock-in and clock-out times.
This screen is the primary piece of TimeKeeper, easy trackable method to clock-in. From here the Home tab allows the user to select Lunch or Clock Out. If the user Clocks out it will post their times and return to the Clock In view. If the user selects Lunch it will let them clock back in and then clock out. Below is a flowchart diagram to help explain the workflow for using the Home page.
flowchart LR
A[Clock In Screen]-->|Clock In\nPre-Lunch|B[Lunch/Clock Out Screen]
B --> |Lunch| A
A --> |Clock In Post-Lunch| C[Clock Out Screen]
B & C --> |Clock-Out| A
To try out our flutter project may take some step please refer to the included codebase.
Table | Description |
---|---|
Punch_In | Stores Punch in events |
Project | Stores company Projects |
Users | Stores user information |
Client | Stores Client Contact information |
User_Budget | Stores user specific budget and spending for a charge code |
Charge_Codes | Stores charge code budget information |
Variable | Type | Description |
---|---|---|
ID | Integer (PK) | Event ID |
Punch_In_Type | Integer | TODO: add Punch In type description |
Punch_In_time | Datetime | Time of the Event |
User_ID | int (FK) | ID of user who punched in |
Charge Code | string | Charge Code Punch In Event was against |
Variable | Type | Description |
---|---|---|
Name | string | Name of the Project |
ID | Integer (PK) | ID of the Project |
Client | Integer (FK) | ID of Projects Client |
Lead | Integer | ID of Project Lead User |
Budget | Integer | Total Budget for the project in Dollars |
Variable | Type | Description |
---|---|---|
ID | Integer (PK) | Employee ID of the User |
Name | String | Employee Name |
Supervisor_ID | Integer (FK) | ID of this employees Supervisor |
String | Email address of the User | |
Phone | String | Phone Number of the User |
Password | String | Users password for TimeKeeper |
Variable | Type | Description |
---|---|---|
ID | Integer (PK) | ID for Clients in the System |
Name | String | Name of Client Business |
Address | String | Street address of Client |
Contact_Name | String | Name of Client Contact |
String | Email Address for Client Contact | |
Phone | String | Phone number for Client Contact |
Variable | Type | Description |
---|---|---|
User | Integer (FK) | ID of User that owns the Budget |
Charge_Code | String (FK) | Charge code that is charged for on this budget |
Budgeted_Hours | Integer | Total number of hours that can be spend toward this budget |
Spent_Hours | Integer | Total number of hours spent on this budget |
Start_Date | Datetime | When this budget first becomes available |
End_Date | Datetime | End Date for spending on this budget |
Document ID* | String (PK) | Firestore Document ID |
* Firestore automatically creates document id's for all table entries
Variable | Type | Description |
---|---|---|
ID | String (PK) | Charge Code ID |
Name | String | Name of the Charge Code |
Description | String | Description of how this charge code should be used |
Owner ID | Integer (FK) | User responsible for this charge code |
Status | Integer | Current State of the Charge Code |
Project | Integer (PK) | Project ID associated to the Charge Code |
Full_Budget | Integer | Amount of money to be spent on this charge code |