:PROPERTIES: :ID: c21a443b-2311-497b-afcb-52cf866230d2 :END: #+title: PTO * AWeber ** PTO Accrual #+caption: Employee Handbook v6 #+begin_quote Effective on your anniversary date, and each year thereafter, you earn PTO based on your years of service per the timeline below: #+end_quote | Years of Service | Yearly Vacation Accrual | Per Pay Period Accrual | |-------------------+-------------------------+---------------------------------------------------| | Less than 3 year | 15 days | 0.5775 x hours worked (max at 4.62 hrs per pay) | | 3 but less than 5 | 20 days | 0.76875 x hours worked (max at 6.15 hrs per pay) | | 5 but less than 7 | 25 days | 0.96125 x hours worked (max at 7.69 hrs per pay) | | 7 or more | 30 days | 0.115385 x hours worked (max at 9.23 hrs per day) | - Hire Date :: October 23, 2017 - Initial End Date :: July 22, 2022 - Rehire Date :: August 28th, 2023 - Adjusted Seniority Date :: December 1, 2018 #+begin_src python :exports none import datetime hired = datetime.date(2017, 10, 23) left = datetime.date(2022, 7, 22) rehired = datetime.date(2023, 8, 18) adjusted_start = datetime.date(2018, 12, 1) today = datetime.date(2024, 9, 25) return [ ["Actual days employed", ((left - hired) + (today - rehired)).days], ["Adjusted days employed", (today - adjusted_start).days], ] #+end_src #+RESULTS: | Actual days employed | 2137 | | Adjusted days employed | 2125 | ** Full History #+name: paylocity-pto-history | Trans Date | Begin Date | Type | Trans Type | Subtype | Hours/Days | Avail Hours/Days | |------------+------------+------+-------------------+-----------------------+--------------+------------------| | 09/20/2024 | 09/20/2024 | PTO | Earned | Ongoing | 4.62 Hours | 18.93 Hours | | 09/06/2024 | 09/06/2024 | PTO | Earned | Ongoing | 4.62 Hours | 14.31 Hours | | 09/06/2024 | 09/06/2024 | SAB | Earned | Ongoing | 0.00 Hours | 0.00 Hours | | 09/06/2024 | 09/06/2024 | SAB | Cleared | | 0.00 Hours | 0.00 Hours | | 09/06/2024 | 09/06/2024 | PTO | Cleared | | 0.00 Hours | 9.70 Hours | | 08/23/2024 | 08/23/2024 | PTO | Earned | Ongoing | 4.62 Hours | 9.70 Hours | | 08/23/2024 | 08/01/2024 | PTO | Used | | 4.00 Hours | 13.08 Hours | | 08/23/2024 | 08/02/2024 | PTO | Used | | 8.00 Hours | 5.08 Hours | | 08/23/2024 | 08/09/2024 | PTO | Manual Adjustment | History | 250.15 Hours | 17.08 Hours | | 08/23/2024 | 08/09/2024 | PTO | Manual Adjustment | Adjustment | 238.15 Hours | 17.08 Hours | | 08/09/2024 | 08/09/2024 | PTO | Earned | Ongoing | 4.62 Hours | 17.08 Hours | | 07/26/2024 | 07/26/2024 | PTO | Earned | Ongoing | 4.62 Hours | 12.46 Hours | | 07/12/2024 | 07/12/2024 | PTO | Earned | Ongoing | 4.62 Hours | 7.85 Hours | | 07/12/2024 | 07/12/2024 | PTO | Used | | 8.00 Hours | 3.23 Hours | | 06/28/2024 | 06/28/2024 | PTO | Earned | Ongoing | 4.62 Hours | 11.23 Hours | | 06/14/2024 | 06/14/2024 | PTO | Earned | Ongoing | 4.62 Hours | 6.62 Hours | | 05/31/2024 | 05/31/2024 | PTO | Earned | Ongoing | 4.62 Hours | 2.00 Hours | | 05/31/2024 | 05/31/2024 | PTO | Used | | 8.00 Hours | -2.61 Hours | | 05/17/2024 | 05/17/2024 | PTO | Earned | Ongoing | 4.62 Hours | 5.39 Hours | | 05/03/2024 | 05/03/2024 | PTO | Earned | Ongoing | 4.62 Hours | 0.77 Hours | | 05/03/2024 | 05/03/2024 | PTO | Used | | 8.00 Hours | -3.85 Hours | | 04/19/2024 | 04/19/2024 | PTO | Earned | Ongoing | 4.62 Hours | 4.15 Hours | | 04/05/2024 | 04/05/2024 | PTO | Earned | Ongoing | 4.62 Hours | -0.46 Hours | | 03/22/2024 | 03/22/2024 | PTO | Earned | Ongoing | 4.62 Hours | -5.08 Hours | | 03/08/2024 | 03/08/2024 | PTO | Earned | Ongoing | 4.62 Hours | -9.69 Hours | | 02/23/2024 | 02/23/2024 | PTO | Earned | Ongoing | 4.62 Hours | -14.31 Hours | | 02/23/2024 | 02/23/2024 | PTO | Used | | 8.00 Hours | -18.92 Hours | | 02/09/2024 | 02/09/2024 | PTO | Earned | Ongoing | 4.62 Hours | -10.92 Hours | | 01/26/2024 | 01/26/2024 | PTO | Earned | Ongoing | 4.62 Hours | -15.54 Hours | | 01/26/2024 | 01/26/2024 | PTO | Used | | 16.00 Hours | -20.15 Hours | | 01/12/2024 | 01/12/2024 | PTO | Earned | Ongoing | 4.62 Hours | -4.15 Hours | | 01/12/2024 | 01/12/2024 | VOL | Earned | Ongoing | 0.00 Hours | 16.00 Hours | | 01/12/2024 | 01/12/2024 | FLEX | Earned | Ongoing | 0.00 Hours | 8.00 Hours | | 12/29/2023 | 12/29/2023 | PTO | Earned | Ongoing | 4.62 Hours | -8.77 Hours | | 12/15/2023 | 12/15/2023 | PTO | Earned | Ongoing | 4.62 Hours | -13.38 Hours | | 12/01/2023 | 12/01/2023 | PTO | Earned | Ongoing | 4.62 Hours | -18.00 Hours | | 11/17/2023 | 11/17/2023 | PTO | Earned | Ongoing | 4.62 Hours | -22.62 Hours | | 11/03/2023 | 11/03/2023 | PTO | Earned | Ongoing | 4.62 Hours | -27.23 Hours | | 11/03/2023 | 11/03/2023 | PTO | Used | | 8.00 Hours | -31.85 Hours | | 10/20/2023 | 10/20/2023 | PTO | Earned | Ongoing | 4.62 Hours | -23.85 Hours | | 10/06/2023 | 10/06/2023 | PTO | Earned | Ongoing | 4.62 Hours | -28.46 Hours | | 10/06/2023 | 10/06/2023 | FLEX | Earned | Above maximum balance | -8.00 Hours | 8.00 Hours | | 10/06/2023 | 10/06/2023 | FLEX | Initial | | 8.00 Hours | 16.00 Hours | | 10/06/2023 | 10/06/2023 | PTO | Used | | 16.00 Hours | -33.08 Hours | | 09/22/2023 | 09/22/2023 | PTO | Earned | Ongoing | 4.62 Hours | -17.08 Hours | | 09/22/2023 | 09/22/2023 | PTO | Used | | 24.00 Hours | -21.69 Hours | | 09/08/2023 | 09/08/2023 | PTO | Earned | Ongoing | 2.31 Hours | 2.31 Hours | | 09/08/2023 | 09/08/2023 | VOL | Earned | Above maximum balance | -16.00 Hours | 16.00 Hours | | 09/08/2023 | 09/08/2023 | VOL | Initial | | 16.00 Hours | 32.00 Hours | | 08/29/2023 | 08/29/2023 | PTO | Manual Adjustment | Adjustment | 142.15 Hours | 0.00 Hours | | 07/29/2022 | 07/29/2022 | PTO | Earned | Ongoing | 6.15 Hours | 6.16 Hours | | 07/29/2022 | 07/09/2022 | PTO | Used | | 38.15 Hours | 0.00 Hours | | 07/15/2022 | 07/15/2022 | PTO | Earned | Ongoing | 6.15 Hours | 38.15 Hours | | 07/01/2022 | 07/01/2022 | PTO | Earned | Ongoing | 6.15 Hours | 32.00 Hours | | 07/01/2022 | 07/01/2022 | PTO | Used | | 16.00 Hours | 25.85 Hours | | 06/17/2022 | 06/17/2022 | PTO | Earned | Ongoing | 6.15 Hours | 41.85 Hours | | 06/03/2022 | 06/03/2022 | PTO | Earned | Ongoing | 6.15 Hours | 35.69 Hours | | 05/20/2022 | 05/20/2022 | PTO | Earned | Ongoing | 6.15 Hours | 29.54 Hours | | 05/20/2022 | 05/20/2022 | PTO | Used | | 16.00 Hours | 23.38 Hours | | 05/06/2022 | 05/06/2022 | PTO | Earned | Ongoing | 6.15 Hours | 39.38 Hours | | 05/06/2022 | 05/06/2022 | PTO | Used | | 40.00 Hours | 33.23 Hours | | 04/22/2022 | 04/22/2022 | PTO | Earned | Ongoing | 6.15 Hours | 73.23 Hours | | 04/08/2022 | 04/08/2022 | PTO | Earned | Ongoing | 6.15 Hours | 67.08 Hours | | 03/25/2022 | 03/25/2022 | PTO | Earned | Ongoing | 6.15 Hours | 60.92 Hours | | 03/11/2022 | 03/11/2022 | PTO | Earned | Ongoing | 6.15 Hours | 54.77 Hours | | 03/11/2022 | 03/11/2022 | PTO | Used | | 16.00 Hours | 48.61 Hours | | 02/25/2022 | 02/25/2022 | PTO | Earned | Ongoing | 6.15 Hours | 64.61 Hours | | 02/11/2022 | 02/11/2022 | PTO | Earned | Ongoing | 6.15 Hours | 58.46 Hours | | 01/28/2022 | 01/28/2022 | PTO | Earned | Ongoing | 6.15 Hours | 52.31 Hours | | 01/14/2022 | 01/14/2022 | PTO | Earned | Ongoing | 6.15 Hours | 46.15 Hours | | 01/14/2022 | 01/14/2022 | FLEX | Earned | Ongoing | 8.00 Hours | 8.00 Hours | | 01/14/2022 | 01/14/2022 | VOL | Earned | Ongoing | 0.00 Hours | 16.00 Hours | | 01/14/2022 | 01/14/2022 | PTO | Used | | 8.00 Hours | 40.00 Hours | | 12/30/2021 | 12/30/2021 | PTO | Earned | Ongoing | 6.15 Hours | 48.00 Hours | | 12/30/2021 | 12/30/2021 | PTO | Used | | 8.00 Hours | 41.84 Hours | | 12/30/2021 | 12/30/2021 | FLEX | Used | | 8.00 Hours | 0.00 Hours | | 12/17/2021 | 12/17/2021 | PTO | Earned | Ongoing | 6.15 Hours | 49.84 Hours | | 12/03/2021 | 12/03/2021 | PTO | Earned | Ongoing | 6.15 Hours | 43.69 Hours | | 11/19/2021 | 11/19/2021 | PTO | Earned | Ongoing | 6.15 Hours | 37.54 Hours | | 11/05/2021 | 11/05/2021 | PTO | Earned | Ongoing | 6.15 Hours | 31.38 Hours | | 11/05/2021 | 11/05/2021 | SAB | Earned | Ongoing | 0.00 Hours | 0.00 Hours | | 11/05/2021 | 11/05/2021 | SAB | Cleared | | 0.00 Hours | 0.00 Hours | | 11/05/2021 | 11/05/2021 | PTO | Cleared | | 0.00 Hours | 25.23 Hours | | 11/05/2021 | 11/05/2021 | PTO | Used | | 12.00 Hours | 25.23 Hours | | 10/22/2021 | 10/22/2021 | PTO | Earned | Ongoing | 6.15 Hours | 37.23 Hours | | 10/08/2021 | 10/08/2021 | PTO | Earned | Ongoing | 6.15 Hours | 31.07 Hours | | 09/24/2021 | 09/24/2021 | PTO | Earned | Ongoing | 6.15 Hours | 24.92 Hours | | 09/24/2021 | 09/24/2021 | PTO | Used | | 32.00 Hours | 18.77 Hours | | 09/10/2021 | 09/10/2021 | PTO | Earned | Ongoing | 6.15 Hours | 50.77 Hours | | 08/27/2021 | 08/27/2021 | PTO | Earned | Ongoing | 6.15 Hours | 44.61 Hours | | 08/27/2021 | 08/27/2021 | PTO | Used | | 8.00 Hours | 38.46 Hours | | 08/13/2021 | 08/13/2021 | PTO | Earned | Ongoing | 6.15 Hours | 46.46 Hours | | 07/30/2021 | 07/30/2021 | PTO | Earned | Ongoing | 6.15 Hours | 40.30 Hours | | 07/16/2021 | 07/16/2021 | PTO | Earned | Ongoing | 6.15 Hours | 34.15 Hours | | 07/02/2021 | 07/02/2021 | PTO | Earned | Ongoing | 6.15 Hours | 28.00 Hours | | 07/02/2021 | 07/02/2021 | PTO | Used | | 8.00 Hours | 21.84 Hours | | 06/18/2021 | 06/18/2021 | PTO | Earned | Ongoing | 6.15 Hours | 29.84 Hours | | 06/18/2021 | 06/18/2021 | PTO | Used | | 32.00 Hours | 23.69 Hours | | 06/04/2021 | 06/04/2021 | PTO | Earned | Ongoing | 6.15 Hours | 55.69 Hours | | 06/04/2021 | 06/04/2021 | PTO | Used | | 4.00 Hours | 49.54 Hours | | 05/21/2021 | 05/21/2021 | PTO | Earned | Ongoing | 6.15 Hours | 53.54 Hours | | 05/21/2021 | 05/21/2021 | PTO | Used | | 8.00 Hours | 47.38 Hours | | 05/07/2021 | 05/07/2021 | PTO | Earned | Ongoing | 6.15 Hours | 55.38 Hours | | 04/23/2021 | 04/23/2021 | PTO | Earned | Ongoing | 6.15 Hours | 49.23 Hours | | 04/23/2021 | 04/23/2021 | PTO | Used | | 8.00 Hours | 43.07 Hours | | 04/09/2021 | 04/09/2021 | PTO | Earned | Ongoing | 6.15 Hours | 51.07 Hours | | 03/26/2021 | 03/26/2021 | PTO | Earned | Ongoing | 6.15 Hours | 44.92 Hours | | 03/12/2021 | 03/12/2021 | PTO | Earned | Ongoing | 6.15 Hours | 38.77 Hours | | 02/26/2021 | 02/26/2021 | PTO | Earned | Ongoing | 6.15 Hours | 32.61 Hours | | 02/26/2021 | 02/26/2021 | PTO | Used | | 8.00 Hours | 26.46 Hours | | 02/12/2021 | 02/12/2021 | PTO | Earned | Ongoing | 6.15 Hours | 34.46 Hours | | 01/29/2021 | 01/29/2021 | PTO | Earned | Ongoing | 6.15 Hours | 28.30 Hours | | 01/15/2021 | 01/15/2021 | PTO | Earned | Ongoing | 6.15 Hours | | | 01/15/2021 | 01/15/2021 | FLEX | Earned | Ongoing | 8.00 Hours | 8.00 Hours | | 01/15/2021 | 01/15/2021 | VOL | Earned | Ongoing | 16.00 Hours | 16.00 Hours | ** Discrepancy since December 1st, 2023 (5-year anniversary) Since my rehire date, I should have been accruing PTO at the 3-5 year rate up until the 5th annivesary of my adjusted seniority date, following which it should have been accruing at the 5-7 year rate. It has instead been accruing at the 0-3 year rate the entire time. #+name: pto-earned-discrepency #+begin_src python :var data=paylocity-pto-history :var filename="pto-aweber-2024-discrepency.png" :results file :exports results from datetime import datetime, date import pandas as pd def from_hours(text) -> float | None: try: return float(text.split()[0]) except (ValueError, IndexError): return None data = [ { "date": datetime.strptime(tdate, "%m/%d/%Y").date(), "PTO Type": ptype, "Trans Type": ttype, "hours": from_hours(hours), "available": from_hours(available), } for tdate, bdate, ptype, ttype, stype, hours, available in data ] data = pd.DataFrame(data) pto = data[data["PTO Type"] == "PTO"] pto = pto[(pto["Trans Type"] =="Earned") | (pto["Trans Type"] == "Used")] pto = pto[pto["date"] > date(2022, 9, 1)] pto = pto.pivot_table(index="date", columns="Trans Type", values="hours", aggfunc="sum").fillna(0) pto["Expected Earned"] = pto["Earned"] pto.loc[pto.index == date(2023, 9, 8), "Expected Earned"] = 3.08 # (2.31 / 4.62) * 6.15 pto.loc[pto.index > date(2023, 9, 8), "Expected Earned"] = 6.15 pto.loc[pto.index > date(2023, 12, 1), "Expected Earned"] = 7.69 pto["change"] = pto["Earned"] - pto["Used"] pto["expected change"] = pto["Expected Earned"] - pto["Used"] pto["Actual"] = pto["change"].cumsum() pto["Expected"] = pto["expected change"].cumsum() plot = pto[["Actual", "Expected"]].plot(title="PTO Accrual Discrepancy", xlabel="Date", ylabel="Hours") last = pto.iloc[-1] plot.get_legend().set_title("") plot.text(last.name, last["Actual"], f" {last.Actual:.2f}") plot.text(last.name, last["Expected"], f" {last.Expected:.2f}") fig = plot.get_figure() fig.autofmt_xdate() fig.savefig(filename) return filename #+end_src #+RESULTS: pto-earned-discrepency [[file:pto-aweber-2024-discrepency.png]]