From 75d2e669b32bc289d2714054f1073f26292c8809 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 10 Feb 2026 10:21:43 +0000 Subject: [PATCH] Ver 14.05 overtime implementation --- core/__pycache__/forms.cpython-311.pyc | Bin 5361 -> 5605 bytes core/__pycache__/models.cpython-311.pyc | Bin 14410 -> 14911 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1791 -> 1904 bytes core/__pycache__/views.cpython-311.pyc | Bin 51995 -> 55310 bytes core/forms.py | 12 +- ...orklog_overtime_worklog_overtime_priced.py | 24 +++ ...me_worklog_overtime_priced.cpython-311.pyc | Bin 0 -> 1476 bytes core/models.py | 11 ++ core/templates/core/log_attendance.html | 14 +- core/templates/core/payroll_dashboard.html | 144 +++++++++++++++++- core/urls.py | 4 +- core/views.py | 72 ++++++++- 12 files changed, 274 insertions(+), 7 deletions(-) create mode 100644 core/migrations/0013_worklog_overtime_worklog_overtime_priced.py create mode 100644 core/migrations/__pycache__/0013_worklog_overtime_worklog_overtime_priced.cpython-311.pyc diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 1b9f2f5fb029b56fc14714f32cc2fce71e79c5ff..516fd2e4ce2b22b316aaf1c5acf18d3f08beef8c 100644 GIT binary patch delta 972 zcmZXSUr19?9LMk3c9*+z+ua}kq@~lEc3o*^QPgnKbZX=TT?8|`tlitZHh1If&Ljeb zd>A1VoZjj|UsMXB7!=W4kI{pH597WRL63okL`XvCcNbQ6?mZvQ@Av!iJHPWgXH)nR zbgnoY97D&>_j}4C*9+$oLZ6GzQ5qeP&6943z>qzY-tvlJBqX`WM^hloFIyPqDV^n! z@R^u?Msm+Hl4sdOBXs_bR27)(Nb=5CB&rL{3`*3DGJ=mp%wOv;hy;tiFEybmDLIF$ zsEzkikf7ylqwTRJVV5{6w{P>8Rea;3nvSY?s(nb-k^)OA*#?_lp-#(KQ>MrgUq!mv znrgvDg?GYVzjBOvx0{kj*F3j;lW7X zC~gK_7XT{J9io`ZBy+ixoXLoyfN+d@bBLk`8}&Ls3Sc4dibj6ywxqb=s7GNd!#5T3 z>n=ZS&^q5-a#xplcga;>$S>SkJiQuQYd*K;3Vm>e)?J|u8_Qca8Hz2y+`xvDtUBYU zv$*5@gk}%JW*$H-MNDw)Z38?*ECAX7&=nk{&~0&fMjOoD%xkzEoX`&4K9ZCabyUvC zDGhgk`#8Y3G2?JXAI7P#pU&J9a>f1ZZ23N^9ivZV&n+1GJvqi8B_K+AJ$>cpFh=fs zTF^D}(sL$|hWG>pO$SBmEUgqLbuN|6iW03&lW_;}ddICsCYelog}Q(D*scgosZu^8 jcVkRmd(+3l=;Q|TKOO`gc5H%w>re2!i46G`EpVz|YKi3% delta 712 zcmaE={ZW%|IWI340}w27ZO&}v+sL<&k+E;{2F7$o9e0Kl{uYK5fn`h#46A_{0-^*v z7}6M11Y0sjR{FK5-B{DO72sw~h%Ngyt61`-W$ctb$EgY|}>#RV{$oGm0f`6-(} zn?6uck>O@5_7G-9xyk)p%8c@pH*>`?YD^a5_F^=i9LufF=s3BRTT8(Jq|z2hREZ$F zAU-}bFS8^*UU~C*?o38?ka?OSMJgc0svtrQL@)!1TbwS5C8=(isW~Y{nv>&sQ>5)c zqAYp&d8tKOAXQc%!VpB*PG;m2mG=QMiy480LlM|=UXT=sU3{@5 z4!Xr1l$es4ADo(#np{$(3li1?5#TTby9n&qNT8TK5ErkS93ZsL3KF6~zMm!wy7gf7 zXl8_ij06#OlP!c@ArTTjxmj3^F>dlIVGG`5kbDY|02-$;`Mt0>qwZvOkytjczQoB{ zBAQaDCjR2E$<0qG%}KQ@%A34aBwg2>(c}XICNV*EivCBC_!op^5#wY>(FH6ZKL7yY CpP(lI diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 44c51ca45532de1bb7cbd92a80489b22d6c6700d..956a0439c0aae73f96bfd3f4b44d4a9007088ad9 100644 GIT binary patch delta 1618 zcmaJ>ZA@EL7`~_NZA(i(`0593X`vugTWFy${uoU_V2TpO$WoV-ruQ;oh1T1Gp^~*R zlN9Y(=TXOEH0mPG*f~k#k7bfM6EmkV6oPSS%v{tT`o}Oe`{NIN&uJ^9CZ3z~#ZAVg)Z?MVwkfG&-f6>_(URx7jtMGxDR0$7blu3 z^5P0!QsUVPURvU16}-H}R~_JMAP1+I5*=fG5=hR@Nbv(|U5igf4SBf+z6xBlbi#1T zY&G^M>JseCzM>iws-HTc5(UCG^(a-^IFho*F~U#UDDK4WUj4@o2^-w zz#FjfqfWh8m953s+UiW~jIJDmtK;gq240fY6_t3?X-w#|h68e0WdGRGU+MyGqlx5}!4u zJ-0P2sfArl%Z0#a=u1!jsmZ)1u&oK~Y68iTn>t5kYFFp@xGk^i-`4f->iUyoIeVi= z#J&s_&(cZFnpaQ~+q#TcYtf-+al2)_;S_0Xl7NgrfIt$TwhSni$&tVm{@${MmUG#r zErc*$vW=n)zF}))Ujye7{=>G0R&ly{MEeHV@v6~qV6HP7Sm2ZR=jQj6G=Z1ITBWHk zwy4mH_)5zYt<*zqKv*Skj=&^=gOzyfwq6ofumTiRet$3&h(?2aDCGA$knk3;QSx(m zP%scxrVO#%vR#9q(7zjuxl64{5qbr?+YPlBK=6TBxQFQC1YGo!dbRy&b_2|FbWrk+ z(J!*(to)(U0E5cRQXNq(#%w2p})0BY{OB48;h1Ff4F1e?bz05eWO8O_DqZ zo7!-=6z2&^AeH;YaTu}W7(7#B!k@HibAkKr6`^Z5?HX2Y65S;NpW<7ti|lncUV$o; z+60^&qJngRpX0&;+?uV+jjrOyyIxQxiN24(4ScIBrnpRw1m4aabw?1ojKA^xgg(L> z-OVUP2T;{B!F~&Z>vRB%Jx6LzfCb@Y5h2XY2VV%*zQ*<5K|77v45ESzn&+n@ zv0}#WfGRbQpZ8i6JH#gNIeyoB9_`?v-q#!G1nFhbInY=;_)f0{{gBi2S&-9!ynD=l UAvKi_-68y+`%W)Da_IMe0NQMoH2?qr delta 1044 zcmZXRUr5tY6vuye?zictQ%mPIb(;Uk|1IbGOGJtqnxF>OD(2c|S<9`T(@G7s{F7u> z9?OCvLY##L$pa&S2G$G zrs8lMlK0m6<0mvKt!z7kJG=pkH5#pzmvOG3a|%+>a4B&W3{T=>Geb5-R2WgOsyNOW zgr9tz_wyV##)DCzD|czoq43Mlfpc|O!#8abv3ZkmrC*L2IM*^FrHn0*qljf&!EV-T zqnzqa&Km6ut>V(d0?KNSaK6lQ29E1Ya6KsxmUPwpWlTN_CHhzF7_8{Cm=>nPqZKvi z6W^kLQlw=xnGJ*4i2IlU1+W*FE2{K&XeC^aixl0X}1y!I=C z$L+QWE{8{ON__<6ZoC6w{X{ji(Z<90GqY8X$Vs>=E@U2NJeiKWk+EV?_Ffr#10A`= z>M7DZBfN(B+!y>bnlGViM|(sITIsTYqRCb7^a%KNc(;&aieZybWV)tqr5p?41I(Lz zDv?aWJ+We^m+@p`v1s_3H^WB3Z{Ef_pgqX~E9Po`4ufyOn(vNmMhmMby@JQt=p>$N+4Jik+4T*Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index a072fe6e0c1832e1ebd234378e212591491a50af..2b8987de3a64f4c99574c48c0a0d67bcff01daa5 100644 GIT binary patch delta 465 zcmey*`+-k=IWI340}y;<>CT+T%E0g##DM`}DC6^kiR%6=xq?xG6U#m`3#Ld+ydcUd znaYzQ1!OQwr}9po$0*6nmm&uemrvzSQ2;WG6;lOLl-953lb}f@^fx7=ScgNfs88_W@2FYz|6?Vc!NRa0xJ5zB*4h@ zfq@o8Ahk_Zn|y%v48PI>zYCV07g)S5vUpu#@tWMqmd!6Oz|Yjc4T42dKo0`|?0Ip; delta 379 zcmeys_n%jNIWI340}wc|bY|MIGB7*_abQ3Q%J_U}qPqXYs?Ur(lk*rQnR!#BCN2C z$q3@`O;%vKKbfET$7EHO5=NoPvsmIM|6}p3mj+6L6cm33k{_5E85wUd$Xq~0ADH+V knLaSkf^esfsVbAD+0IP<%a+0~%g@i$zzu>$l0a_(0CgHu?EnA( diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index ff36ed9f9d5ade452c7cbb52d677e828f84f3e3c..37788abab175728a99897d6d482925784fc942ed 100644 GIT binary patch delta 9050 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 literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index b7d56a2..aafdec0 100644 --- a/core/models.py +++ b/core/models.py @@ -74,12 +74,23 @@ class Team(models.Model): return self.name class WorkLog(models.Model): + OT_CHOICES = [ + (Decimal('0'), 'None'), + (Decimal('0.25'), '1/4 Day'), + (Decimal('0.5'), '1/2 Day'), + (Decimal('0.75'), '3/4 Day'), + (Decimal('1.0'), 'Full Day'), + ] + date = models.DateField() project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='logs') team = models.ForeignKey(Team, on_delete=models.SET_NULL, null=True, blank=True, related_name='work_logs') workers = models.ManyToManyField(Worker, related_name='work_logs') supervisor = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) notes = models.TextField(blank=True) + + overtime = models.DecimalField(max_digits=3, decimal_places=2, default=0, choices=OT_CHOICES) + overtime_priced = models.BooleanField(default=False) class Meta: verbose_name = "Work Log / Attendance" diff --git a/core/templates/core/log_attendance.html b/core/templates/core/log_attendance.html index 83b13b4..0328b9e 100644 --- a/core/templates/core/log_attendance.html +++ b/core/templates/core/log_attendance.html @@ -56,6 +56,18 @@ + +
+
+ + {{ form.overtime }} +
Optional — extra time beyond the standard day
+ {% if form.overtime.errors %} +
{{ form.overtime.errors }}
+ {% endif %} +
+
+
@@ -288,4 +300,4 @@ form.submit(); } -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/payroll_dashboard.html b/core/templates/core/payroll_dashboard.html index 88bd432..fedc41e 100644 --- a/core/templates/core/payroll_dashboard.html +++ b/core/templates/core/payroll_dashboard.html @@ -120,7 +120,12 @@ {% for item in workers_data %} -
{{ item.worker.name }}
+
+ {{ item.worker.name }} + {% if item.ot_hours_unpriced > 0 %} + OT: {{ item.ot_hours_unpriced|floatformat:2 }} Days + {% endif %} +
ID: {{ item.worker.id_no }}
{% if item.adjustments %}
@@ -146,6 +151,12 @@ {% if item.total_payable > 0 %}
+ {% if item.ot_hours_unpriced > 0 %} + + {% endif %}
@@ -292,6 +303,48 @@
+ + +