6.8 KiB
6.8 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
TimeTrack is a comprehensive web-based time tracking application built with Flask that provides enterprise-level time management capabilities for teams and organizations. It features multi-tenancy, role-based access control, project/team management, billing/invoicing, and secure authentication with 2FA.
Tech Stack
- Backend: Flask 2.0.1 with SQLAlchemy ORM
- Database: PostgreSQL (production) / SQLite (development)
- Migrations: Flask-Migrate (Alembic-based)
- Frontend: Server-side rendered Jinja2 templates with vanilla JavaScript
- Authentication: Session-based with TOTP 2FA support and password reset via email
- Export: Pandas for CSV/Excel, ReportLab for PDF generation
- Mobile: Progressive Web App (PWA) support with optimized mobile UI
Development Setup
Local Development
# Using virtual environment
source .venv/bin/activate # or pipenv shell
# Set environment variables (PostgreSQL example)
export DATABASE_URL="postgresql://timetrack:timetrack123@localhost:5432/timetrack"
# Run the application
python app.py
Docker Development
# Standard docker-compose (uses PostgreSQL)
docker-compose up
# Debug mode with hot-reload
docker-compose -f docker-compose.debug.yml up
Database Operations
Flask-Migrate Commands
# Create a new migration
python create_migration.py "Description of changes"
# Apply pending migrations
python apply_migration.py
# Check current migration state
python check_migration_state.py
# Clean migration state (CAUTION: destructive)
python clean_migration_state.py
# For Docker environments
docker exec timetrack-timetrack-1 python create_migration.py "Description"
docker exec timetrack-timetrack-1 python apply_migration.py
Standard Flask-Migrate Commands
# Create migration
flask db migrate -m "Description"
# Apply migrations
flask db upgrade
# Rollback one revision
flask db downgrade
# Show current revision
flask db current
# Show migration history
flask db history
Key Architecture Patterns
1. Blueprint-Based Modular Architecture
Routes are organized into blueprints by feature domain:
/routes/auth.py- Authentication and authorization decorators/routes/projects.py- Project management/routes/invoice.py- Billing and invoicing/routes/tax_configuration.py- Tax management/routes/teams.py- Team management/routes/export.py- Data export functionality
2. Model Organization
Models are split by domain in /models/:
user.py- User, Role, UserPreferencescompany.py- Company, CompanySettings, CompanyWorkConfigproject.py- Project, ProjectCategoryteam.py- Teamtime_entry.py- TimeEntryinvoice.py- Invoice, InvoiceLineItem, InvoiceStatustax_configuration.py- TaxConfigurationenums.py- BillingType, AccountType, etc.
3. Multi-Tenancy Pattern
All data is scoped by company_id with automatic filtering:
# Common pattern in routes
projects = Project.query.filter_by(company_id=g.user.company_id).all()
4. Role-Based Access Control
Decorators enforce permissions:
@role_required(Role.SUPERVISOR) # Supervisor and above
@admin_required # Admin and System Admin only
@company_required # Ensures user has company context
5. Billing Architecture
- Projects support multiple billing types: NON_BILLABLE, HOURLY, DAILY_RATE, FIXED_RATE
- Invoices support net/gross pricing with country-specific tax configurations
- TimeEntry calculates billing based on project settings (8-hour day for daily rates)
Common Development Tasks
Adding a New Feature
- Create model in appropriate file under
/models/ - Create blueprint in
/routes/with proper decorators - Register blueprint in
app.py - Create templates in
/templates/ - Run migration:
python create_migration.py "Add feature X"
Testing Database Changes
# Check what will be migrated
python check_migration_state.py
# Test in isolated environment
docker-compose -f docker-compose.debug.yml up
# Apply to development database
DATABASE_URL="postgresql://..." python apply_migration.py
Working with Billing Features
When modifying billing/invoice features:
- Check
models/enums.pyfor BillingType values - Update TimeEntry.calculate_billing_amount() for new billing logic
- Update Invoice.calculate_totals() for tax calculations
- Ensure templates handle all billing types (hourly/daily rate display)
Important Implementation Details
Session Management
- Sessions are permanent with 7-day lifetime
- User context loaded in
app.before_request()viag.user - Company context available via
g.company
Time Calculations
- Time entries use UTC internally, converted for display
- Rounding rules configured per company/user
- Break time calculations handled in TimeEntry model
Export System
- Pandas handles CSV/Excel generation
- ReportLab for PDF invoices
- Export routes handle large datasets with streaming
Email Configuration
- Flask-Mail configured via environment variables
- MAIL_SERVER, MAIL_PORT, MAIL_USERNAME required
- Used for user invitations and password resets
Authentication Features
- Password reset functionality with secure tokens (1-hour expiry)
- Two-factor authentication (2FA) using TOTP
- Session-based authentication with "Remember Me" option
- Email verification for new accounts (configurable)
Mobile UI Features
- Progressive Web App (PWA) manifest for installability
- Mobile-optimized navigation with hamburger menu and bottom nav
- Touch-friendly form inputs and buttons (44px minimum touch targets)
- Responsive tables with card view on small screens
- Pull-to-refresh functionality
- Mobile gestures support (swipe, pinch-to-zoom)
- Date/time pickers that respect user preferences
Environment Variables
Required for production:
DATABASE_URL- PostgreSQL connection stringSECRET_KEY- Flask session secretMAIL_SERVER,MAIL_PORT,MAIL_USERNAME,MAIL_PASSWORD- Email config
Optional:
FLASK_ENV- Set to 'development' for debug modeFORCE_HTTPS- Set to 'true' for HTTPS enforcementTRUST_PROXY_HEADERS- Set to 'true' when behind reverse proxy
Troubleshooting
Migration Issues
- Run
python check_migration_state.pyto verify database state - Check
/migrations/versions/for migration files - If stuck, use
clean_migration_state.py(careful - destructive)
Import Errors
- Ensure all model imports in routes use:
from models import ModelName - Blueprint registration order matters in
app.py
Database Connection
- PostgreSQL requires running container or local instance
- Default fallback to SQLite at
/data/timetrack.db - Check
docker-compose.ymlfor PostgreSQL credentials