From a2c35d0a93e84f4cbd807c2119ab18ade2fe89a8 Mon Sep 17 00:00:00 2001 From: Hardik Date: Wed, 27 May 2026 15:02:50 +0530 Subject: [PATCH] feat(admin): auto-generate structured IDs for users, vendors, accounts and cost centres Users: employeeId auto-generated from role prefix (TCH/MAN/ACC/MGR/SUP/AUD/ADM) followed by next sequential number; shown read-only in edit form, removed from create form. Cost Centres: new code field (SITE-001 ...) added to Vessel model with migration + backfill; auto-generated on create, read-only in edit. Vendors and Accounts: code/vendorId inputs pre-filled with the next suggested ID (VND-001, ACC-001) from the server page; user can override with any PREFIX-NUMBER format, validated by regex. Co-Authored-By: Claude Sonnet 4.6 --- .../(portal)/admin/accounts/account-form.tsx | 10 +++---- App/app/(portal)/admin/accounts/actions.ts | 2 +- App/app/(portal)/admin/accounts/page.tsx | 5 +++- App/app/(portal)/admin/users/actions.ts | 23 +++++++++------- App/app/(portal)/admin/users/user-form.tsx | 23 +++++++++++----- App/app/(portal)/admin/vendors/actions.ts | 2 +- App/app/(portal)/admin/vendors/page.tsx | 5 +++- .../(portal)/admin/vendors/vendor-form.tsx | 8 +++--- App/app/(portal)/admin/vessels/actions.ts | 6 ++++- App/app/(portal)/admin/vessels/page.tsx | 5 +++- .../(portal)/admin/vessels/vessel-form.tsx | 7 +++++ App/lib/id-generators.ts | 21 +++++++++++++++ .../20260527010000_vessel_code/migration.sql | 12 +++++++++ App/prisma/schema.prisma | 1 + App/prisma/seed.ts | 26 +++++++++---------- Progress/TODO.md | 26 +++++++++---------- 16 files changed, 125 insertions(+), 57 deletions(-) create mode 100644 App/lib/id-generators.ts create mode 100644 App/prisma/migrations/20260527010000_vessel_code/migration.sql diff --git a/App/app/(portal)/admin/accounts/account-form.tsx b/App/app/(portal)/admin/accounts/account-form.tsx index a2311bb..894e9da 100644 --- a/App/app/(portal)/admin/accounts/account-form.tsx +++ b/App/app/(portal)/admin/accounts/account-form.tsx @@ -13,15 +13,15 @@ type AccountRow = { isActive: boolean; }; -function AccountFormFields({ account }: { account?: AccountRow }) { +function AccountFormFields({ account, suggestedCode }: { account?: AccountRow; suggestedCode?: string }) { return (
- + placeholder="e.g. ACC-001" />
@@ -38,7 +38,7 @@ function AccountFormFields({ account }: { account?: AccountRow }) { ); } -export function AddAccountButton() { +export function AddAccountButton({ suggestedCode }: { suggestedCode?: string }) { const router = useRouter(); const [open, setOpen] = useState(false); const [pending, setPending] = useState(false); @@ -61,7 +61,7 @@ export function AddAccountButton() { setOpen(false)}>
- + {error &&

{error}

}
setOpen(false)}> - + {error &&

{error}

}