diff --git a/Pulse360_Runtime_Bug_Fixes_2026-08-08.md b/Pulse360_Runtime_Bug_Fixes_2026-08-08.md index c2fb5c3..9c02e00 100644 --- a/Pulse360_Runtime_Bug_Fixes_2026-08-08.md +++ b/Pulse360_Runtime_Bug_Fixes_2026-08-08.md @@ -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 diff --git a/pulse360/prisma/migrations/000004_employee_demographics_and_event_tables/migration.sql b/pulse360/prisma/migrations/000004_employee_demographics_and_event_tables/migration.sql index 36e78ac..61436c3 100644 --- a/pulse360/prisma/migrations/000004_employee_demographics_and_event_tables/migration.sql +++ b/pulse360/prisma/migrations/000004_employee_demographics_and_event_tables/migration.sql @@ -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, diff --git a/pulse360/prisma/seed.sql b/pulse360/prisma/seed.sql index d3345b2..7de49dd 100644 --- a/pulse360/prisma/seed.sql +++ b/pulse360/prisma/seed.sql @@ -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 diff --git a/pulse360/src/app/(app)/employees/[id]/page.tsx b/pulse360/src/app/(app)/employees/[id]/page.tsx index 789f968..0df4086 100644 --- a/pulse360/src/app/(app)/employees/[id]/page.tsx +++ b/pulse360/src/app/(app)/employees/[id]/page.tsx @@ -173,8 +173,8 @@ export default function EmployeeFormPage() {