Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
239 commits
Select commit Hold shift + click to select a range
d893919
feat(schema): add enterprise organization layer (BUYER complete, PROV…
teetangh Apr 10, 2026
7e69c96
feat(auth): upgrade better-auth to 1.6.2 + enable Organization & SSO …
teetangh Apr 10, 2026
39ead29
feat(org): add PROVIDER feature flag, org auth helpers, middleware route
teetangh Apr 10, 2026
cdd3507
feat(api/organizations): scaffold org CRUD, billing, credits, sso, plans
teetangh Apr 10, 2026
6c4ac7b
feat(dashboard/organization): scaffold org dashboard pages
teetangh Apr 10, 2026
d40eac3
feat(dashboard): add OrganizationSwitcher to consultant/consultee/adm…
teetangh Apr 10, 2026
1348419
feat(organizations/invite): public invitation acceptance page
teetangh Apr 10, 2026
35073b0
feat(checkout): add organizationId field for enterprise billing modes
teetangh Apr 10, 2026
28e334d
feat(checkout): SEAT_PACK credit deduction + INVOICED_MONTHLY skip-ga…
teetangh Apr 10, 2026
27f7a4c
feat(auth/sso): domain-check endpoint for SSO enforcement routing
teetangh Apr 10, 2026
72e9405
feat(refunds): org-aware refund routing for SEAT_PACK + INVOICED_MONTHLY
teetangh Apr 10, 2026
7f369f6
docs(enterprise): ADR for PR2 enterprise foundation design decisions
teetangh Apr 10, 2026
46f9e9a
feat(seed): add Phase 15 enterprise org seeding + schema fixes
teetangh Apr 10, 2026
ce899ef
feat(org): multi-step setup wizard + invitation flow fix + image upload
teetangh Apr 10, 2026
6a0c5d3
fix(auth): translate BetterAuth validation errors to user-friendly me…
teetangh Apr 10, 2026
1e421d9
feat(onboarding): add ORG_ADMIN role with integrated org creation flow
teetangh Apr 10, 2026
60efa61
fix: add billingMode to org PATCH schema + sidebar title truncation
teetangh Apr 10, 2026
8aef1bf
fix(onboarding): ORG_ADMIN role literal and missing org fields in tra…
teetangh Apr 10, 2026
53ac9ca
fix(security): checkout org auth + seat enforcement + member PATCH in…
teetangh Apr 10, 2026
8ccf840
fix: PR review round 2 — seat races, billingMode guard, onboarding va…
teetangh Apr 10, 2026
c6225bf
fix: PR review round 3 — atomic onboarding TX + race-safe seat ops
teetangh Apr 10, 2026
142db78
fix(ui): review round 4 — fail-closed wizard, disable stub CTAs, narr…
teetangh Apr 10, 2026
2ce64f9
fix: PR review round 5 — billing math consistency + credit limit enfo…
teetangh Apr 10, 2026
ea6fd0d
feat: add OrganizationSwitcher component to ConsulteeNav and update O…
teetangh Apr 10, 2026
e532aa0
fix: PR review round 6 — refund side effects, net billing math, block…
teetangh Apr 10, 2026
dc54c6c
ci: add .npmrc with legacy-peer-deps to fix CI install failure
teetangh Apr 10, 2026
af500b3
Merge branch 'dev' into feature/enterprise
teetangh Apr 10, 2026
08c352f
fix(refunds): move refund row to SUCCEEDED before side effects + pass…
teetangh Apr 10, 2026
9d9e339
feat(dashboard): inline edit modals for members, plans, and invoice c…
teetangh Apr 10, 2026
857a8cf
feat(email): org invitation email via Resend
teetangh Apr 10, 2026
2dcd9a2
feat(checkout): org payer selector on all 4 checkout pages
teetangh Apr 10, 2026
5d12f72
feat(gateway): real Razorpay flows for credit purchase + invoice payment
teetangh Apr 10, 2026
e7cf9bc
fix(enterprise): org sidebar user chip, type fixes, and onboarding cl…
teetangh Apr 10, 2026
7792edb
fix(types): shared Razorpay types, remove as-any/as-unknown, cleanup …
teetangh Apr 10, 2026
8a10522
feat(sso): end-to-end wiring — config normalization, membership sync,…
teetangh Apr 10, 2026
e1fd1bc
fix(dashboard): role-based sidebar + URL protection + billing mode ra…
teetangh Apr 10, 2026
462214a
fix(auth): deny-by-default role check — no skeleton flash on restrict…
teetangh Apr 11, 2026
0829727
fix: idempotent credit purchase + SSO learner seat accounting + invoi…
teetangh Apr 11, 2026
55c1a95
fix: atomic credit ops + FK-safe idempotency + useCallback stabilization
teetangh Apr 11, 2026
a6b8da2
feat(dashboard): redesign org Overview as action-oriented hub
teetangh Apr 11, 2026
a17356d
feat(plans): replace OrganizationPlan CRUD with curated consultant pl…
teetangh Apr 11, 2026
8d77372
fix(enterprise): edge case hardening, audit log, and orphaned credit …
teetangh Apr 11, 2026
ec21aa8
feat(enterprise): PROVIDER/HYBRID orgs, 4th billing mode, 3-way earni…
teetangh Apr 13, 2026
820adaa
fix(enterprise): address PR review — race conditions, negative guard,…
teetangh Apr 13, 2026
cb70ef3
fix(enterprise): address ChatGPT review — deterministic multi-org, St…
teetangh Apr 13, 2026
83cd83e
fix(enterprise): address ChatGPT round-2 — domain validation, apply U…
teetangh Apr 13, 2026
3ba6c34
fix(enterprise): make billingMode nullable — PROVIDER orgs don't have…
teetangh Apr 14, 2026
c8d9e03
fix(enterprise): address review gaps — wizard branching, billingMode …
teetangh Apr 14, 2026
19da444
fix(enterprise): close race conditions and TOCTOU vulnerabilities
teetangh Apr 14, 2026
17af0fb
docs(enterprise): document race condition fixes and concurrency model
teetangh Apr 14, 2026
726c52d
fix(enterprise): address finance audit — atomic invoice webhook, GST …
teetangh Apr 14, 2026
a18a639
fix(enterprise): harden invoice state machine — restrict payable stat…
teetangh Apr 14, 2026
330996e
fix(checkout): consultee conflict detection and multi-org billing cla…
teetangh Apr 14, 2026
d755c1f
fix(enterprise): two-step wizard bugs — SEAT_PACK pool + ReviewStep h…
teetangh Apr 14, 2026
14145cc
fix(enterprise): fix double-GST in generate-invoice — use originalAmo…
teetangh Apr 14, 2026
2120ac8
feat(enterprise): public invite preview + auth-aware accept UX
teetangh Apr 15, 2026
1799936
feat(enterprise): PROVIDER/HYBRID orgs, PREPAID_UNLIMITED billing, 3-…
teetangh Apr 15, 2026
68c923d
feat(dashboard): org navigation UX — context bar, sidebar switcher, r…
teetangh Apr 15, 2026
d66f6b5
feat(org-dashboard): SSR prefetch with HydrationBoundary — eliminates…
teetangh Apr 15, 2026
cf34d5e
feat(auth): wire SSO enforcement on signin/signup — block password+OA…
teetangh Apr 15, 2026
b75fc96
fix(auth): use direct POST to /api/auth/sign-in/sso instead of non-ex…
teetangh Apr 15, 2026
92b4fc7
fix(auth): query OrganizationSSOSettings for enforceSSO check, not Or…
teetangh Apr 15, 2026
917e3a4
fix(middleware): remove auth import that drags @better-auth/sso into …
teetangh Apr 15, 2026
d98eaa8
fix(sso): close 6 IdP-setup gaps + register ssoClient for real PKCE
teetangh Apr 15, 2026
c053b29
docs(sso): add testing guide with mocksaml / saml-idp / Keycloak / Au…
teetangh Apr 15, 2026
e3197f7
test(sso): add regression guards (static invariants + Jest) wired int…
teetangh Apr 15, 2026
033f1b1
fix(sso): server-side veto via session.create.before hook (fixes #673)
teetangh Apr 15, 2026
10b0fd3
fix(enterprise): count catalog plans in org analytics "Active plans" …
shubham79a Apr 15, 2026
96d0019
Merge branch 'feature/enterprise' of https://github.com/Practitionist…
shubham79a Apr 15, 2026
e41d187
feat(org-dashboard): top org switcher, chevron breadcrumbs, clean cro…
teetangh Apr 15, 2026
f21ad42
fix(consultee-nav): comment out greeting to prevent navbar overflow f…
shubham79a Apr 16, 2026
fdcd438
fix(org-dashboard): hide "Personal Dashboard" link for org-only users
shubham79a Apr 17, 2026
41ea673
refactor(org-dashboard): move context-switcher from top header to bot…
teetangh Apr 17, 2026
9708901
feat(enterprise): Phase 0 — Arch 4-Modified schema rewrite (Issue #681)
teetangh Apr 18, 2026
289aa67
feat(enterprise): Phase 1 — compliance stubs, wallet/program helpers,…
teetangh Apr 18, 2026
b726aa6
feat(enterprise): Phase 2 — API/lib rewrite; tsc --noEmit passes (Iss…
teetangh Apr 18, 2026
4c52a37
feat(enterprise): Phase 3 — scaffold dashboard pages for Arch 4 model…
teetangh Apr 18, 2026
6569759
feat(enterprise): Phase 4-6 — cron stubs, docs, verification (Issue #…
teetangh Apr 18, 2026
67f4993
Merge branch 'dev' into feature/enterprise — pull lint cleanup (PR #683)
teetangh Apr 19, 2026
b29ccb1
Merge branch 'feature/enterprise' into feature/enterprise-arch4 — pul…
teetangh Apr 19, 2026
bb93fee
feat(enterprise): Arch 4-Modified schema, seeds, audit actions, share…
teetangh Apr 19, 2026
cb04145
feat(enterprise): compliance/irp stub — schema-final e-invoice uploader
teetangh Apr 19, 2026
1019a27
feat(enterprise): auth — customSession shim removal + typed requireOr…
teetangh Apr 19, 2026
4713091
feat(enterprise): domain helpers — rate-card resolver, program assign…
teetangh Apr 19, 2026
1cadb0c
feat(enterprise): members + invitations — unified role surface
teetangh Apr 19, 2026
dd30956
feat(enterprise): contracts + programs + assignments API
teetangh Apr 19, 2026
b6b2086
feat(enterprise): billing-account + wallet + top-ups — replace /billi…
teetangh Apr 19, 2026
dd68a46
feat(enterprise): invoices + purchase-orders — India GST + 3-way match
teetangh Apr 19, 2026
7a3e462
feat(enterprise): payout-account + earnings + payouts + rate-cards
teetangh Apr 19, 2026
14caac8
feat(enterprise): SSO settings + providers + domain-claims
teetangh Apr 19, 2026
f5b9f95
feat(enterprise): consent (DPDP) + HRIS (config + sync + CSV upload)
teetangh Apr 19, 2026
5c26a44
feat(enterprise): /organizations root + activity + catalog + analytic…
teetangh Apr 19, 2026
f63684d
feat(enterprise): onboarding form + create-organization wizard — Zod-…
teetangh Apr 19, 2026
989ba6a
feat(enterprise): dashboard UI + checkout selector + shared component…
teetangh Apr 19, 2026
717da79
docs(enterprise): full rewrite — capability model + harness verdict +…
teetangh Apr 19, 2026
b8d1bee
fix(hydration): replace <p> wrapping <Badge> with <div> in 4 locations
teetangh Apr 19, 2026
ed5cebe
fix(onboarding): add missing ORG_ADMIN role description in role selector
teetangh Apr 19, 2026
d3412ed
fix(enterprise): drop legacy role aliases, Zod-first narrowing at bou…
teetangh Apr 19, 2026
dc55d07
fix(enterprise): PR #682 correctness — atomic cap, idempotent top-up,…
teetangh Apr 19, 2026
e238281
fix(enterprise): PR #682 taxonomy — reject PROJECT, distinct audit ac…
teetangh Apr 19, 2026
14406a6
fix(enterprise): PR #682 regressions — port SSO domain-check, gate re…
teetangh Apr 19, 2026
63ac17f
fix(enterprise): PR #682 second-pass feedback — gate image upload, hi…
teetangh Apr 19, 2026
2b9da18
refactor(enterprise): delete legacy stubs + UI callers — refunds, ima…
teetangh Apr 19, 2026
11bf2d5
feat(enterprise): wire live Program + PaymentLeg into checkout, delet…
teetangh Apr 19, 2026
34bc70e
feat(enterprise): Programs dashboard CRUD UI + dashboard regression f…
teetangh Apr 19, 2026
78afb50
fix(enterprise): PR #682 third-pass comments — SSO scoping, audit tax…
teetangh Apr 19, 2026
293180f
fix(enterprise): dashboard RBAC + capability gates + vocabulary cleanup
teetangh Apr 19, 2026
f515f2b
feat(enterprise): unified ORG_ADMIN onboarding + verification gate
teetangh Apr 19, 2026
c8ab6b9
fix(enterprise): drop duplicate setOnboardingRoleAction import
teetangh Apr 19, 2026
4003c9b
fix(enterprise): ORG_ADMIN copy + back path to role picker
teetangh Apr 19, 2026
0ea95cd
Address PR #682 round-3 review: 9 fixes spanning security, invariants…
teetangh Apr 19, 2026
0ef506b
Address PR #682 round-4 review: Razorpay wiring + legacy/TS-debt cleanup
teetangh Apr 19, 2026
2df0ecb
Address PR #682 round-5 review: webhook-race UX bridge + final docs s…
teetangh Apr 19, 2026
b09c04d
feat(enterprise): org logo + banner upload API
teetangh Apr 19, 2026
017458f
test(enterprise): split E2E walkthrough into shared-setup + API + UI …
teetangh Apr 19, 2026
db21b33
fix(enterprise): phase 1 — money + auth hardening (refunds, payouts, …
teetangh Apr 19, 2026
9a6dfc2
fix(enterprise): phase 2 — schema invariants + race-safe dedup
teetangh Apr 19, 2026
5293280
fix(enterprise): phase 3 — webhook hardening (PII scrub, idempotency,…
teetangh Apr 19, 2026
b6aad4e
feat(enterprise): phase 4 — race-safe subscription cron + ledger reco…
teetangh Apr 19, 2026
d07ff46
feat(enterprise): phase 5 — DPDP / IRP / MSME compliance plumbing
teetangh Apr 19, 2026
a08ec34
fix(enterprise): phase 6 + 9 — UX polish + client-side Zod sweep
teetangh Apr 19, 2026
2bc503d
refactor(enterprise): phase 7 — audit coverage + shared validators
teetangh Apr 19, 2026
1fc1a73
docs(enterprise): phase 8 — runbooks, monitoring, idempotency + diagrams
teetangh Apr 19, 2026
c377b90
fix(enterprise): phase 3 follow-up — write INVOICE_PAID settlement le…
teetangh Apr 19, 2026
bdc9eab
chore(enterprise): phase 2 follow-up — pin Prisma 7.7, refresh partia…
teetangh Apr 19, 2026
68ebd1b
refactor(enterprise): OrgAdminProfile + disjoint LEARNER/EXPERT roles
teetangh Apr 19, 2026
c06054b
fix(enterprise): consent userId validation, sso providerType, billing…
teetangh Apr 19, 2026
0962ff6
refactor(enterprise): single OrgDetailsResponse type + full-shape use…
teetangh Apr 19, 2026
3515d11
docs(enterprise): document OrgAdminProfile, lazy ConsulteeProfile, he…
teetangh Apr 19, 2026
c8aa502
fix(enterprise): typed errors + Zod sweep for org-creation wizard
teetangh Apr 19, 2026
89c8847
refactor(enterprise): Arch-4 terminology purge
teetangh Apr 20, 2026
2896ea3
fix(enterprise): share fetchOrgDetails across layout + invitations page
teetangh Apr 20, 2026
c53c214
refactor(enterprise): useOrgRole + settings consume shared org-detail…
teetangh Apr 20, 2026
d1af7ab
feat(enterprise): Explore Organisations page + expert affiliation filter
teetangh Apr 20, 2026
aa10d2a
fix(sso): add DialogDescription for accessibility in SSO provider dialog
teetangh Apr 20, 2026
fb0323f
feat(enterprise): marketplace visibility toggle + analytics error fal…
teetangh Apr 20, 2026
1c28b2b
feat(enterprise): close bundle — error boundaries + lifecycle crons
teetangh Apr 22, 2026
e561688
feat(auth): add manual SSO trigger for IT admins in SignIn component
teetangh Apr 22, 2026
a7f9db1
fix(enterprise): Add Member dialog — resolve by email + gate on verif…
shubham79a Apr 23, 2026
a535fea
fix(enterprise): route consumer roles away from the operator org dash…
shubham79a Apr 23, 2026
87a2f0f
fix(enterprise): gate Learners/Experts sidebar tabs on MANAGER role
shubham79a Apr 24, 2026
cf4736d
docs(enterprise): reconcile 12-dashboard-pages.md with Arch-4 code re…
shubham79a Apr 24, 2026
9d33c65
refactor(enterprise): simplify CreditPoolConfig + add domain/invoice/…
teetangh Apr 25, 2026
aad0027
feat(enterprise): wire Novu org-lifecycle notifications across 9 events
teetangh Apr 25, 2026
4479eb5
feat(enterprise): DNS-TXT domain verification + verifiedAt enforcement
teetangh Apr 25, 2026
155886d
feat(enterprise): audit log viewer — paginated API + filter UI + CSV …
teetangh Apr 25, 2026
05efb1a
feat(pdf): consolidate invoice renderer into lib/pdf — drop RSC hack,…
teetangh Apr 25, 2026
ae3f522
feat(enterprise): three org-scoped rate limiters + middleware wiring
teetangh Apr 25, 2026
d25bdb5
feat(enterprise): OrgContextFilter + trial org-tag + anti-lockout clo…
teetangh Apr 25, 2026
7231f75
feat(enterprise): reconcile ProgramAssignment session-counter drift +…
teetangh Apr 25, 2026
31be8e7
docs(enterprise): refresh canonical docs + import 6 enterprise guides…
teetangh Apr 25, 2026
6080a8a
Merge remote-tracking branch 'origin/dev' into feature/enterprise
teetangh Apr 25, 2026
bd9ea2f
Merge remote-tracking branch 'origin/feature/enterprise' into feature…
teetangh Apr 25, 2026
e6a6622
docs(dashboard): move dashboard-architecture-assessment.md from enter…
teetangh Apr 25, 2026
0c3675d
feat(tours): add tour-prompt template and enterprise grand tour
teetangh Apr 25, 2026
20cb04b
refactor(enterprise): rename cap fields to engagement-based naming
teetangh Apr 25, 2026
60bb53c
fix(enterprise): rewrite recordBookingUtilization for engagement coun…
teetangh Apr 25, 2026
d3f1710
fix(enterprise): cap-debit engagements correctly per plan type at che…
teetangh Apr 25, 2026
bec8264
fix(enterprise): debit SUBSCRIPTION engagements lazily at slot alloca…
teetangh Apr 25, 2026
97c5f7b
test(enterprise): cap counting + bogus combo coverage
teetangh Apr 25, 2026
25fbd8f
docs(enterprise): document engagement-based cap counting model
teetangh Apr 25, 2026
e28154c
refactor(enterprise): drop as-unknown cast for cap-debit tx
teetangh Apr 25, 2026
e3a01f8
fix: shared Response one-shot bug on bulk-405 route + db:seed path re…
teetangh Apr 25, 2026
40591aa
fix(enterprise): PR-1a algorithmic close-outs (#699 ENT-1..5, #710, #…
teetangh Apr 25, 2026
d8c8658
fix(enterprise): PR-1b three-ledger transactional discipline (#700 LE…
teetangh Apr 25, 2026
cb5049d
feat(enterprise): PR-1c rewrite OrgPayoutService — eligibility + idem…
teetangh Apr 25, 2026
1f89d88
feat(enterprise): PR-1d invoice-fraud guards + verifiedAt governance …
teetangh Apr 25, 2026
87db483
docs(tours): refresh enterprise grand tour for PR-1a..1d
teetangh Apr 25, 2026
dc39cd9
fix(enterprise): PR-1e finish engagement counter — proportional rever…
teetangh Apr 26, 2026
f6876b8
feat(enterprise): consumer-role org pages — /my-program (LEARNER) + /…
teetangh Apr 26, 2026
67d977c
docs(enterprise): document per-role landing in dashboard + roles docs
teetangh Apr 26, 2026
a1f6cb9
docs(auth): add authentication + authorization developer documentation
teetangh Apr 26, 2026
d2bb6e0
feat(dashboard): slim top-bar chrome for org-switcher + org-admin lan…
teetangh Apr 26, 2026
30409e0
feat(dashboard): consolidate operator surface into /dashboard/org-adm…
teetangh Apr 26, 2026
3a00074
docs(enterprise): document operator dashboard tree + grand-tour T.16.5
teetangh Apr 26, 2026
dfd8883
fix(enterprise): home + billing page-load race + duplicate canSponsor…
teetangh Apr 26, 2026
6e224c9
fix(enterprise): org-creation wizard rate-card endpoint + extended PA…
teetangh Apr 26, 2026
0f138f9
feat(enterprise): owner-editable capability toggles + slug on Setting…
teetangh Apr 26, 2026
52dd835
feat(enterprise): contracts CRUD UI for org operators
teetangh Apr 26, 2026
5bcf889
feat(admin): platform-admin org verification dashboard + sidebar entry
teetangh Apr 26, 2026
8aaa659
fix(enterprise): org payouts return updated row + markOrgPayoutComple…
teetangh Apr 26, 2026
53846c3
fix(enterprise): my-program engagement-rename drift + Razorpay sandbo…
teetangh Apr 26, 2026
950db20
feat(seed): dedicated tour-owner ORG_ADMIN with deterministic credent…
teetangh Apr 26, 2026
f9b75df
chore: remove ARCHITECTURE_4_BILLING_EXPLAINER.md file
teetangh Apr 26, 2026
a918c6d
chore(ci): wire release-pending-trust-earnings cron into GH Actions
teetangh Apr 26, 2026
4f7e238
Merge pull request #682 from Practitionist/feature/enterprise-arch4
teetangh Apr 26, 2026
b29cd07
fix(enterprise): EXPERT UI + role-transition reconciliation + ORG_ADM…
teetangh Apr 26, 2026
74afcf7
feat(enterprise): plan visibility leak guard + WIP banners + readines…
teetangh Apr 27, 2026
09a3eb8
chore(ci): retrigger Netlify deploy-preview after applying schema mig…
teetangh Apr 27, 2026
f650ca7
fix(enterprise): real bank-account encryption + billing UI unificatio…
teetangh Apr 27, 2026
4e6cc7e
feat(enterprise): schema anchors for org scope split + tdsRate Float
teetangh May 1, 2026
1d3d475
feat(enterprise): org-scope parser + useOrgScope hook + query factory
teetangh May 1, 2026
ca04847
feat(enterprise): org-scope APIs (top-level, per-org, dashboard retro…
teetangh May 1, 2026
746b3a1
feat(enterprise): org dashboard pages + OrgContextFilter mounts
teetangh May 1, 2026
12c91c6
feat(enterprise): canonical refund op + live RazorpayX payouts + admi…
teetangh May 1, 2026
ea8432e
feat(compliance): TDS / MSME / IRP scaffolds + PII select hardening
teetangh May 1, 2026
2b45fb1
feat(enterprise): Stream/Novu org tagging + membership-role profile c…
teetangh May 1, 2026
0433a77
test(enterprise): TDS derivation, MSME deadlines, payout/refund coverage
teetangh May 1, 2026
fad717b
feat(enterprise): contract expiry cron + GitHub Actions schedule
teetangh May 1, 2026
a67b46c
docs(enterprise): reorganize non-numbered docs + add money glossary +…
teetangh May 1, 2026
17044df
chore(docs): remove superseded enterprise + roadmap docs
teetangh May 1, 2026
46a081f
refactor(enterprise): rename OrgAdmin → OrgWorkspace across schema, r…
teetangh May 1, 2026
2c423b8
fix(enterprise): close 6 checklist items from 2026-05-02 audit
teetangh May 2, 2026
399cffe
fix(enterprise): Round 2 — wire compliance crons + close FF-6 (GST dr…
teetangh May 2, 2026
705c8fb
docs(compliance): unified B2B + B2C compliance series at docs/complia…
teetangh May 2, 2026
b4523db
fix(programs): add coveredPlanTypes selector and learner assignment U…
shubham79a May 15, 2026
5f784cb
fix: address Gemini code review — pagination, PAUSED badge, error sta…
shubham79a May 15, 2026
f395c45
fix: address code review — PAUSED badge, error state, UTC dates, loca…
shubham79a May 15, 2026
fc00538
fix(programs): learner assignment UI, and UX polish
shubham79a May 15, 2026
7a4fe36
Update app/dashboard/organization/[orgId]/programs/page.tsx
shubham79a May 15, 2026
3ad0256
fix(enterprise): Round 3 close-out — TDS/MSME on org payouts, DPDP ga…
teetangh May 15, 2026
34aad0f
test(enterprise): restructure prompts into feature subfolders + add R…
teetangh May 15, 2026
1380599
fixed enterprise prompts
teetangh May 15, 2026
03a44ee
fix(enterprise): PO balance + UI error humanization + Prisma 7 standa…
teetangh May 15, 2026
fb68386
fix(enterprise/auth): SSO hardening + docs (JIT OWNER, cert validatio…
teetangh May 15, 2026
f7133ea
fix(enterprise): green CI + critical bugs + BILLING_ADMIN role wiring
teetangh May 16, 2026
4b4ce31
feat(enterprise): outbound webhooks subsystem
teetangh May 16, 2026
27279c9
feat(enterprise): SCIM 2.0 provisioning
teetangh May 16, 2026
e40914f
feat(enterprise): DPDP §12 automated right-to-erasure
teetangh May 16, 2026
59e5e87
feat(enterprise): polish — headers, retention, exports, BILLING_ADMIN…
teetangh May 16, 2026
1c0878f
fix(enterprise): close 6 org-scope leaks + schema finalization + main…
teetangh May 16, 2026
cba8f2c
fix(enterprise): green tsc — 8 type errors caught by CI
teetangh May 16, 2026
b82c669
Merge branch 'feature/enterprise' into fix/enterprise-program-ui-gaps…
shubham79a May 16, 2026
022bae4
Merge pull request #742 from Practitionist/fix/enterprise-program-ui-…
shubham79a May 16, 2026
3fda085
Resolving error
shubham79a May 16, 2026
75bc6a8
fix(programs): derive assignment status from dates instead of missing…
shubham79a May 17, 2026
4e29057
fix(enterprise): Scenario HOST org — two runtime bugs + /my-arrangeme…
shubham79a May 17, 2026
2a51b8c
chore(prisma): add OrgWorkspaceProfile preferences + SystemEvent
teetangh May 19, 2026
7c4e773
feat(enterprise): Purchase Orders + OrgWorkspace settings + grouped s…
teetangh May 19, 2026
bd61b3f
feat(enterprise): audit-log info-leak fix + compliance flag gating + …
teetangh May 19, 2026
cc6ce12
feat(enterprise): LICENSE-funded org UX polish (#755 #756)
shubham79a May 28, 2026
034fa2c
feat(enterprise): #714 PERSONAL spend dashboard surfaces (/home card …
teetangh May 28, 2026
5f3ccc8
feat(enterprise): stamp orgId + fundingSource in Razorpay notes for b…
teetangh May 28, 2026
33e2b68
feat(enterprise): per-org MaintenanceWindow read helper + payout-batc…
teetangh May 28, 2026
004cf75
feat(stream): consultation/subscription channels fall back to Appoint…
teetangh May 28, 2026
9a18e80
feat(stream): denorm MeetingSession.organizationId for org-scoped cal…
teetangh May 28, 2026
c53b351
feat(billing): LICENSE renewal-upcoming Novu reminder
teetangh May 28, 2026
4746de3
feat(dataexport): Novu in-app fan-out on READY
teetangh May 28, 2026
de985b4
docs(enterprise): cross-cutting integrations map
teetangh May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .env.sample
Original file line number Diff line number Diff line change
Expand Up @@ -92,3 +92,20 @@ NEXT_PUBLIC_LOGO_DEV_TOKEN=""
# PAN encryption key for consultant tax info (AES-256-GCM)
# Generate with: openssl rand -hex 32
PAN_ENCRYPTION_KEY=""
# Organization payout account encryption (AES-256-GCM)
# Generate with: openssl rand -hex 32
ORG_PAYOUT_ENCRYPTION_KEY=""

# GST place-of-supply: the supplier's (i.e. Familiarise's) state code.
# Used by lib/compliance/gst.ts to decide CGST+SGST (intra-state) vs IGST
# (inter-state). Defaults to "KA" (Karnataka). Change when the business
# address or the GSTIN's registered state changes; CA sign-off recommended.
SUPPLIER_STATE_CODE="KA"

# Enterprise — consolidated-invoice rollup cron flag.
# When "true", the monthly consolidated-invoice cron rolls up children's
# unpaid OrganizationInvoice rows into a single parent-org invoice on the
# 1st of the month. Defaults to "false" because org hierarchy is still
# schema-only for most tenants; enable once a parent tenant requires
# consolidated billing. See app/api/cleanup/consolidated-invoice-rollup/.
ENABLE_CONSOLIDATED_INVOICE="false"
6 changes: 6 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ jobs:
- name: Generate Prisma Client
run: npx prisma generate

- name: Verify SSO invariants
# Cheap static guard against regressions in the SSO audit fixes
# (PR #655 / issue #672). See scripts/verify-sso-invariants.sh
# for per-check rationale.
run: bash scripts/verify-sso-invariants.sh

- name: Unit Tests
run: npm run test

Expand Down
43 changes: 43 additions & 0 deletions .github/workflows/cleanup-abandoned-org-top-ups.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Cleanup Abandoned Org Top-Ups

on:
schedule:
# Run daily at 02:00 UTC. Must NOT overlap the subscription-cron
# at 00:00 UTC (CPU + Prisma connection contention).
- cron: "0 2 * * *"
workflow_dispatch: # Allow manual triggering

jobs:
cleanup-abandoned-org-top-ups:
runs-on: ubuntu-latest
timeout-minutes: 10

env:
# Database connection (required for Prisma)
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

- name: Run abandoned org top-up cleanup
run: npx tsx jobs/cleanup/cleanup-abandoned-org-top-ups.ts

- name: Notify on failure
if: failure()
run: |
echo "Abandoned org top-up cleanup failed"
# TODO: wire to #ops-alerts Slack channel.
29 changes: 29 additions & 0 deletions .github/workflows/cleanup-old-stream-recordings.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Cleanup Old Stream Recordings

on:
schedule:
# 03:00 UTC daily. Staggered after abandoned-top-ups (02:00) and
# reconcile-ledgers (02:30) to avoid Prisma pool contention.
- cron: "0 3 * * *"
workflow_dispatch:

jobs:
cleanup-old-stream-recordings:
runs-on: ubuntu-latest
timeout-minutes: 10

env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}

steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"
- run: npm ci
- run: npx prisma generate
- run: npx tsx jobs/cleanup/cleanup-old-stream-recordings.ts
- if: failure()
run: echo "Stream retention sweep failed"
47 changes: 47 additions & 0 deletions .github/workflows/cleanup-stale-invitations.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Cleanup Stale Invitations

on:
schedule:
# Daily at 08:00 IST (02:30 UTC). Offset from
# cleanup-abandoned-org-top-ups (07:30 IST / 02:00 UTC) and the
# subscription cron (05:30 IST / 00:00 UTC) to keep Prisma
# connections + CPU from contending during the cron window.
# GitHub Actions `schedule` interprets the cron expression in UTC.
- cron: "30 2 * * *"
workflow_dispatch: # allow manual trigger from the Actions tab

jobs:
cleanup-stale-invitations:
runs-on: ubuntu-latest
timeout-minutes: 10

env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}
UPSTASH_REDIS_REST_URL: ${{ secrets.UPSTASH_REDIS_REST_URL }}
UPSTASH_REDIS_REST_TOKEN: ${{ secrets.UPSTASH_REDIS_REST_TOKEN }}

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

- name: Run stale invitation cleanup
run: npx tsx jobs/cleanup/cleanup-stale-invitations.ts

- name: Notify on failure
if: failure()
run: |
echo "Stale invitation cleanup failed"
# TODO: wire to #ops-alerts Slack channel.
49 changes: 49 additions & 0 deletions .github/workflows/consolidated-invoice-rollup.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Consolidated Invoice Rollup

on:
schedule:
# 09:30 IST (04:00 UTC) on the 1st of every month. Only runs
# monthly because rolling up the same ISSUED invoices twice would
# create duplicate parent invoices (the cron is a one-shot per
# cycle). GitHub Actions `schedule` interprets cron in UTC.
- cron: "0 4 1 * *"
workflow_dispatch: # allow manual trigger for mid-cycle onboarding

jobs:
consolidated-invoice-rollup:
runs-on: ubuntu-latest
timeout-minutes: 15

env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}
UPSTASH_REDIS_REST_URL: ${{ secrets.UPSTASH_REDIS_REST_URL }}
UPSTASH_REDIS_REST_TOKEN: ${{ secrets.UPSTASH_REDIS_REST_TOKEN }}
# The cron is a no-op when this flag is unset / "false". GH Actions
# secrets store the live value per-environment (prod / staging).
ENABLE_CONSOLIDATED_INVOICE: ${{ secrets.ENABLE_CONSOLIDATED_INVOICE }}

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

- name: Run consolidated invoice rollup
run: npx tsx jobs/cleanup/consolidated-invoice-rollup.ts

- name: Notify on failure
if: failure()
run: |
echo "Consolidated invoice rollup failed"
# TODO: wire to #ops-alerts Slack channel.
49 changes: 49 additions & 0 deletions .github/workflows/databreach-deadline-alerts.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: DPDP DataBreach 72h Deadline Alerts

on:
schedule:
# Hourly at :15 — the 72-hour DPDP reporting deadline is sharp;
# daily would risk crossing the cutoff between runs. The :15 slot
# is free across the existing cron grid.
- cron: "15 * * * *"
workflow_dispatch:

jobs:
databreach-deadline-alerts:
runs-on: ubuntu-latest
timeout-minutes: 5

env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}
# Email dispatch is opt-in. When DATABREACH_ALERT_EMAIL or
# RESEND_API_KEY are absent the cron falls back to structured-log
# only (event: "dpdp.databreach.deadline").
DATABREACH_ALERT_EMAIL: ${{ secrets.DATABREACH_ALERT_EMAIL }}
RESEND_API_KEY: ${{ secrets.RESEND_API_KEY }}
NEXT_PUBLIC_APP_URL: ${{ secrets.NEXT_PUBLIC_APP_URL }}

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

- name: Run DataBreach deadline alerts
run: npx tsx jobs/compliance/databreach-deadline-alerts.ts

- name: Notify on failure
if: failure()
run: |
echo "DataBreach deadline alerts cron failed"
# TODO: wire to #ops-alerts Slack channel.
43 changes: 43 additions & 0 deletions .github/workflows/dispatch-outbound-webhooks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Dispatch Outbound Webhooks

on:
schedule:
# Every minute. The worker is idempotent — a tick that overlaps an
# in-flight tick observes IN_FLIGHT rows and skips them.
- cron: "* * * * *"
workflow_dispatch: # Allow manual triggering for debugging

jobs:
dispatch-outbound-webhooks:
runs-on: ubuntu-latest
timeout-minutes: 5

env:
# Database connection (required for Prisma)
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

- name: Run outbound webhook dispatch tick
run: npx tsx jobs/cleanup/dispatch-outbound-webhooks.ts

- name: Notify on failure
if: failure()
run: |
echo "Outbound webhook dispatch tick failed"
# TODO: wire to #ops-alerts Slack channel.
42 changes: 42 additions & 0 deletions .github/workflows/expire-contracts.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Expire Contracts

on:
schedule:
# 03:00 UTC = 08:30 IST. Quiet slot — no other crons fire here
# (avoids the 00:00 / 01:00 / 02:00 contention zones).
- cron: "0 3 * * *"
workflow_dispatch: # Allow manual triggering

jobs:
expire-contracts:
runs-on: ubuntu-latest
timeout-minutes: 10

env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

- name: Run contract-expiry job
run: npx tsx jobs/contracts/expire-contracts.ts

- name: Notify on failure
if: failure()
run: |
echo "Contract-expiry cron failed"
# TODO: wire to #ops-alerts Slack channel.
56 changes: 56 additions & 0 deletions .github/workflows/irp-uploader.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: IRP IRN Uploader

on:
schedule:
# 02:30 UTC = 08:00 IST. Picked to sit between expire-contracts (03:00)
# and cleanup-abandoned-org-top-ups (02:00) without colliding. Daily
# cadence matches the CBIC 30-day retroactive IRN window.
- cron: "30 2 * * *"
workflow_dispatch: # Allow manual triggering

jobs:
irp-uploader:
runs-on: ubuntu-latest
timeout-minutes: 15

# Gated on the ENABLE_IRP_UPLOADER repo variable (see
# lib/feature-flags.ts). On scheduled runs the job exits without
# work when the variable is unset, so we don't burn CI minutes on a
# stubbed connector. Manual workflow_dispatch still runs so an
# operator can validate the pipeline before flipping the flag on.
if: ${{ vars.ENABLE_IRP_UPLOADER == 'true' || github.event_name == 'workflow_dispatch' }}

env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DIRECT_URL: ${{ secrets.DIRECT_URL }}
# ClearTax GSP credentials. When absent the underlying connector
# returns { status: "FAILED", reason: "STUB" } and the uploader
# treats that as a normal retry — the cron does not crash.
CLEARTAX_API_KEY: ${{ secrets.CLEARTAX_API_KEY }}
CLEARTAX_GSP_TOKEN: ${{ secrets.CLEARTAX_GSP_TOKEN }}
CLEARTAX_GSTIN: ${{ secrets.CLEARTAX_GSTIN }}

steps:
- name: Checkout code
uses: actions/checkout@v5

- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: "22"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Generate Prisma client
run: npx prisma generate

- name: Run IRP uploader
run: npx tsx jobs/compliance/irp-uploader.ts

- name: Notify on failure
if: failure()
run: |
echo "IRP IRN uploader cron failed"
# TODO: wire to #ops-alerts Slack channel.
Loading
Loading