diff --git a/core/templates/core/payroll_dashboard.html b/core/templates/core/payroll_dashboard.html index c819866..3e36a0b 100644 --- a/core/templates/core/payroll_dashboard.html +++ b/core/templates/core/payroll_dashboard.html @@ -30,15 +30,39 @@ {# --- Left column: stat cards --- #}
- {# Outstanding Total #} + {# Outstanding Total — with breakdown of wages vs adjustments #}
-
+
Outstanding Payments
R {{ outstanding_total|floatformat:2 }}
+ {# === BREAKDOWN — only shown when there are pending adjustments === #} + {% if pending_adj_add_total or pending_adj_sub_total %} +
+
+ Unpaid wages + R {{ unpaid_wages_total|floatformat:2 }} +
+ {% if pending_adj_add_total %} +
+ + Additions + R {{ pending_adj_add_total|floatformat:2 }} +
+ {% endif %} + {% if pending_adj_sub_total %} +
+ - Deductions + -R {{ pending_adj_sub_total|floatformat:2 }} +
+ {% endif %} +
+ {% endif %} +
+ Loan repayments deducted at payment time +
diff --git a/core/views.py b/core/views.py index f2596d4..29c4eb1 100644 --- a/core/views.py +++ b/core/views.py @@ -781,6 +781,10 @@ def payroll_dashboard(request): workers_data = [] outstanding_total = Decimal('0.00') + # === OUTSTANDING BREAKDOWN (same as home dashboard) === + unpaid_wages_total = Decimal('0.00') # Pure daily rates for unpaid workers + pending_adj_add_total = Decimal('0.00') # Unpaid additive adjustments + pending_adj_sub_total = Decimal('0.00') # Unpaid deductive adjustments all_ot_data = [] # For the Price Overtime modal for worker in active_workers: @@ -817,11 +821,15 @@ def payroll_dashboard(request): # Calculate net adjustment amount pending_adjs = worker.pending_adjustments_list adj_total = Decimal('0.00') + worker_adj_add = Decimal('0.00') + worker_adj_sub = Decimal('0.00') for adj in pending_adjs: if adj.type in ADDITIVE_TYPES: adj_total += adj.amount + worker_adj_add += adj.amount elif adj.type in DEDUCTIVE_TYPES: adj_total -= adj.amount + worker_adj_sub += adj.amount total_payable = log_amount + adj_total @@ -839,6 +847,9 @@ def payroll_dashboard(request): 'day_rate': float(worker.daily_rate), }) outstanding_total += max(total_payable, Decimal('0.00')) + unpaid_wages_total += log_amount + pending_adj_add_total += worker_adj_add + pending_adj_sub_total += worker_adj_sub # --- Payment history --- paid_records = PayrollRecord.objects.select_related( @@ -1059,6 +1070,9 @@ def payroll_dashboard(request): 'workers_data': workers_data, 'paid_records': paid_records, 'outstanding_total': outstanding_total, + 'unpaid_wages_total': unpaid_wages_total, + 'pending_adj_add_total': pending_adj_add_total, + 'pending_adj_sub_total': pending_adj_sub_total, 'recent_payments_total': recent_payments_total, 'outstanding_project_costs': outstanding_project_costs, 'active_tab': status_filter,