- Profile page split into Account, Security, Appearance tabs - Security tab: change password + set/change/remove POS PIN - Warning banner with link to Security tab when no PIN is set - /auth/me returns employeeNumber and hasPin - Migration 0046: Postgres trigger auto-assigns sequential employee numbers starting at 1001, backfills existing users - Added shadcn Alert component Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
32 lines
1.0 KiB
PL/PgSQL
32 lines
1.0 KiB
PL/PgSQL
-- Auto-assign employee_number on user insert if not provided
|
|
CREATE OR REPLACE FUNCTION assign_employee_number()
|
|
RETURNS TRIGGER AS $$
|
|
DECLARE next_num INT;
|
|
BEGIN
|
|
IF NEW.employee_number IS NULL OR NEW.employee_number = '' THEN
|
|
SELECT COALESCE(MAX(employee_number::int), 1000) + 1
|
|
INTO next_num
|
|
FROM "user"
|
|
WHERE employee_number ~ '^\d+$';
|
|
NEW.employee_number := next_num::text;
|
|
END IF;
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
DROP TRIGGER IF EXISTS trg_assign_employee_number ON "user";
|
|
CREATE TRIGGER trg_assign_employee_number
|
|
BEFORE INSERT ON "user"
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION assign_employee_number();
|
|
|
|
-- Backfill any users missing an employee number
|
|
DO $$ DECLARE r RECORD; num INT;
|
|
BEGIN
|
|
SELECT COALESCE(MAX(employee_number::int), 1000) INTO num FROM "user" WHERE employee_number ~ '^\d+$';
|
|
FOR r IN (SELECT id FROM "user" WHERE employee_number IS NULL OR employee_number = '' ORDER BY created_at) LOOP
|
|
num := num + 1;
|
|
UPDATE "user" SET employee_number = num::text WHERE id = r.id;
|
|
END LOOP;
|
|
END $$;
|