mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2026-01-06 11:40:52 -06:00
- Clients: add model, routes, and templates
- app/models/client.py
- app/routes/clients.py
- templates/clients/{create,edit,list,view}.html
- docs/CLIENT_MANAGEMENT_README.md
- Database: add enhanced init/verify scripts, migrations, and docs
- docker/{init-database-enhanced.py,start-enhanced.py,verify-database.py}
- docs/ENHANCED_DATABASE_STARTUP.md
- migrations/{add_analytics_column.sql,add_analytics_setting.py,migrate_to_client_model.py}
- Scripts: add version manager and docker network test helpers
- scripts/version-manager.{bat,ps1,py,sh}
- scripts/test-docker-network.{bat,sh}
- docs/VERSION_MANAGEMENT.md
- UI: tweak base stylesheet
- app/static/base.css
- Tests: add client system test
- test_client_system.py
9.9 KiB
9.9 KiB
Enhanced Database Startup Procedure
This document describes the improved database initialization and startup procedure for TimeTracker that ensures all tables are correctly created with proper schema and handles migrations automatically.
Overview
The enhanced startup procedure addresses several issues found in the previous implementation:
- Missing Analytics Table: The analytics functionality exists but there was no dedicated analytics table
- Schema Verification: Previous scripts didn't verify that all required columns exist in existing tables
- Migration Handling: Analytics setting migration wasn't integrated into the main startup process
- Table Recreation Logic: Previous logic might drop and recreate tables unnecessarily
New Components
1. Enhanced Database Initialization Script (init-database-enhanced.py)
This script provides comprehensive database setup:
- Schema Definition: Defines the complete expected database schema including all tables, columns, and relationships
- Smart Table Creation: Creates tables only if they don't exist, or adds missing columns if they do exist
- Index Management: Creates performance indexes for all tables
- Trigger Setup: Sets up automatic timestamp updates for
updated_atcolumns - Data Initialization: Inserts default admin user, project, and settings
- Schema Verification: Verifies that all required tables and columns exist after initialization
Tables Created
users- User accounts and authenticationprojects- Project definitions and client informationtime_entries- Time tracking recordstasks- Task management within projectssettings- Application configuration and company brandinginvoices- Invoice managementinvoice_items- Individual invoice line items
Key Features
- Non-destructive: Never drops existing tables or data
- Migration-friendly: Automatically adds missing columns to existing tables
- Comprehensive: Handles all aspects of database setup in one script
- Error-tolerant: Continues operation even if some optional features fail
2. Enhanced Startup Script (start-enhanced.py)
Simplified startup process that:
- Uses the enhanced database initialization script
- Provides better error handling and logging
- Displays network information for debugging
- Ensures proper startup sequence
3. Database Verification Script (verify-database.py)
Independent verification tool that:
- Checks all tables exist with correct schema
- Verifies indexes and foreign keys
- Reports any missing or incorrect elements
- Can be run independently to diagnose issues
Startup Sequence
- Container Start: Docker container starts with the enhanced startup script
- Database Wait: Waits for PostgreSQL database to be ready
- Enhanced Initialization: Runs the comprehensive database setup script
- Schema Verification: Verifies all tables and columns are correct
- Application Start: Launches the Flask application with Gunicorn
Database Schema
Core Tables
users
id SERIAL PRIMARY KEY,
username VARCHAR(80) UNIQUE NOT NULL,
role VARCHAR(20) DEFAULT 'user' NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
last_login TIMESTAMP,
is_active BOOLEAN DEFAULT true NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
projects
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
client VARCHAR(200) NOT NULL,
description TEXT,
billable BOOLEAN DEFAULT true NOT NULL,
hourly_rate NUMERIC(9, 2),
billing_ref VARCHAR(100),
status VARCHAR(20) DEFAULT 'active' NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
time_entries
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
task_id INTEGER REFERENCES tasks(id) ON DELETE SET NULL,
start_time TIMESTAMP NOT NULL,
end_time TIMESTAMP,
duration_seconds INTEGER,
notes TEXT,
tags VARCHAR(500),
source VARCHAR(20) DEFAULT 'manual' NOT NULL,
billable BOOLEAN DEFAULT true NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
tasks
id SERIAL PRIMARY KEY,
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE NOT NULL,
name VARCHAR(200) NOT NULL,
description TEXT,
status VARCHAR(20) DEFAULT 'pending' NOT NULL,
priority VARCHAR(20) DEFAULT 'medium' NOT NULL,
assigned_to INTEGER REFERENCES users(id),
created_by INTEGER REFERENCES users(id) NOT NULL,
due_date DATE,
estimated_hours NUMERIC(5,2),
actual_hours NUMERIC(5,2),
started_at TIMESTAMP,
completed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
settings
id SERIAL PRIMARY KEY,
timezone VARCHAR(50) DEFAULT 'Europe/Rome' NOT NULL,
currency VARCHAR(3) DEFAULT 'EUR' NOT NULL,
rounding_minutes INTEGER DEFAULT 1 NOT NULL,
single_active_timer BOOLEAN DEFAULT true NOT NULL,
allow_self_register BOOLEAN DEFAULT true NOT NULL,
idle_timeout_minutes INTEGER DEFAULT 30 NOT NULL,
backup_retention_days INTEGER DEFAULT 30 NOT NULL,
backup_time VARCHAR(5) DEFAULT '02:00' NOT NULL,
export_delimiter VARCHAR(1) DEFAULT ',' NOT NULL,
allow_analytics BOOLEAN DEFAULT true NOT NULL,
-- Company branding fields...
company_name VARCHAR(200) DEFAULT 'Your Company Name' NOT NULL,
company_address TEXT DEFAULT 'Your Company Address' NOT NULL,
company_email VARCHAR(200) DEFAULT 'info@yourcompany.com' NOT NULL,
company_phone VARCHAR(50) DEFAULT '+1 (555) 123-4567' NOT NULL,
company_website VARCHAR(200) DEFAULT 'www.yourcompany.com' NOT NULL,
company_logo_filename VARCHAR(255) DEFAULT '' NOT NULL,
company_tax_id VARCHAR(100) DEFAULT '' NOT NULL,
company_bank_info TEXT DEFAULT '' NOT NULL,
-- Invoice defaults...
invoice_prefix VARCHAR(10) DEFAULT 'INV' NOT NULL,
invoice_start_number INTEGER DEFAULT 1000 NOT NULL,
invoice_terms TEXT DEFAULT 'Payment is due within 30 days of invoice date.' NOT NULL,
invoice_notes TEXT DEFAULT 'Thank you for your business!' NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
invoices
id SERIAL PRIMARY KEY,
invoice_number VARCHAR(50) UNIQUE NOT NULL,
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
client_name VARCHAR(200) NOT NULL,
client_email VARCHAR(200),
client_address TEXT,
issue_date DATE NOT NULL,
due_date DATE NOT NULL,
status VARCHAR(20) DEFAULT 'draft' NOT NULL,
subtotal NUMERIC(10, 2) NOT NULL DEFAULT 0,
tax_rate NUMERIC(5, 2) NOT NULL DEFAULT 0,
tax_amount NUMERIC(10, 2) NOT NULL DEFAULT 0,
total_amount NUMERIC(10, 2) NOT NULL DEFAULT 0,
notes TEXT,
terms TEXT,
created_by INTEGER REFERENCES users(id) ON DELETE CASCADE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
invoice_items
id SERIAL PRIMARY KEY,
invoice_id INTEGER REFERENCES invoices(id) ON DELETE CASCADE,
description VARCHAR(500) NOT NULL,
quantity NUMERIC(10, 2) NOT NULL DEFAULT 1,
unit_price NUMERIC(10, 2) NOT NULL,
total_amount NUMERIC(10, 2) NOT NULL,
time_entry_ids VARCHAR(500),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Performance Features
Indexes
- User authentication:
username,role - Project queries:
client,status - Time tracking:
user_id,project_id,task_id,start_time,billable - Task management:
project_id,status,assigned_to,due_date - Invoice management:
project_id,status,issue_date
Triggers
- Automatic
updated_attimestamp updates for all tables that have this column - Ensures data consistency without application-level code
Migration Support
The enhanced initialization script automatically handles:
- New Tables: Creates any missing tables
- New Columns: Adds missing columns to existing tables
- Schema Updates: Ensures existing databases are updated to current schema
- Data Preservation: Never drops existing data
Verification
Startup Verification
- Automatic verification after initialization
- Reports any issues found
- Ensures application only starts with correct database schema
Manual Verification
# Run verification script independently
python docker/verify-database.py
# Check specific aspects
python docker/test-schema.py
Error Handling
The enhanced startup procedure includes comprehensive error handling:
- Database Connection: Waits for database to be ready with retry logic
- Schema Issues: Reports specific problems and continues where possible
- Non-critical Failures: Continues operation even if some optional features fail
- Detailed Logging: Provides clear information about what succeeded and what failed
Troubleshooting
Common Issues
- Missing Tables: Run
verify-database.pyto identify missing tables - Schema Mismatches: The enhanced script automatically adds missing columns
- Permission Issues: Ensure database user has CREATE, ALTER, and INSERT privileges
- Connection Problems: Check DATABASE_URL environment variable and network connectivity
Debug Commands
# Check database schema
python docker/verify-database.py
# Test database connection
python docker/test-db.py
# View startup logs
docker logs <container_name>
Benefits
- Reliability: Ensures consistent database schema across all deployments
- Maintainability: Single script handles all database setup
- Migration Safety: Never loses existing data during updates
- Performance: Proper indexes and triggers for optimal operation
- Debugging: Comprehensive verification and error reporting
Future Enhancements
- Version Tracking: Database schema version tracking for future migrations
- Rollback Support: Ability to rollback schema changes if needed
- Performance Monitoring: Database performance metrics collection
- Automated Testing: Integration with CI/CD pipeline for schema validation