From bcf2bc58dd0e894e766ac28a832cef888cfac279 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 3 Feb 2026 20:11:39 +0000 Subject: [PATCH] ver 4 --- config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5577 bytes config/settings.py | 3 +- core/__pycache__/models.cpython-311.pyc | Bin 5024 -> 6010 bytes core/__pycache__/urls.cpython-311.pyc | Bin 541 -> 1155 bytes core/__pycache__/views.cpython-311.pyc | Bin 3549 -> 11986 bytes core/migrations/0004_payrollrecord.py | 26 +++ .../0004_payrollrecord.cpython-311.pyc | Bin 0 -> 1751 bytes core/models.py | 13 +- core/templates/base.html | 21 +- core/templates/core/index.html | 101 ++++++---- core/templates/core/manage_resources.html | 175 ++++++++++++++++ core/templates/core/payroll_dashboard.html | 175 ++++++++++++++++ core/templates/core/payslip.html | 82 ++++++++ core/urls.py | 16 +- core/views.py | 188 +++++++++++++++++- 15 files changed, 755 insertions(+), 45 deletions(-) create mode 100644 core/migrations/0004_payrollrecord.py create mode 100644 core/migrations/__pycache__/0004_payrollrecord.cpython-311.pyc create mode 100644 core/templates/core/manage_resources.html create mode 100644 core/templates/core/payroll_dashboard.html create mode 100644 core/templates/core/payslip.html diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 96bce5584823cd4ebfccfc40c2b36df8beaee7db..e41f3018111e9771cdbc67fa18dfc3d15bde0ca2 100644 GIT binary patch delta 89 zcmdm>eNvluIWI340}%W(ZOTmA$lJxi$T4{a$27?*@szB@y!3p%Y6A delta 63 zcmX@9y+NCIIWI340}xbw%g=P#$lJxi$Ub=n$F$AvoX=PpS8dkgXJ!%P5Muhk03#as MK8S2~5^iS#06=>YO#lD@ diff --git a/config/settings.py b/config/settings.py index 291d043..9bcef28 100644 --- a/config/settings.py +++ b/config/settings.py @@ -55,6 +55,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.humanize', 'core', ] @@ -179,4 +180,4 @@ if EMAIL_USE_SSL: # Default primary key field type # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' \ No newline at end of file diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index b221b6f89a8889d337bde57394fc060ff72e63e7..b0be599f16f4995bc2707e22b4956a7a89676277 100644 GIT binary patch delta 2146 zcmai#O>7fK6vub{xodm9UME04AQ)Oq+(IDKg``1lL(`-bY9X3}VnjC^b{jdhynLU#eu3lB$`$N(MoBdG*NSi1eNHqhu(UyB_GVHNWF02M%5lFF711>b|}H3Ywyo9 z|9Lw*@6CJT<-L!4!rx0$fP*WT{3QDzuoP}{#rdV~WQWe_-kgvZGa}EqxDihGUFLMZ z!A}L27PrYkCJ7*k4JpK=07$`xBrz!jlGKpGObUY}Hzb)!5s;L+?e!vgLN3|B2^Abgw(lx6&`&`#RfU`Kui1fFII^5F7B*-`rM!4WNdP zQ`2*gm+5iu3!M_0y#!e0?T|KOnQFnDRW)5F3KgaOJ68ELjCcxK-XL4StjGgm&MVq! z#oKxq)ju(OC9Wp7d_Gqe+SoGEi3sTgnQTYwK)4YxL@(|1WqNi)(-yNuRl8tiFBt@# zATJ`G_z}l0LZ&x-*L`dtetXED=DYUdP&eS=A;9Roczh_9p2<%bB;h79T^A1cWHd?9 z2SUoX51R^2h=miI9I*vmn^TEq8T0a4lYC^5o`$ds9x9@FiThn{smi;*JG*k`8}+7I zk&|U1Nje}%J(&YI^+Cj@nVCoP;rgViTC|9&?mdrIU|2Q9gj`O(mR}lmBnv^`$Bmzxc zPU9npZu*aO!*Mx%dnGLL-9b=oaTfMi&6$%$ativRkSypSIgP+lAPIU;HeT+ zu)PJ-GKx*T9%BVR23CjYHsxEV;IYdJ{^#&^`YC^K!4Rj|Ne4Q&=Dr2R`~wy=yE1T~ z8SW{J1-o>Q?p^cUa)Axp&Xs}V3~a)Uz9H-WHDQxYgxM$!8(mxr)Zg@BW16TQyv$`< z^bj0zk}aLm=7^cgoi;9*M7QN>r>hdyFB04~g7c9#5QBh(iyXuDn*iHCtz~sJTX6Q1 z?1LiT>C$=nnX7%l^)WZKvHa`Y*B*GIJ3SwSSLTg^6|>CPyeDQBVhOkH!^|)UVLQ+E zspRffl{_=vHD$A+$i7)!9krVOd*}G%q$VeqJQjLt1j@Ohui(9M8p7mr|>8mJxRi&@= z&La=+ef<&lESx_ATx>d_&|j4E=R*3FR+uzN7bbMNF6+YoK_M8qrhH8n>(b^q2k^z5iOPz{3Kc#p3W6C;veGuO@?R G_5T7FlF+XJ delta 1251 zcmaiz&rcIU6vuaHyXly+^vwo7J<22O^U z=)p^!lksBW0UKjt!pZ-_goE0|L@p*=j7ATJlk=V0ib;b#d^+=;w{PeB-rN1i^FDpc z>(wOw+d00u{9P&Pp@yGQu|KLeNEf8E>w%P(O|qgeowWK?p*3<%scD+fRIX_?%`G%H z*E}`NBQ!79^s3hAP5b60!_TgeQIaY)1-D<3w}iNv>Bx})+i{%i2=R-RB-+ORXe*#p zA+vU8K@$hi@Hl(z{77{6(A6z_5N5D9u4dwAVQnx|BC!%FJM+n$NrU{*CLG~PPP}Bp zH%F}%GgXKr5_W+m5(xT%!rYfW_yUjD-zgz+jhNx5?OdiEz)`>fbOFQcro0e2#+PMv z*-j)=h2^^@MSj{1{Pod;Eugbq`I#&ZdbT$kW2CbeM|~W7BOLJ!b>@6Hww7Bmso|hH z`>G7dIzlE`w>l{gVCiQWHSam-i|wkNB>Y6{B5mA%WFdmEA>d#X_QJh>-J*9)S~Y(H z2d4mBEM^1_v;0yUoSs7L8DJDZ1?U(@Sy`pls!0p$bQ)T{QjFsO2(b?LUZoV{O!NGj zs#T)wDwxTfT_O~XjhDT-WImZO(+MFPPU_||@9tVQOAVwG{r^)MZhz@N_C0Z)zG_~? z9x#985c7Cf6c}gkz0r|66{u@@7LNdZY(jrgu{^u|MOR5bMy{;hn^`W5`txVO_7~Asq2I_Q^efBrszJ)w-K+I()R*OKz8&>mx z3|s}S0hrISD{mD{yROX}2m(+|`zZ^%gUo7rg?8RuBST=qhC?A%PNFpH;^|CS9ES*WI>{n)IMMzAD zCyw6a=t(j9V`h^*kiB~1)`S};XSPL9d-dJj*_r2gKc07HzLv{HBy92Fhu(uMLO+rb1LaF_Nhg4Ns0_rbrQA z`9K#iGG*+xT2z_-};sn{UYP!rhp9FmONUe~l3BQCbw4oS+p9^Ek|X!in^ zOgNTnb%{wy;Dxk9f@Fqy-L8F!m;tj`7$jBS+M}Lro7f7rw>*pDq~cRggaoFb9OANM zTucJH=bM-?t7j*O=7z#t%OU#}QMP%hMW=be?iZz^rl10y79>y|Xlnk}q*GPm_y55M zQuT#^(Rs(i#5UQUPnPtBp3CO_oh6-WGEf~#*QvZ;`?ZUu_zzsA0z%Cm77-=sa^s4N zZ0Jfxc@Z}nV@V0WvD~gV7g9T*@+Kv@w>`2Oq%EhNrQM{`QyFRTG(D9$l9GrN=fwzh zgKy|eKfz+!%cDGpdIa?t>L;Kcta5GkXoKHtb6AOB zC5Dw0J*<6vf4t106+tV8*3h%YZ_e>YPdThbuolDG5MJcVulQ@mA&el5Asl3w<DUeTc2Itdd6Wrg7p~I`&F%yIVj18PKo{d1@t01 AM*si- delta 192 zcmZqXoXeuIoR^o20SL0Cn=&~V85kaeI55BtWqht+n5dyNF)lzZojHmvg*%u*ljkK! zPLuH#OF?2u#!H}122JM4evE39FEN@j`)RUIUdyC0`5lw5ivUmxBwgG9Bt9@RGBVy^ jkhy@0ZZMc#z>PkzO+LzOC-8xtg`cT`8w88^fMx*z@S!Z( diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index fca06b7aa8459d0cfa7b050ed4a1889f3dbbd9f7..28f5090ce3e07a17f536338ef935d866e1d8e62e 100644 GIT binary patch literal 11986 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 BKL!8* delta 972 zcmah{&rcIU6yDu-w_CQ|rKJ`uh>IY&M$w>&iUbcvNYr@IMAAr_(p_L-w~KGKfTRRs zjEM(ha84$iHHIT+58gZyFE(TN1B{m@#)~K4Y(aw;C)00V-;Zy;H*Y>q?|19((&;t< zSFZo5dsW@iyTr|{q1)GGTk$kMRZRKmV%pb>x^EN>QLtq@;kEmjVg_yXnNZByNyHAj z4KZhn_XSI%x_Bq?O+-#BPG5=Upd~WxVE~JFgSm+S{0a{pE(MJk{(el+uh|>)qVy?W z7wb|zR*#3qVUi#$sI>2R{;VC}me=L5<8PpjlIrqXq}bs!(Lxaly{wE&mP{MUcs}$!s|}Kv$r8cLf>Q|zlPf{38Unuv&^V-cSPj5-pfvLYxJnkQ1}nf1 zu@sg7=W)#;A!K-VmID_BIRuud1l7=44GAwZP5MC{)lQ(v>B*KrrR1XlMJNn43TGOf zr*Q9gncJy1`nKNG6hmnW2%D2X_1zB5jb(Y|1H8hdOG@QR=q@|-xn9)L=mwKRAN{Tm zZVaHwR8n4cO8$rsaUO|U$@73R>w2LBEQKVbw&XyK;J?HQPQ?MjwB@pg?UX#1ge=Yx zPV=((0tu>2wrlW@nL)daW}W(;;ajCK?wi3g(CkH2>EMWAEnXK#({3IEv*p?B}-ZpL--N>lg) SCcQV@-!4evgxHKQI{7!Uw)0B> diff --git a/core/migrations/0004_payrollrecord.py b/core/migrations/0004_payrollrecord.py new file mode 100644 index 0000000..f02c761 --- /dev/null +++ b/core/migrations/0004_payrollrecord.py @@ -0,0 +1,26 @@ +# Generated by Django 5.2.7 on 2026-02-03 17:44 + +import django.db.models.deletion +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_project_is_active_team_is_active_worker_is_active'), + ] + + operations = [ + migrations.CreateModel( + name='PayrollRecord', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(default=django.utils.timezone.now)), + ('amount', models.DecimalField(decimal_places=2, max_digits=10)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('work_logs', models.ManyToManyField(related_name='paid_in', to='core.worklog')), + ('worker', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payroll_records', to='core.worker')), + ], + ), + ] diff --git a/core/migrations/__pycache__/0004_payrollrecord.cpython-311.pyc b/core/migrations/__pycache__/0004_payrollrecord.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45a2dafcd72adfaddcede5e1ca1989487c6c4845 GIT binary patch literal 1751 zcmZux%}*Og6rWw&>kn+O3B+|xaVkYs9U&V93Wrve2*jwx1k`Y-eCTxXjNNtCyYB9q zU=9_kdgw8?@)uB5_>e;mIp&z-BJIJNQ>C7`8Nn&1yqWcyMr3wp=Djy>-n{pFZ|3h* zDuJM-mw(s7VTAtUOwb}D;;IV7Ux*+g>8K`&Sr)UbhuYy-EUwaAuOZ<37H_te(F>PE$CydNud=)0oe4XZdpnTovC0K$&l&(om-Y>gjPDx z0*^BReS>yudMvvWP-K?e?PovCLql#V{ZBqT0}!1dImphZEWRCN1yU5Qn-*m&i;Ig( zxMP_uT6eH!W3}#R2NXM0ZU2vbZd%W%bt7P@UA1SKy8Z(NGla<+*{d-5yNzO)CDpED z;<`muhY~i?v9z{o_3$&=V{w~WnyPC@lqC~0;6q$O6iPqE{phxFn)d4fU3x@d|tAwyP_a5tJ(`M0* zsu8RiM@b%ii7$X0Y$q+MbANqzWXEKRA2XZk_>p2uglZp6jJHy&7-DhLz);`Rp;jLJ zwB~$g!y+!Fp;4XKPl~fFhJ|g6Sps9Y5?!4Foy7RpuBvlo&Jo(72BAh>qqfDb7n@iY zKyLFpWbsmG$wyjq4Ir*?(=5ILZu_J{TB^}BS)}V|y3Jya)}}|ML0JfpV95<1JzqD) zx9x#~&rWTtMsLsLqc2EQ03WSsY(ds!vd>~7M7Yl^y1w>weQo10OPC!xy5s+#EAR}x zdtCm-Y}0agA5zyX(?ePZKdmxH((XXc${f1#&D&6h>RZMmfPH*Rou0*C88PsSY)`@U zJRW~T1;w|dVMv})j;q52iWmM&c(M6G=H9=VSvULO#etW7@H+hVzFWhtVYylRJZpPd z+f6%zOxDd6PwslT;>#~yEqD(%y@y+Fu6mxUdbz5b-X3IfZoYJ~;^j-P)whq_{LXoP z$II`y>D@u*Gqtq z7_Rv+3?-+PMG+rw6NM&f%SZkz zZd{zO3e>yUH-5E#YkdtYe=BVRhG9sOB*=#Jxr^@k{{YRo!9PG>x*z+8%Cw{m(e2?y Q!b{)3 - {% block title %}LabourFlow - Work & Payroll{% endblock %} + {% block title %}Fox Fitt - Work & Payroll{% endblock %} {% if project_description %} {% endif %} @@ -23,7 +23,7 @@
+ {% if messages %} +
+ {% for message in messages %} + + {% endfor %} +
+ {% endif %} + {% block content %}{% endblock %}
- © 2026 LabourFlow Management System. All rights reserved. + © 2026 Fox Fitt Management System. All rights reserved.
- + \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index ff32edd..d35183c 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,7 +1,7 @@ {% extends 'base.html' %} -{% load static %} +{% load static humanize %} -{% block title %}Dashboard | LabourFlow{% endblock %} +{% block title %}Dashboard | Fox Fitt{% endblock %} {% block content %}
@@ -21,43 +21,44 @@
-
- + +
-
+
+
+
+

Outstanding Payments

+

R {{ outstanding_total|intcomma }}

+
+
+ +
+
+ View details → +
+
+
+
+
+
+

Paid (Last 60 Days)

+

R {{ recent_payments_total|intcomma }}

+
+
+ +
+
+
+
+
+

Active Workers

{{ workers_count }}

-
- -
-
-
-
-
-
-
-
-

Projects

-

{{ projects_count }}

-
-
- -
-
-
-
-
-
-
-
-

Teams

-

{{ teams_count }}

-
-
- +
+
@@ -66,6 +67,34 @@
+ +
+

Project Costs (Active)

+ {% if project_costs %} +
+ + + + + + + + + {% for p in project_costs %} + + + + + {% endfor %} + +
Project NameTotal Labor Cost
{{ p.name }}R {{ p.cost|intcomma }}
+
+ {% else %} +

No cost data available for active projects.

+ {% endif %} +
+ +

Recent Daily Logs

@@ -109,6 +138,9 @@

Quick Links