From 88a3a1e1be3790be7a3b6ab12ef2ac33cb659418 Mon Sep 17 00:00:00 2001 From: DEls Date: Mon, 26 Oct 2026 01:10:08 +0200 Subject: [PATCH] feat(workforce): keep the hourly rate off the workers roster MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Rate / hr column put every worker's wage on a wide table that is glanceable, projected and exported. The rate already lives on the worker detail page, where it is a deliberate lookup. Drop the column from the roster and the rate from its CSV export — the export is the wider accidental leak, since that file gets emailed and opened on shared machines. Site managers can still see a worker's rate by opening the worker, which stays deliberate access. --- .../dashboard/workforce/workers/employees-view.test.tsx | 4 +++- src/app/dashboard/workforce/workers/employees-view.tsx | 8 -------- src/app/dashboard/workforce/workers/page.tsx | 1 - 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/app/dashboard/workforce/workers/employees-view.test.tsx b/src/app/dashboard/workforce/workers/employees-view.test.tsx index 4f31e1e..e5ff1d0 100644 --- a/src/app/dashboard/workforce/workers/employees-view.test.tsx +++ b/src/app/dashboard/workforce/workers/employees-view.test.tsx @@ -7,7 +7,7 @@ import { EmployeesView } from "./employees-view"; it("keeps worker assignments read-only until the edit sheet is opened", () => { const html = renderToStaticMarkup(); expect(html).toContain("Labour broker"); @@ -20,4 +20,6 @@ it("keeps worker assignments read-only until the edit sheet is opened", () => { const roster = html.slice(html.indexOf("")); expect(roster).not.toContain("Position / type {showSiteColumn && Project} Employer/Broker - Rate / hr Worker actions @@ -266,9 +263,6 @@ export function EmployeesView({ )} {r.employerName || "Unassigned"} - - {formatCurrency(r.ratePerHour)} - event.stopPropagation()}> a.employee === r.id && a.site === r.siteId)} /> @@ -348,7 +342,6 @@ function exportCsv(rows: EmployeeRow[]) { "worker_type", "position", "project_code", - "rate_per_hour", "employer_broker", ]; const lines = [headers.join(",")]; @@ -360,7 +353,6 @@ function exportCsv(rows: EmployeeRow[]) { r.workerType, csvCell(r.position), csvCell(r.projectCode), - r.ratePerHour.toFixed(2), csvCell(r.employerName || "Unassigned"), ].join(","), ); diff --git a/src/app/dashboard/workforce/workers/page.tsx b/src/app/dashboard/workforce/workers/page.tsx index 6500a14..8058571 100644 --- a/src/app/dashboard/workforce/workers/page.tsx +++ b/src/app/dashboard/workforce/workers/page.tsx @@ -67,7 +67,6 @@ export default async function EmployeesPage({ duplicateBadge: (badgeCounts.get(String(e.employee_no||"").trim().toUpperCase())||0)>1, position: e.position, workerType: e.worker_type, - ratePerHour: e.rate_per_hour || 0, projectCode: e.expand?.site?.project_code ?? siteById.get(e.site)?.project_code ?? "", }));