@@ 1,13 1,20 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
-# Time Computer version: 2021-03
+# Time Computer version: 0.1.1
#
# MIT License
# mrpenner
import sys
import datetime
+from decimal import *
+
+settings = {
+ "standard_week": Decimal(40),
+ "rate": Decimal(0),
+ "ot_mult": Decimal(1.5),
+}
def parse_line(line):
@@ 69,6 76,8 @@ def reg_overtime_hours(weekly, standard_week):
and standard_week an integer of hours when overtime begins
return a dictionary like {"regular": 40, "overtime": 4.5}
"""
+ # only needed until everything is converted to Decimals
+ standard_week = float(standard_week)
output = {"regular": 0, "overtime": 0}
for week in weekly:
if weekly[week] <= standard_week:
@@ 104,7 113,23 @@ def total_hours(data):
return total
-def time_computer(data, standard_week):
+def gross_pay(reg_hrs, ot_hrs, rate, ot_mult):
+ """
+ figure total gross pay and effective hourly rate
+ """
+ output = {}
+ reg_hrs = Decimal(reg_hrs)
+ ot_hrs = Decimal(ot_hrs)
+ output["gross pay"] = Decimal(
+ (reg_hrs * rate) + (ot_hrs * rate * ot_mult)
+ ).quantize(Decimal(".01"), rounding=ROUND_HALF_UP)
+ output["effective rate"] = Decimal(
+ output["gross pay"] / (reg_hrs + ot_hrs)
+ ).quantize(Decimal(".01"), rounding=ROUND_HALF_UP)
+ return output
+
+
+def time_computer(data, settings):
"""
take dictionary of data from each line
calculate and print all the results
@@ 120,14 145,21 @@ def time_computer(data, standard_week):
for job_name, hours in job_hours(data).items():
print(job_name + ":", round(hours, 2))
print("")
- for name, hours in reg_overtime_hours(weekly, standard_week).items():
+ reg_ot = reg_overtime_hours(weekly, settings["standard_week"])
+ for name, hours in reg_ot.items():
print(name + ":", round(hours, 2))
print("\ntotal hours:", round(total_hours(data), 2))
+ print("")
+ if settings["rate"] > 0:
+ for name, amount in gross_pay(
+ reg_ot["regular"], reg_ot["overtime"], settings["rate"], settings["ot_mult"]
+ ).items():
+ print(name + ": $", amount)
if __name__ == "__main__":
print("time computer")
- print("version 0.1.0")
+ print("version 0.1.1")
print(" ____")
print(" / \\")
print(" / | \\")
@@ 143,5 175,4 @@ if __name__ == "__main__":
with open(file_name) as infile:
data = [parse_line(line) for line in infile]
- standard_week = 40
- time_computer(data, standard_week)
+ time_computer(data, settings)
@@ 8,6 8,7 @@ mrpenner
"""
import datetime
+from decimal import *
tc = __import__("tc")
@@ 21,21 22,27 @@ def test_parse_line():
def test_daily_hours():
- assert tc.daily_hours(
- [
- {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 9.38},
- {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 7},
- ]
- ) == {datetime.date(2021, 3, 31): 16.380000000000003}
+ assert (
+ tc.daily_hours(
+ [
+ {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 9.38},
+ {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 7},
+ ]
+ )
+ == {datetime.date(2021, 3, 31): 16.380000000000003}
+ )
def test_weekly_hours():
- assert tc.weekly_hours(
- [
- {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 9.38},
- {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 7},
- ]
- ) == {13: 16.380000000000003}
+ assert (
+ tc.weekly_hours(
+ [
+ {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 9.38},
+ {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 7},
+ ]
+ )
+ == {13: 16.380000000000003}
+ )
def test_reg_overtime_hours():
@@ 46,13 53,16 @@ def test_reg_overtime_hours():
def test_job_hours():
- assert tc.job_hours(
- [
- {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 9.38},
- {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 7},
- {"date": datetime.date(2021, 3, 31), "job": "jobname2", "hours": 9.38},
- ]
- ) == {"jobname": 16.380000000000003, "jobname2": 9.38}
+ assert (
+ tc.job_hours(
+ [
+ {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 9.38},
+ {"date": datetime.date(2021, 3, 31), "job": "jobname", "hours": 7},
+ {"date": datetime.date(2021, 3, 31), "job": "jobname2", "hours": 9.38},
+ ]
+ )
+ == {"jobname": 16.380000000000003, "jobname2": 9.38}
+ )
def test_total_hours():
@@ 65,3 75,9 @@ def test_total_hours():
)
== 16.380000000000003
)
+
+
+def test_gross_pay():
+ assert tc.gross_pay(
+ Decimal("40"), Decimal("5.5"), Decimal("12.5"), Decimal("1.5")
+ ) == {"gross pay": Decimal("603.13"), "effective rate": Decimal("13.26")}