FleetOS Company-Owned Migration Plan

Date: 2026-01-09 Status: APPROVED - Ready to Execute Effort: 6-8 hours Risk: LOW


🎯 Objective

Transform FleetOS from user-owned to company-owned architecture:

  • ✅ RFQs owned by companies, not individual users

  • ✅ Team members see all company work

  • ✅ Boss oversight built-in

  • ✅ Emergency access works

  • ✅ BIBLE-compliant


📋 Phase 1: Database Migration

Step 1.1: Add Company Columns to service_requests

File: database/fleetos/add_company_columns.sql (NEW)

-- ============================================
-- FLEETOS COMPANY-OWNED MIGRATION
-- Add company columns to service_requests table
-- Safe to run: Uses IF NOT EXISTS, backward compatible
-- ============================================

-- Add fleet_company_id column
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.columns
    WHERE table_name='service_requests' AND column_name='fleet_company_id'
  ) THEN
    ALTER TABLE service_requests
    ADD COLUMN fleet_company_id UUID REFERENCES companies(company_id);

    RAISE NOTICE '✅ Added fleet_company_id column';
  ELSE
    RAISE NOTICE 'ℹ️  fleet_company_id column already exists';
  END IF;
END $$;

-- Add supplier_company_id column
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.columns
    WHERE table_name='service_requests' AND column_name='supplier_company_id'
  ) THEN
    ALTER TABLE service_requests
    ADD COLUMN supplier_company_id UUID REFERENCES companies(company_id);

    RAISE NOTICE '✅ Added supplier_company_id column';
  ELSE
    RAISE NOTICE 'ℹ️  supplier_company_id column already exists';
  END IF;
END $$;

-- Add submitted_by_user_id column (audit trail)
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.columns
    WHERE table_name='service_requests' AND column_name='submitted_by_user_id'
  ) THEN
    ALTER TABLE service_requests
    ADD COLUMN submitted_by_user_id UUID REFERENCES users(user_id);

    RAISE NOTICE '✅ Added submitted_by_user_id column';
  ELSE
    RAISE NOTICE 'ℹ️  submitted_by_user_id column already exists';
  END IF;
END $$;

-- Add assigned_to_user_id column (current tech working)
DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM information_schema.columns
    WHERE table_name='service_requests' AND column_name='assigned_to_user_id'
  ) THEN
    ALTER TABLE service_requests
    ADD COLUMN assigned_to_user_id UUID REFERENCES users(user_id);

    RAISE NOTICE '✅ Added assigned_to_user_id column';
  ELSE
    RAISE NOTICE 'ℹ️  assigned_to_user_id column already exists';
  END IF;
END $$;

-- Create indexes for performance
CREATE INDEX IF NOT EXISTS idx_service_requests_fleet_company
  ON service_requests(fleet_company_id);

CREATE INDEX IF NOT EXISTS idx_service_requests_supplier_company
  ON service_requests(supplier_company_id);

CREATE INDEX IF NOT EXISTS idx_service_requests_submitted_by
  ON service_requests(submitted_by_user_id);

CREATE INDEX IF NOT EXISTS idx_service_requests_assigned_to
  ON service_requests(assigned_to_user_id);

-- Log completion
DO $$
BEGIN
  RAISE NOTICE '✅ FleetOS company-owned migration complete!';
  RAISE NOTICE '   - fleet_company_id added';
  RAISE NOTICE '   - supplier_company_id added';
  RAISE NOTICE '   - submitted_by_user_id added';
  RAISE NOTICE '   - assigned_to_user_id added';
  RAISE NOTICE '   - Indexes created';
  RAISE NOTICE '⚠️  Old columns (fleet_user_id, supplier_id) still exist for backward compatibility';
  RAISE NOTICE '⚠️  Update application code to use new columns';
END $$;

How to run:

  1. Copy SQL above

  2. Go to Supabase SQL Editor

  3. Paste and click "Run"

  4. Verify output shows ✅ messages

Verification:


📝 Phase 2: Code Changes

Step 2.1: Update QueryService.createServiceRequest()

File: services/shared/QueryService.ts

Current Code (Lines 59-84):

NEW Code:

Changes:

  • ✅ Added fleet_company_id (NEW - company owns)

  • ✅ Added supplier_company_id (NEW - company owns)

  • ✅ Added submitted_by_user_id (NEW - audit trail)

  • ✅ Added assigned_to_user_id (NEW - current tech)

  • ✅ Kept old columns for backward compatibility


Step 2.2: Update Seed Functions (Fleet Side)

File: App.tsx

Current Code (Lines 83-200):

NEW Code:

Call Site Update (Line ~706):


Step 2.3: Update Seed Functions (Supplier Side)

File: App.tsx

Current Code (Lines 205-304):

NEW Code:

Call Site Update (Line ~728):


Step 2.4: Update Manual Request Form

File: components/fleetos/forms/ManualRequestForm.tsx

Find the onSubmit handler and update:

Props update needed:


Step 2.5: Update Fleet Request Form

File: components/fleetos/forms/FleetRequestForm.tsx

Similar updates to ManualRequestForm:


Step 2.6: Update App.tsx Route Handlers

File: App.tsx

Update FLEETOS_SUPPLIER_ADD_MANUAL_REQUEST:

Update FLEETOS_FLEET_CREATE_REQUEST:


🧪 Phase 3: Testing Checklist

Pre-Migration Tests

Migration Tests

Code Tests

Test 1: Company Creation (Signup)

Test 2: Seed Data (Company-Owned)

Test 3: Manual Request (Supplier)

Test 4: Fleet Request (Fleet)

Test 5: Team Visibility (CRITICAL)

Test 6: Daily Access (Org-Scoped)

Test 7: Emergency Access (One Sentence Test)

Database Verification Queries


🔄 Phase 4: Rollback Strategy

If Migration Fails

SQL Rollback:

Code Rollback:


📅 Deployment Plan

Step 1: Preparation

Step 2: Database Migration

Step 3: Code Deployment

Step 4: Verification

Step 5: Documentation


✅ Success Criteria

Migration is successful when:

  1. ✅ Database has 4 new columns

  2. ✅ All new requests use company IDs

  3. ✅ Team members see each other's work

  4. ✅ Boss sees all company work

  5. ✅ Daily access magic links work

  6. ✅ Emergency access works

  7. ✅ One Sentence Test passes

  8. ✅ Build passes with no errors

  9. ✅ No data loss or corruption

  10. ✅ BIBLE compliance = 100%


📊 Estimated Timeline

Phase
Task
Time

1

Database Migration

30 min

2

Code Changes

3 hours

3

Testing

2 hours

4

Documentation

30 min

Total

6 hours


🚀 Ready to Execute

Status: Plan approved, ready to implement

Next Steps:

  1. Create database migration SQL file

  2. Update code files per plan

  3. Run tests

  4. Deploy

Questions? Review FLEETOS_FUNDAMENTAL_DECISION.md for rationale.


Created: 2026-01-09 Status: APPROVED - Ready to Execute Next: Begin Phase 1 (Database Migration)

Last updated

Was this helpful?