Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Pulse360_Runtime_Bug_Fixes_2026-08-08.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
- Removed `next/font/google` usage so production builds do not depend on fetching Google Fonts.
- Added dedicated event projection tables for auth, profile updates, AI usage, AI HITL decisions, nominations, and reviews while keeping `audit_log` as the immutable governance feed.
- Added HR-editable employee workforce fields: `employment_type`, `conversion_hire_status`, `gender`, and `ethnicity`.
- Seeded realistic workforce and gender segments for MVP 2 dashboards: 44 permanent, 6 learnership, 3 internship, 4 contract; 33 male, 19 female, 5 other across non-system employees.
- Updated the System Admin dashboard to read login and AI token metrics from the dedicated event tables and show aggregated gender/employment context without exposing ethnicity.

## Verification
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,72 @@ ALTER TABLE "employee"
ADD COLUMN "gender" "gender",
ADD COLUMN "ethnicity" "ethnicity";

UPDATE "employee" e
SET
"employment_type" = seed."employment_type"::"employment_type",
"conversion_hire_status" = seed."conversion_hire_status"::"conversion_hire_status",
"gender" = seed."gender"::"gender"
FROM (VALUES
('670', 'PERMANENT', 'NO', 'MAN'),
('758', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('673', 'PERMANENT', 'NO', 'MAN'),
('714', 'PERMANENT', 'NO', 'WOMAN'),
('676', 'PERMANENT', 'NO', 'WOMAN'),
('734', 'PERMANENT', 'NO', 'MAN'),
('675', 'PERMANENT', 'NO', 'MAN'),
('680', 'PERMANENT', 'NO', 'MAN'),
('750', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('684', 'PERMANENT', 'NO', 'OTHER'),
('682', 'PERMANENT', 'NO', 'OTHER'),
('681', 'PERMANENT', 'NO', 'MAN'),
('686', 'PERMANENT', 'NO', 'MAN'),
('688', 'PERMANENT', 'NO', 'WOMAN'),
('685', 'PERMANENT', 'NO', 'WOMAN'),
('733', 'PERMANENT', 'NO', 'MAN'),
('691', 'PERMANENT', 'NO', 'OTHER'),
('667', 'PERMANENT', 'NO', 'WOMAN'),
('692', 'PERMANENT', 'NO', 'MAN'),
('693', 'PERMANENT', 'NO', 'MAN'),
('706', 'PERMANENT', 'NO', 'MAN'),
('705', 'INTERNSHIP', 'REVIEWED', 'WOMAN'),
('694', 'CONTRACT', 'NO', 'MAN'),
('696', 'PERMANENT', 'NO', 'WOMAN'),
('697', 'LEARNERSHIP', 'PENDING_DECISION', 'OTHER'),
('698', 'PERMANENT', 'NO', 'MAN'),
('687', 'PERMANENT', 'NO', 'WOMAN'),
('700', 'PERMANENT', 'NO', 'WOMAN'),
('759', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('701', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('702', 'PERMANENT', 'NO', 'MAN'),
('703', 'PERMANENT', 'NO', 'MAN'),
('751', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('704', 'PERMANENT', 'NO', 'MAN'),
('760', 'CONTRACT', 'NO', 'MAN'),
('690', 'PERMANENT', 'NO', 'MAN'),
('683', 'PERMANENT', 'NO', 'MAN'),
('710', 'PERMANENT', 'NO', 'MAN'),
('669', 'PERMANENT', 'NO', 'MAN'),
('671', 'PERMANENT', 'NO', 'MAN'),
('718', 'INTERNSHIP', 'PENDING_DECISION', 'OTHER'),
('708', 'PERMANENT', 'NO', 'MAN'),
('707', 'PERMANENT', 'NO', 'WOMAN'),
('712', 'PERMANENT', 'NO', 'WOMAN'),
('711', 'PERMANENT', 'NO', 'WOMAN'),
('735', 'PERMANENT', 'NO', 'MAN'),
('716', 'PERMANENT', 'NO', 'WOMAN'),
('715', 'INTERNSHIP', 'REVIEWED', 'WOMAN'),
('668', 'PERMANENT', 'NO', 'WOMAN'),
('719', 'CONTRACT', 'NO', 'MAN'),
('720', 'PERMANENT', 'NO', 'WOMAN'),
('677', 'PERMANENT', 'NO', 'WOMAN'),
('722', 'PERMANENT', 'NO', 'WOMAN'),
('723', 'CONTRACT', 'NO', 'MAN'),
('725', 'PERMANENT', 'NO', 'WOMAN'),
('726', 'PERMANENT', 'NO', 'MAN'),
('727', 'PERMANENT', 'NO', 'MAN')
) AS seed("employee_key", "employment_type", "conversion_hire_status", "gender")
WHERE e."employee_key" = seed."employee_key";

CREATE TABLE "auth_event" (
"id" BIGSERIAL NOT NULL,
"actor_id" INTEGER,
Expand Down
70 changes: 70 additions & 0 deletions pulse360/prisma/seed.sql
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,76 @@ FROM (VALUES
JOIN department d ON d.name = e.dept_name
ON CONFLICT (employee_key) DO NOTHING;

-- Workforce and demographic simulation for MVP 2 analytics dashboards.
-- Keeps the demo realistic: 13 of 57 non-system employees are non-permanent,
-- junior roles trend toward learnership/internship, and selected senior
-- consulting roles are contract based.
UPDATE employee e
SET
employment_type = seed.employment_type::employment_type,
conversion_hire_status = seed.conversion_hire_status::conversion_hire_status,
gender = seed.gender::gender
FROM (VALUES
('670', 'PERMANENT', 'NO', 'MAN'),
('758', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('673', 'PERMANENT', 'NO', 'MAN'),
('714', 'PERMANENT', 'NO', 'WOMAN'),
('676', 'PERMANENT', 'NO', 'WOMAN'),
('734', 'PERMANENT', 'NO', 'MAN'),
('675', 'PERMANENT', 'NO', 'MAN'),
('680', 'PERMANENT', 'NO', 'MAN'),
('750', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('684', 'PERMANENT', 'NO', 'OTHER'),
('682', 'PERMANENT', 'NO', 'OTHER'),
('681', 'PERMANENT', 'NO', 'MAN'),
('686', 'PERMANENT', 'NO', 'MAN'),
('688', 'PERMANENT', 'NO', 'WOMAN'),
('685', 'PERMANENT', 'NO', 'WOMAN'),
('733', 'PERMANENT', 'NO', 'MAN'),
('691', 'PERMANENT', 'NO', 'OTHER'),
('667', 'PERMANENT', 'NO', 'WOMAN'),
('692', 'PERMANENT', 'NO', 'MAN'),
('693', 'PERMANENT', 'NO', 'MAN'),
('706', 'PERMANENT', 'NO', 'MAN'),
('705', 'INTERNSHIP', 'REVIEWED', 'WOMAN'),
('694', 'CONTRACT', 'NO', 'MAN'),
('696', 'PERMANENT', 'NO', 'WOMAN'),
('697', 'LEARNERSHIP', 'PENDING_DECISION', 'OTHER'),
('698', 'PERMANENT', 'NO', 'MAN'),
('687', 'PERMANENT', 'NO', 'WOMAN'),
('700', 'PERMANENT', 'NO', 'WOMAN'),
('759', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('701', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('702', 'PERMANENT', 'NO', 'MAN'),
('703', 'PERMANENT', 'NO', 'MAN'),
('751', 'LEARNERSHIP', 'PENDING_DECISION', 'MAN'),
('704', 'PERMANENT', 'NO', 'MAN'),
('760', 'CONTRACT', 'NO', 'MAN'),
('690', 'PERMANENT', 'NO', 'MAN'),
('683', 'PERMANENT', 'NO', 'MAN'),
('710', 'PERMANENT', 'NO', 'MAN'),
('669', 'PERMANENT', 'NO', 'MAN'),
('671', 'PERMANENT', 'NO', 'MAN'),
('718', 'INTERNSHIP', 'PENDING_DECISION', 'OTHER'),
('708', 'PERMANENT', 'NO', 'MAN'),
('707', 'PERMANENT', 'NO', 'WOMAN'),
('712', 'PERMANENT', 'NO', 'WOMAN'),
('711', 'PERMANENT', 'NO', 'WOMAN'),
('735', 'PERMANENT', 'NO', 'MAN'),
('716', 'PERMANENT', 'NO', 'WOMAN'),
('715', 'INTERNSHIP', 'REVIEWED', 'WOMAN'),
('668', 'PERMANENT', 'NO', 'WOMAN'),
('719', 'CONTRACT', 'NO', 'MAN'),
('720', 'PERMANENT', 'NO', 'WOMAN'),
('677', 'PERMANENT', 'NO', 'WOMAN'),
('722', 'PERMANENT', 'NO', 'WOMAN'),
('723', 'CONTRACT', 'NO', 'MAN'),
('725', 'PERMANENT', 'NO', 'WOMAN'),
('726', 'PERMANENT', 'NO', 'MAN'),
('727', 'PERMANENT', 'NO', 'MAN')
) AS seed(employee_key, employment_type, conversion_hire_status, gender)
WHERE e.employee_key = seed.employee_key;

-- ── Pass 2: Resolve manager_id by employee_key ────────────────────────────
UPDATE employee e
SET manager_id = m.id
Expand Down
4 changes: 2 additions & 2 deletions pulse360/src/app/(app)/employees/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
setLoading(false);
}
load();
}, []);

Check warning on line 58 in pulse360/src/app/(app)/employees/[id]/page.tsx

View workflow job for this annotation

GitHub Actions / build

React Hook useEffect has missing dependencies: 'employeeId' and 'isEdit'. Either include them or remove the dependency array

async function handleSubmit(e: React.FormEvent) {
e.preventDefault();
Expand Down Expand Up @@ -173,8 +173,8 @@
<select value={gender} onChange={e => setGender(e.target.value)}
className={inputClass}>
<option value="">Not captured</option>
<option value="WOMAN">Woman</option>
<option value="MAN">Man</option>
<option value="WOMAN">Female</option>
<option value="MAN">Male</option>
<option value="NON_BINARY">Non-binary</option>
<option value="OTHER">Other</option>
<option value="PREFER_NOT_TO_SAY">Prefer not to say</option>
Expand Down
8 changes: 7 additions & 1 deletion pulse360/src/app/(app)/system-admin/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,13 @@ export default async function SystemAdminDashboard() {
}, {});

const genderCounts = employees.reduce<Record<string, number>>((acc, employee) => {
const label = employee.gender?.replace(/_/g, " ").toLowerCase().replace(/\b\w/g, (char) => char.toUpperCase()) ?? "Not captured";
const label = ({
WOMAN: "Female",
MAN: "Male",
NON_BINARY: "Non-binary",
OTHER: "Other",
PREFER_NOT_TO_SAY: "Prefer not to say",
} as Record<string, string>)[employee.gender ?? ""] ?? "Not captured";
acc[label] = (acc[label] ?? 0) + 1;
return acc;
}, {});
Expand Down
Loading