Handover workspace

ERS, Todo, OfferReview, and Docu in one view

Imported from live server docs, code structure, and deployment notes.

Apr 3, 2026, 11:07 AM

review.r32a.com

ERS

ERS is an internal renewal workflow system built with Next.js App Router + Prisma + Postgres.

Healthhealthy

1 services tracked from the deployment snapshot.

RuntimeNext.js 16 + Prisma

main · a82cd01 (2026-02-20)

Docs10

6 generated walkthrough docs are included for faster onboarding.

Owner groupers_prod

Useful when you need to reason about service ownership and filesystem access.

What this app does

Handover summary

ERS handles employee contract renewal cases from HR preparation through manager justification, CEO decision, and signed documentation.

Who uses it

HRManagersCEOAdmins

Core workflows

Create and maintain renewal cases for employees

Collect manager justification and route approvals to leadership

Track documents, signatures, notifications, and audit events

Infra view

Paths and runtime setup

Code path
/srv/apps/ers/prod
Working directory
/srv/apps/ers/prod
Env file
/etc/ers-prod.env
Framework
Next.js
Repo
git@github.com:rrzli/ers.git
App port: 127.0.0.1:3002

Services

What keeps it running

ers-prod.service

active: active · enabled: enabled

active

Docs

Imported handover material

Quick support prompts

Commands and reference points

cd /srv/apps/ers/prodgit -C /srv/apps/ers/prod status -sbgit -C /srv/apps/ers/prod log -1 --onelinesystemctl status ers-prod.servicejournalctl -u ers-prod.service -n 100 --no-pagersystemctl restart ers-prod.service
NODE_ENVHOSTPORTDATABASE_URLAUTH_JWT_SECRETAUTH_COOKIE_NAMEUPLOAD_BASE_DIRUPLOAD_MAX_MBRESEND_API_KEYRESEND_FROM_EMAILEMAIL_FROMOPENAI_API_KEYOPENAI_MODELINTERNAL_API_SECRET

/srv/apps/ers/prod

Code map

Routes and files that matter

PAGE /

app/(app)/page.tsx

page

PAGE /admin/audit

app/(app)/admin/audit/page.tsx

page

PAGE /admin/settings

app/(app)/admin/settings/page.tsx

page

PAGE /admin/users

app/(app)/admin/users/page.tsx

page

GET /api/admin/audit

app/api/admin/audit/route.ts

api

GET /api/admin/settings

app/api/admin/settings/route.ts

api

PATCH /api/admin/settings

app/api/admin/settings/route.ts

api

GET /api/admin/users

app/api/admin/users/route.ts

api

POST /api/admin/users

app/api/admin/users/route.ts

api

DELETE /api/admin/users/:id

app/api/admin/users/[id]/route.ts

api

PATCH /api/admin/users/:id

app/api/admin/users/[id]/route.ts

api

POST /api/auth/impersonate

app/api/auth/impersonate/route.ts

api

POST /api/auth/impersonate/stop

app/api/auth/impersonate/stop/route.ts

api

POST /api/auth/login

app/api/auth/login/route.ts

api

Data model

Core entities

AdminSettings

6 fields

id: String · key: String · valueJson: Json · updatedByUserId: String · updatedByUser: User

model

AuditEntityType

9 values

RENEWAL_CASE · DOCUMENT · JUSTIFICATION · SETTINGS · EMPLOYEE

enum

AuditLog

9 fields

id: String · actorUserId: String · actorUser: User · entityType: AuditEntityType · entityId: String

model

CeoDecision

3 values

NONE · APPROVE · REJECT

enum

CompensationSource

2 values

RENEWAL_APPROVED · MANUAL

enum

Document

13 fields

id: String · renewalCaseId: String · renewalCase: RenewalCase · docType: DocumentType · fileName: String

model

DocumentType

4 values

OFFER_LETTER · SIGNED_OFFER · PERFORMANCE_REPORT · OTHER

enum

EmailOutbox

11 fields

id: String · toEmail: String · subject: String · bodyHtml: String · bodyText: String

model

EmailStatus

3 values

PENDING · SENT · FAILED

enum

Employee

15 fields

id: String · employeeCode: String? · fullName: String · email: String? · department: String

model