feat(crewing): EPFO/UAN assisted verification (GstService pattern, flagged) #89
No reviewers
Labels
No labels
bug
claude-failed
claude-pr
claude-queue
claude-working
epic
feature
interactive
portal
triaged
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: shad0w/pelagia-portal#89
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/crewing-epfo"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Crewing — EPFO / UAN assisted verification (GstService pattern)
Builds EPFO/UAN verification the same way GST works (per spec A3 — "EPFO proxy microservice, GstService pattern"). Stacks on #88 (follow-ups); base
feat/crewing-followups. BehindNEXT_PUBLIC_CREWING_ENABLED.What's in
EpfoService/— new standalone microservice mirroringGstService(Express + Playwright). EPFO is OTP-gated (no anonymous captcha lookup like GST), so the handshake is two steps:POST /otp {uan}→ session + OTP request;POST /verify {sessionId,uan,otp}→ member record;GET /health. The live portal navigation is stubbed behindEPFO_LIVE(default STUB: OTP000000→ matched) until the real selectors/OTP are validated against a live session./api/epfo/otp+/api/epfo(gated byverify_bank_epf) →EPFO_SERVICE_URL.EpfDetail += epfoMemberName + epfoCheckedAt;recordEpfoCheckpersists the lookup result + audit.Aadhaar — intentionally not handled
UIDAI restricts Aadhaar verification to licensed AUA/KUA via consented e-KYC; it can't be portal-scraped. Aadhaar stays assisted-manual (only
aadhaarLast4stored, masked). TheEpfoServiceREADME spells this out.Tests & docs
verification.test.tsgainsrecordEpfoCheck(records name + timestamp, Accounts-only gating).type-checkclean; full unit (245) + integration (213) green (RESEND_API_KEYunset)..env.example(EPFO_SERVICE_URL/EPFO_LIVE),CLAUDE.md,EpfoService/README.md.🤖 Generated with Claude Code
Scaffolds EPFO/UAN verification the same way GST works — a standalone Playwright proxy microservice + an /api proxy + an assisted affordance that records the result. Aadhaar stays manual (UIDAI-restricted). Stacks on the follow-ups branch. Behind NEXT_PUBLIC_CREWING_ENABLED. What's in - EpfoService/ (new microservice, GstService pattern): Express + Playwright. POST /otp {uan} → session + OTP request; POST /verify {sessionId,uan,otp} → member record; GET /health. EPFO is OTP-gated (no anonymous captcha lookup like GST), so the handshake is two steps. Live portal navigation is gated behind EPFO_LIVE (default STUB: OTP 000000 → matched) until real selectors/OTP are validated. README documents the differences + that Aadhaar is out of scope. - App: /api/epfo/otp + /api/epfo proxies (gated by verify_bank_epf) to EPFO_SERVICE_URL. EpfDetail += epfoMemberName + epfoCheckedAt (migration crewing_epfo_check). recordEpfoCheck action persists the EPFO result + audit. - UI: an "EPFO check" affordance on the verification EPF rows — request OTP → enter OTP → matched member → record. Aadhaar noted as manual-only. Tests & docs - Integration: verification.test.ts gains recordEpfoCheck (records name+timestamp, Accounts-only gating). type-check clean; full unit (245) + integration (213) green (RESEND_API_KEY unset). - .env.example (EPFO_SERVICE_URL/EPFO_LIVE), CLAUDE.md, EpfoService/README. Note: the EpfoService live portal selectors/OTP are stubbed and must be validated against a real EPFO session before enabling EPFO_LIVE. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>