Kulcare Docs

Access Control & User Management System

Overview

The Access Control & User Management System provides comprehensive role-based permissions and location-based data access for multi-location clinics. This system enables clinic owners to manage staff across multiple locations with granular control over data access and feature permissions.

Key Features

  • Hierarchical Role System: Owner > Admin > Doctor/Consultant > Staff
  • Location-Based Access: Assign users to specific locations or grant all-location access
  • Shared Patient Records: Patients are shared across locations with access control
  • Premium Features: Consolidated reporting and revenue sharing for multi-location clinics
  • Security: Two-factor authentication, IP restrictions, and audit trails

User Roles & Hierarchy

Role Definitions

1. Owner

  • Description: Clinic owner with full system access
  • Key Permissions:
    • Full access to all locations and data
    • Manage the Kulcare subscription — the owner alone holds this by default (view_subscription / manage_subscription, #2274)
    • Manage practice finance: commissions, revenue share, payouts
    • View consolidated reports (premium)
    • Create/manage all user types
    • Configure clinic settings
    • Access revenue sharing data (premium)

2. Admin

  • Description: Administrative staff with management capabilities
  • Key Permissions:
    • Manage users (except owners)
    • Access patient bills and practice finance for assigned locations. Not the Kulcare subscription — changing or cancelling the plan is owner-only unless the tenant grants view_subscription / manage_subscription to the admin role explicitly (#2274)
    • View location-specific reports
    • Configure location settings
    • Full patient and appointment access

3. Doctor/Consultant

  • Description: Medical practitioners (consultants are non-owner doctors)
  • Key Permissions:
    • View/manage their own patients
    • Create appointments and prescriptions
    • View patient financial data (their patients only)
    • No access to other doctors' patients
    • No user management capabilities

4. Staff

  • Description: Non-medical support staff
  • Key Permissions:
    • Basic patient registration and queue management
    • Appointment scheduling
    • No financial data access
    • No user management
    • No prescription access

Cross-Network Roles

  • Users can have different roles across different clinic networks
  • Role assignments are network-specific
  • Single sign-on with network selection

Location-Based Access Control

Access Models

1. Single Location Access

  • User assigned to specific location(s)
  • Can only view/manage data for assigned locations
  • Appointments and queue specific to location

2. All Locations Access

  • Available for Owners and designated Admins
  • View and manage data across all clinic locations
  • Switch between location-specific and consolidated views

Data Visibility Rules

Data TypeOwnerAdminDoctorStaff
PatientsAll locationsAssigned locationsOwn patients onlyAssigned locations
AppointmentsAll locationsAssigned locationsOwn appointmentsAssigned locations
FinancialAll + ConsolidatedLocation-specificOwn patients onlyNone
ReportsAll + ConsolidatedLocation-specificOwn practice onlyBasic only
SettingsAll locationsAssigned locationsNoneNone

Permission System

Permission Categories

1. Patient Management

patient.view; // View patient records
patient.create; // Register new patients
patient.edit; // Update patient information
patient.delete; // Delete patient records
patient.export; // Export patient data

2. Appointment Management

appointment.view; // View appointments
appointment.create; // Create new appointments
appointment.edit; // Modify appointments
appointment.cancel; // Cancel appointments
appointment.reports; // View appointment reports

3. Billing & Financial

These dotted names are illustrative and do not exist in the codebase. The real permissions are flat feature_name strings on reference.permissions, and billing is three separate families rather than one — see Permission management API for the authoritative list and Billing domain architecture for which family owns what. In short:

  • patient bills: view_bills, add_bills, edit_bills
  • practice finance: view_practice_finance, manage_practice_finance
  • Kulcare subscription: view_subscription, manage_subscription (owner only)
billing.view; // View billing information
billing.create; // Create bills/invoices
billing.edit; // Modify billing records
billing.reports; // View financial reports
billing.consolidated; // View multi-location financials (premium)

4. Reports & Analytics

reports.clinical; // Clinical reports
reports.financial; // Financial reports
reports.operational; // Operational metrics
reports.consolidated; // Multi-location reports (premium)

5. Settings & Configuration

settings.clinic; // Clinic configuration
settings.users; // User management
settings.locations; // Location management
settings.billing; // Billing configuration

6. Marketing & Campaigns

marketing.campaigns; // Create/manage campaigns
marketing.spend; // View/manage ad spend
marketing.analytics; // Marketing performance

Role-Permission Matrix

PermissionOwnerAdminDoctorStaff
patient.*✓✓✓ (own)✓ (view/create)
appointment.*✓✓✓ (own)✓
billing.*✓✓ (location)✓ (own patients)✗
reports.*✓✓ (location)✓ (own)✓ (basic)
settings.*✓✓ (limited)✗✗
marketing.*✓✓✗✗

User Management

User Lifecycle

1. Invitation Flow

Owner/Admin initiates invitation
    ↓
Email sent with invitation link
    ↓
User creates account with invitation code
    ↓
User assigned to role and location(s)
    ↓
User active in system

2. User States

  • Invited: Invitation sent, awaiting acceptance
  • Active: User has accepted and can access system
  • Suspended: Temporarily disabled, cannot login
  • Deactivated: Permanently disabled, data retained

Invitation API

POST /api/users/invite
{
  email: string
  role: "owner" | "admin" | "doctor" | "staff"
  locations: string[] | "all"
  permissions?: string[] // Optional custom permissions
  expiresIn?: number // Invitation expiry in days
}

User Management Features

  • Bulk user import via CSV
  • User activity tracking
  • Last login timestamps
  • Session management
  • Force logout capability

Data Access Patterns

Patient Data Access

  • Shared across locations: Patients can visit any clinic location
  • Access control: Based on user's location assignment and role
  • Doctor-specific: Doctors only see patients they've treated
  • Referral visibility: Referred patients visible to receiving doctor

Appointment Access

  • Location-specific: Appointments tied to specific locations
  • Cross-location booking: Available for authorized users
  • Doctor schedules: Visible based on location assignment

Financial Data Access

  • Location isolation: Financial data separated by location
  • Consolidated view: Available to owners (premium feature)
  • Doctor commissions: Track revenue sharing (premium)
  • Patient-level: Doctors see financial data for their patients only

Security Features

Feature Flags

The following security features are controlled by feature flags:

  • ENABLE_TWO_FACTOR_AUTH: Two-factor authentication system
  • ENABLE_AUDIT_TRAIL: Audit trail tracking and viewing
  • ENABLE_SESSION_MANAGEMENT: Session management and force logout
  • ENABLE_IP_RESTRICTIONS: IP whitelisting/blacklisting (coming soon)

Authentication & Authorization

Two-Factor Authentication (2FA)

  • SMS-based OTP
  • Authenticator app support
  • Backup codes
  • Required for: Owners, Admins (configurable)

Session Management

  • Real-time Session Tracking: View all active sessions with device, browser, and location information
  • Device Detection: Automatic detection of device type, browser, and operating system
  • Force Logout: Terminate individual sessions or all sessions except current
  • Session Status: Track active/idle sessions with last activity timestamps
  • Current Session Identification: Visual indicator for the user's current session
  • Session History: Complete login history with IP addresses and user agents
  • Concurrent Login Support: Allow multiple devices with tracking
  • Session Timeout Configuration: Customizable session expiration
  • Activity Monitoring: Track user actions within each session

IP Restrictions

  • Whitelist IP ranges by role
  • Location-based IP restrictions
  • VPN detection and policies
  • Geo-blocking capabilities

Audit Trail

Tracked Events

  • User login/logout
  • Data access (patient records, financial)
  • Configuration changes
  • User management actions
  • Export operations

Audit Log Structure

{
  userId: string
  action: string
  resource: string
  resourceId: string
  location: string
  ipAddress: string
  userAgent: string
  timestamp: Date
  changes?: Record<string, any>
}

Premium Features

Consolidated Reporting

  • Multi-location dashboards: Overview across all locations
  • Comparative analytics: Compare location performance
  • Financial consolidation: Combined P&L statements
  • Trend analysis: Cross-location trends

Revenue Sharing & Commissions

  • Doctor commission tracking: Percentage or fixed fee
  • Automated calculations: Based on services rendered
  • Payout management: Track pending and paid commissions
  • Performance incentives: Bonus calculations

Advanced Access Control

  • Custom roles: Create clinic-specific roles
  • Granular permissions: Feature-level access control
  • Approval workflows: Multi-step approval for sensitive actions
  • Temporary access: Time-bound permission grants

Implementation Architecture

Database Schema Updates

Users Table Extension

ALTER TABLE users ADD COLUMN (
  phone_verified BOOLEAN DEFAULT FALSE,
  two_factor_enabled BOOLEAN DEFAULT FALSE,
  two_factor_secret VARCHAR(255),
  last_login_at TIMESTAMP,
  suspended_at TIMESTAMP,
  suspended_reason TEXT,
  created_by_user_id UUID REFERENCES users(id),
  ip_whitelist JSONB DEFAULT '[]'
);

User Location Assignments

CREATE TABLE user_location_assignments (
  id UUID PRIMARY KEY,
  user_id UUID REFERENCES users(id),
  location_id UUID REFERENCES locations(id),
  assigned_at TIMESTAMP DEFAULT NOW(),
  assigned_by UUID REFERENCES users(id),
  is_primary BOOLEAN DEFAULT FALSE,
  UNIQUE(user_id, location_id)
);

Custom Permissions

CREATE TABLE user_custom_permissions (
  id UUID PRIMARY KEY,
  user_id UUID REFERENCES users(id),
  permission VARCHAR(100),
  granted_by UUID REFERENCES users(id),
  granted_at TIMESTAMP DEFAULT NOW(),
  expires_at TIMESTAMP,
  UNIQUE(user_id, permission)
);

API Endpoints

User Management

// User CRUD
GET    /api/users                    // List users with filters
GET    /api/users/:id                // Get user details
POST   /api/users/invite             // Send invitation
PUT    /api/users/:id                // Update user
DELETE /api/users/:id                // Deactivate user

// User Status
PUT    /api/users/:id/suspend       // Suspend user
PUT    /api/users/:id/activate      // Activate user
POST   /api/users/:id/reset-password // Trigger password reset

// Location Assignment
GET    /api/users/:id/locations     // Get user's locations
PUT    /api/users/:id/locations     // Update location assignments

// Permissions
GET    /api/users/:id/permissions   // Get effective permissions
PUT    /api/users/:id/permissions   // Update custom permissions

// Audit
GET    /api/users/:id/activity      // User activity log
GET    /api/audit-logs              // System-wide audit logs
POST   /api/audit-logs/export       // Export audit logs (JSON/CSV)

// Session Management
GET    /api/users/:id/sessions      // Get user's active sessions
DELETE /api/users/:id/sessions/:sessionId // Force logout specific session
DELETE /api/users/:id/sessions      // Force logout all sessions
GET    /api/sessions/settings       // Get session configuration
PUT    /api/sessions/settings       // Update session configuration
GET    /api/sessions/:id/activity   // Get session activity details

State Management Extension

interface UserManagementState {
  // Users
  users: User[];
  usersLoading: boolean;
  usersError: string | null;

  // Current user permissions
  permissions: string[];
  locationAccess: string[] | "all";

  // Actions
  fetchUsers: (filters?: UserFilters) => Promise<void>;
  inviteUser: (data: InviteUserData) => Promise<void>;
  updateUser: (id: string, data: UpdateUserData) => Promise<void>;
  suspendUser: (id: string, reason: string) => Promise<void>;
  updateLocationAssignments: (
    userId: string,
    locations: string[]
  ) => Promise<void>;
}

UI Components

User Management (packages/ui-kit/src/components/users/)

UserTable.tsx; // List users with actions
UserInviteModal.tsx; // Invite new user form
UserEditModal.tsx; // Edit user details
UserLocationManagementModal.tsx; // Manage user location assignments
TwoFactorSetupModal.tsx; // Two-factor authentication setup wizard
TwoFactorManagement.tsx; // Manage 2FA settings
AuditTrailViewer.tsx; // System-wide audit trail with filtering and export
SessionManagement.tsx; // Active session management with force logout
PermissionMatrix.tsx; // View/edit permissions (coming soon)
UserActivityLog.tsx; // User activity timeline (coming soon)

Access Control (packages/ui-kit/src/components/access/)

PermissionGate.tsx; // Component-level access control
LocationSelector.tsx; // Switch between locations
AccessDenied.tsx; // Unauthorized access page

Integration Points

Subscription System Integration

  • Location limits enforced based on subscription plan
  • Premium features (consolidated reports, revenue sharing) gated by plan
  • User invitation limits (if applicable)

Existing Auth System

  • Extend current User and Clinic interfaces
  • Maintain backward compatibility
  • Progressive enhancement approach

Mobile App Considerations

  • Same permission model applies
  • Location-based features in mobile
  • Offline capability with sync

Migration Strategy

Phase 1: Core User Management

  1. Extend user model with new fields
  2. Implement invitation system
  3. Basic role-based permissions

Phase 2: Location-Based Access

  1. Create location assignment system
  2. Implement data filtering by location
  3. Location switching UI

Phase 3: Advanced Features (Completed)

  1. ✅ Two-factor authentication with TOTP and backup codes
  2. ✅ Audit trail implementation with filtering and export
  3. ✅ Session management with force logout capabilities
  4. ⏳ IP restrictions (pending)

Phase 4: Premium Features

  1. Consolidated reporting
  2. Revenue sharing system
  3. Custom roles and permissions

Security Best Practices

  1. Principle of Least Privilege: Users get minimum required permissions
  2. Regular Access Reviews: Periodic audit of user permissions
  3. Secure Defaults: New users start with minimal access
  4. Audit Everything: Comprehensive logging of sensitive actions
  5. Data Encryption: Encrypt sensitive data at rest and in transit

On this page