Corporate Sales
B2B corporate account and session management with ClubReady integration
Overview
The Corporate Sales app enables fitness businesses to manage B2B corporate accounts where companies purchase bulk session packages as employee benefits. HR administrators can allocate sessions to employees, and the system tracks balances through a ledger system and processes enrollments through ClubReady integration.
Key Features
Company Management
- Full CRUD Operations: Create, read, update, delete companies
- Comprehensive Details:
- Company name and internal ID
- Full address information
- Session value configuration ($ per session)
- ClubReady integration IDs (Club ID, Package ID)
- Agreement terms and dates
- Website and subscription type
- Company notes with audit trail
Company Users Management
-
User Assignment:
- Assign existing tenant users to companies
- Create new users inline with auto-generated passwords
- Multi-select for bulk user assignment
- Role selection: User or Admin
- Primary contact designation (one per company)
-
User Creation:
- Auto-generate 8-character temporary password
- Auto-assign to "Corporate" department
- Add to tenant with default roles
- Link to existing User or create new User record
-
Access Control:
- Non-admin users only see their assigned companies
- Permission filtering across all routes
- Role-based functionality differences
- User removal with cleanup of app-owned users
Session Ledger System
-
Transaction Types:
- Grant: Record payment, add sessions to balance
- Deduct: Process case, remove sessions from balance
-
Tracking:
- Running balance calculation
- Complete audit trail
- Payment details (amount, method, date)
- Employee allocation details
-
Business Rules:
- Sessions must be available before allocation
- All transactions create permanent records
- Balance cannot go negative
Case Management (Request Workflow)
-
Case Lifecycle:
- Pending: HR admin/user submits case
- Internal Review: Staff reviews the case
- Approved: Case approved, sessions deducted from ledger
- Rejected: Case rejected with reason
-
Case Details:
- Auto-generated case number (CS-YYYY-0001 format)
- Form submission data (via public form integration)
- Requested sessions
- Processing status tracking
- Approval/rejection tracking (user, timestamp, reason)
- Audit trail with timestamps
-
Modal-Based Creation: Cases created via modal dialog
-
Automatic Ledger Integration: Approved cases create ledger deductions
ClubReady Integration
- Functionality (Phase 2 Planned):
- Create prospect records
- Sell memberships with allocated sessions
- Track integration status
- Handle errors gracefully
Database Models
Core Models
model CorporateSales_Company {
id String @id @default(cuid())
tenantId String
appId String
name String
companyId String?
status String // "active" | "inactive"
streetAddressLine1 String?
streetAddressLine2 String?
city String?
stateProvince String?
postalCode String?
country String?
sessionValue Decimal @default(0.00)
website String?
agreementStartDate DateTime?
subscriptionType String?
clubReadyClubId String?
clubReadyPackageId String?
agreementTerms String?
notes String?
ledgerEntries CorporateSales_Ledger[]
cases CorporateSales_Case[]
companyUsers CorporateSales_CompanyUser[]
companyNotes CorporateSales_CompanyNote[]
}
model CorporateSales_CompanyUser {
id String @id @default(cuid())
tenantId String
companyId String
userId String
tenantUserId String
role String // "user" | "admin"
isPrimaryContact Boolean @default(false)
temporaryPassword String?
}
model CorporateSales_Ledger {
id String @id @default(cuid())
tenantId String
companyId String
date DateTime
type String // "grant" | "deduct"
amount Decimal
sessions Int
balance Int
paymentMethod String?
notes String?
caseId String?
createdByUserId String?
}
model CorporateSales_Case {
id String @id @default(cuid())
tenantId String
companyId String
caseNumber String @unique
requestedSessions Int
status String // "pending" | "internal_review" | "approved" | "rejected"
notes String?
formSubmissionId String?
submittedByUserId String?
approvedAt DateTime?
approvedByUserId String?
rejectedAt DateTime?
rejectedByUserId String?
rejectionReason String?
ledgerEntries CorporateSales_Ledger[]
}
model CorporateSales_CompanyNote {
id String @id @default(cuid())
createdAt DateTime @default(now())
companyId String
content String
createdByUserId String
}Routes
Admin Routes
/app/{tenant}/apps/corporate-sales- Dashboard with summary metrics/app/{tenant}/apps/corporate-sales/companies- List all companies/app/{tenant}/apps/corporate-sales/companies/new- Create company (CS Admin only)/app/{tenant}/apps/corporate-sales/companies/{id}- Company details with tabs:- Company Information: Basic details and configuration
- Session Ledger: Transaction history and balance
- Users: Company user assignments with role management
- Notes: Company notes with audit trail
/app/{tenant}/apps/corporate-sales/companies/{id}/edit- Edit company (CS Admin only)/app/{tenant}/apps/corporate-sales/cases- List cases
User Personas
1. Corporate Sales Admin (Staff)
Access: Full system access
Responsibilities:
- Create and manage all corporate accounts
- Grant sessions when payments are received
- Process all cases from all companies
- View all analytics and reports
- Manage company relationships
- Assign users to companies and manage their roles
2. Company Admin (HR Director/Manager)
Access: Dashboard access for their company only
Responsibilities:
- View their company's details, ledger, and balance
- Submit cases for employees
- Monitor status of their company's cases
- Access reports for their company
- Manage employee allocations
- Designated as primary contact (optional)
3. Company User (HR Staff)
Access: Dashboard access for their assigned company only
Responsibilities:
- View their company's details and balance
- Submit cases for employees
- Monitor case status for their company
- Limited access compared to Company Admin
User Workflows
Corporate Sales Admin Workflow
- Create new company account
- Assign users to company (existing or create new)
- Record payment and grant sessions via modal
- Review submitted cases from all companies
- Approve or reject cases (automatic ledger updates)
- Manage company users (add, remove, change roles)
- Generate reports
Company Admin Workflow
- Log in to dashboard
- View assigned company's balance and ledger
- Submit case for employee via modal
- Track case status for their company
- View company reports
- View other company users
Company User Workflow
- Log in to dashboard
- View assigned company's balance
- Submit case for employee via modal
- Track case status for their company
- Limited access compared to Company Admin
User Assignment Workflow
- Corporate Sales Admin opens company detail page
- Navigates to "Users" tab
- Clicks "Add customer to company"
- Modal opens with two modes:
- Select Existing User: MultiSelect from tenant users
- Create New User: Form with First Name, Last Name, Email, Phone
- Select role (User or Admin)
- Optionally mark as primary contact
- Submit to add user(s) to company
- Users can access their assigned company immediately
Key Business Rules
- No Payment Processing: System only records payments, doesn't process them
- Access Control:
- Super users/admins see all companies
- Non-admin users only see their assigned companies
- Permission filtering applies to companies and cases
- Session Availability: Cannot approve cases with more sessions than available balance
- Audit Trail: Every action is logged with user and timestamp
- ClubReady Sync: Only happens when case is approved (future implementation)
- Case Numbers: Auto-generated sequentially (CS-YYYY-0001)
- Status Transitions: Follow defined workflow (pending → internal_review → approved/rejected)
- Primary Contact: Only one primary contact per company allowed
- Department Assignment: All company users auto-assigned to "Corporate" department
- User Deletion: App-owned users deleted when removed if only in one tenant
- User Creation: New users created with 8-character temporary password
Authentication & Authorization
Corporate Sales Admins
- Super users or admins have full access
- Can view and manage all companies
- Can process all cases
- Can assign users to companies
Company Admins/Users
- Users assigned to companies via CorporateSales_CompanyUser
- Must be TenantUser in the tenant
- Auto-assigned to "Corporate" department
- Role determines access level (admin vs user)
- Can be existing users or created inline
Permission Filtering
getAppUserContext()returns permissions and company assignments- Admins have
assignedCompanyIds: undefined(access to all companies) - Non-admins have
assignedCompanyIds: ["id1", "id2"](specific companies only) - Used across all routes for data isolation
- Sidebar dynamically shows menu items based on permissions
Implementation Phases
Phase 1: Foundation ✅ COMPLETED
- Database schema design
- Module structure setup
- App registration in Blend engine
- Basic CRUD operations (Companies, Cases, Ledger, Notes)
- Component creation (Forms, Tables, Modals, Badges)
- Route implementation
- Session balance calculations
- Case processing workflow (Approve/Reject)
- Company user management
- Permission filtering by user assignment
- Department management ("Corporate" auto-assignment)
- Role-based access control
Phase 2: Business Logic (In Progress)
- Role-based filtering across all routes ✅
- ClubReady API integration ⏳
- Notifications ⏳
- Advanced reporting ⏳
Phase 3: Enhancements (Future)
- Employee self-service portal
- Multi-step approval workflows
- Advanced analytics
- Bulk operations
- Email/SMS notifications
- Public form for case submission
Reporting Requirements
Dashboard Metrics
- Total active companies
- Total pending cases
- Available sessions across all companies
- Cases processed this month
Company Reports
- Session balance history
- Employee allocations
- Case status summary
- Usage trends
Security Considerations
- Role-based access control at all levels
- Company data isolation via permission filtering
- Audit logging for all modifications
- Secure ClubReady API credentials (future)
- No sensitive payment data storage
- User cleanup: App-owned users deleted when removed
- Password security: Auto-generated passwords, bcrypt hashing
- Department isolation: All company users in "Corporate" department
- Primary contact enforcement: Only one primary contact per company
Success Metrics
- Time to process a case: less than 5 minutes
- System uptime: 99.9 percent
- User adoption rate by companies
- Session utilization rate
- Case error rate: less than 1 percent

