Add Freelancer registration model.
This commit is contained in:
180
MIGRATION_FREELANCERS.md
Normal file
180
MIGRATION_FREELANCERS.md
Normal file
@@ -0,0 +1,180 @@
|
||||
# Freelancer Migration Guide
|
||||
|
||||
This document explains the database migration for freelancer support in TimeTrack.
|
||||
|
||||
## Overview
|
||||
|
||||
The freelancer migration adds support for independent users who can register without a company token. It introduces:
|
||||
|
||||
1. **Account Types**: Users can be either "Company User" or "Freelancer"
|
||||
2. **Personal Companies**: Freelancers automatically get their own company workspace
|
||||
3. **Business Names**: Optional field for freelancers to specify their business name
|
||||
|
||||
## Database Changes
|
||||
|
||||
### User Table Changes
|
||||
- `account_type` VARCHAR(20) DEFAULT 'Company User' - Type of account
|
||||
- `business_name` VARCHAR(100) - Optional business name for freelancers
|
||||
- `company_id` INTEGER - Foreign key to company table (for multi-tenancy)
|
||||
|
||||
### Company Table Changes
|
||||
- `is_personal` BOOLEAN DEFAULT 0 - Marks companies auto-created for freelancers
|
||||
|
||||
## Migration Options
|
||||
|
||||
### Option 1: Automatic Migration (Recommended)
|
||||
The main migration script (`migrate_db.py`) now includes freelancer support:
|
||||
|
||||
```bash
|
||||
python migrate_db.py
|
||||
```
|
||||
|
||||
This will:
|
||||
- Add new columns to existing tables
|
||||
- Create company table if it doesn't exist
|
||||
- Set default values for existing users
|
||||
|
||||
### Option 2: Dedicated Freelancer Migration
|
||||
Use the dedicated freelancer migration script:
|
||||
|
||||
```bash
|
||||
python migrate_freelancers.py
|
||||
```
|
||||
|
||||
### Option 3: Manual SQL Migration
|
||||
If you prefer manual control:
|
||||
|
||||
```sql
|
||||
-- Add columns to user table
|
||||
ALTER TABLE user ADD COLUMN account_type VARCHAR(20) DEFAULT 'Company User';
|
||||
ALTER TABLE user ADD COLUMN business_name VARCHAR(100);
|
||||
ALTER TABLE user ADD COLUMN company_id INTEGER;
|
||||
|
||||
-- Create company table (if it doesn't exist)
|
||||
CREATE TABLE company (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name VARCHAR(100) UNIQUE NOT NULL,
|
||||
slug VARCHAR(50) UNIQUE NOT NULL,
|
||||
description TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
is_personal BOOLEAN DEFAULT 0,
|
||||
is_active BOOLEAN DEFAULT 1,
|
||||
max_users INTEGER DEFAULT 100
|
||||
);
|
||||
|
||||
-- Or add column to existing company table
|
||||
ALTER TABLE company ADD COLUMN is_personal BOOLEAN DEFAULT 0;
|
||||
|
||||
-- Update existing users
|
||||
UPDATE user SET account_type = 'Company User' WHERE account_type IS NULL;
|
||||
```
|
||||
|
||||
## Post-Migration Steps
|
||||
|
||||
### For Existing Installations
|
||||
1. **Create Default Company**: If you have existing users without a company, create one:
|
||||
```python
|
||||
# In Python/Flask shell
|
||||
from models import db, Company, User
|
||||
|
||||
# Create default company
|
||||
company = Company(
|
||||
name="Default Company",
|
||||
slug="default-company",
|
||||
description="Default company for existing users"
|
||||
)
|
||||
db.session.add(company)
|
||||
db.session.flush()
|
||||
|
||||
# Assign existing users to default company
|
||||
User.query.filter_by(company_id=None).update({'company_id': company.id})
|
||||
db.session.commit()
|
||||
```
|
||||
|
||||
2. **Verify Migration**: Check that all users have a company_id:
|
||||
```sql
|
||||
SELECT COUNT(*) FROM user WHERE company_id IS NULL;
|
||||
-- Should return 0
|
||||
```
|
||||
|
||||
### Testing Freelancer Registration
|
||||
1. Visit `/register/freelancer`
|
||||
2. Register a new freelancer account
|
||||
3. Verify the personal company was created
|
||||
4. Test login and time tracking functionality
|
||||
|
||||
## New Features Available
|
||||
|
||||
### Freelancer Registration
|
||||
- **URL**: `/register/freelancer`
|
||||
- **Features**:
|
||||
- No company token required
|
||||
- Auto-creates personal workspace
|
||||
- Optional business name field
|
||||
- Immediate account activation
|
||||
|
||||
### Registration Options
|
||||
- **Company Registration**: `/register` (existing)
|
||||
- **Freelancer Registration**: `/register/freelancer` (new)
|
||||
- **Login Page**: Shows both registration options
|
||||
|
||||
### User Experience
|
||||
- Freelancers get admin privileges in their personal company
|
||||
- Can create projects and track time immediately
|
||||
- Personal workspace is limited to 1 user by default
|
||||
- Can optionally expand to hire employees later
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Migration fails with "column already exists"**
|
||||
- This is normal if you've run the migration before
|
||||
- The migration script checks for existing columns
|
||||
|
||||
**Users missing company_id after migration**
|
||||
- Run the post-migration steps above to assign a default company
|
||||
|
||||
**Freelancer registration fails**
|
||||
- Check that the AccountType enum is imported correctly
|
||||
- Verify database migration completed successfully
|
||||
|
||||
### Rollback (Limited)
|
||||
SQLite doesn't support dropping columns, so rollback is limited:
|
||||
|
||||
```bash
|
||||
python migrate_freelancers.py rollback
|
||||
```
|
||||
|
||||
For full rollback, you would need to:
|
||||
1. Export user data
|
||||
2. Recreate tables without freelancer columns
|
||||
3. Re-import data
|
||||
|
||||
## Verification Commands
|
||||
|
||||
```bash
|
||||
# Verify migration applied
|
||||
python migrate_freelancers.py verify
|
||||
|
||||
# Check table structure
|
||||
sqlite3 timetrack.db ".schema user"
|
||||
sqlite3 timetrack.db ".schema company"
|
||||
|
||||
# Check data
|
||||
sqlite3 timetrack.db "SELECT account_type, COUNT(*) FROM user GROUP BY account_type;"
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- Freelancers get unique usernames/emails globally (not per-company)
|
||||
- Personal companies are limited to 1 user by default
|
||||
- Freelancers have admin privileges only in their personal workspace
|
||||
- Multi-tenant isolation is maintained
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- Allow freelancers to upgrade to team accounts
|
||||
- Billing integration for freelancer vs company accounts
|
||||
- Advanced freelancer-specific features
|
||||
- Integration with invoicing systems
|
||||
Reference in New Issue
Block a user