mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2025-12-31 00:09:58 -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
187 lines
7.5 KiB
Python
187 lines
7.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script for the new client management system
|
|
This script will test:
|
|
1. Client creation
|
|
2. Project creation with client selection
|
|
3. Rate auto-population
|
|
4. Client management operations
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add the current directory to the path so we can import app modules
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
|
|
from app import create_app, db
|
|
from app.models import User, Project, Client
|
|
|
|
def test_client_system():
|
|
"""Test the client management system"""
|
|
app = create_app()
|
|
|
|
with app.app_context():
|
|
print("Testing Client Management System...")
|
|
print("=" * 50)
|
|
|
|
try:
|
|
# Check if clients table exists
|
|
inspector = db.inspect(db.engine)
|
|
existing_tables = inspector.get_table_names()
|
|
|
|
if 'clients' not in existing_tables:
|
|
print("❌ Clients table does not exist. Please run the migration first.")
|
|
return False
|
|
|
|
print("✅ Clients table exists")
|
|
|
|
# Check if projects table has client_id column
|
|
project_columns = [col['name'] for col in inspector.get_columns('projects')]
|
|
|
|
if 'client_id' not in project_columns:
|
|
print("❌ Projects table missing client_id column. Please run the migration first.")
|
|
return False
|
|
|
|
print("✅ Projects table has client_id column")
|
|
|
|
# Test client creation
|
|
print("\nTesting Client Creation...")
|
|
|
|
# Check if test client already exists
|
|
test_client = Client.query.filter_by(name='Test Client Corp').first()
|
|
if test_client:
|
|
print(f"✅ Test client already exists (ID: {test_client.id})")
|
|
else:
|
|
# Create test client
|
|
test_client = Client(
|
|
name='Test Client Corp',
|
|
description='Test client for system verification',
|
|
contact_person='John Doe',
|
|
email='john@testclient.com',
|
|
phone='+1 (555) 123-4567',
|
|
address='123 Test Street, Test City, TC 12345',
|
|
default_hourly_rate=85.00
|
|
)
|
|
db.session.add(test_client)
|
|
db.session.commit()
|
|
print(f"✅ Test client created (ID: {test_client.id})")
|
|
|
|
# Test project creation with client
|
|
print("\nTesting Project Creation with Client...")
|
|
|
|
# Check if test project already exists
|
|
test_project = Project.query.filter_by(name='Test Project - Client System').first()
|
|
if test_project:
|
|
print(f"✅ Test project already exists (ID: {test_project.id})")
|
|
else:
|
|
# Create test project
|
|
test_project = Project(
|
|
name='Test Project - Client System',
|
|
client_id=test_client.id,
|
|
description='Test project to verify client integration',
|
|
billable=True,
|
|
hourly_rate=85.00, # Should match client default
|
|
billing_ref='TEST-001'
|
|
)
|
|
db.session.add(test_project)
|
|
db.session.commit()
|
|
print(f"✅ Test project created (ID: {test_project.id})")
|
|
|
|
# Test client properties
|
|
print("\nTesting Client Properties...")
|
|
|
|
print(f"Client name: {test_client.name}")
|
|
print(f"Client description: {test_client.description}")
|
|
print(f"Client default rate: {test_client.default_hourly_rate}")
|
|
print(f"Client status: {test_client.status}")
|
|
print(f"Client total projects: {test_client.total_projects}")
|
|
print(f"Client active projects: {test_client.active_projects}")
|
|
print(f"Client total hours: {test_client.total_hours}")
|
|
print(f"Client estimated cost: {test_client.estimated_total_cost}")
|
|
|
|
# Test project properties
|
|
print("\nTesting Project Properties...")
|
|
|
|
print(f"Project name: {test_project.name}")
|
|
print(f"Project client: {test_project.client}") # Using backward compatibility property
|
|
print(f"Project client_id: {test_project.client_id}")
|
|
print(f"Project hourly rate: {test_project.hourly_rate}")
|
|
print(f"Project billable: {test_project.billable}")
|
|
|
|
# Test client relationships
|
|
print("\nTesting Client Relationships...")
|
|
|
|
client_projects = test_client.projects.all()
|
|
print(f"Client has {len(client_projects)} projects:")
|
|
for project in client_projects:
|
|
print(f" - {project.name} (ID: {project.id})")
|
|
|
|
# Test client management methods
|
|
print("\nTesting Client Management Methods...")
|
|
|
|
active_clients = Client.get_active_clients()
|
|
print(f"Active clients: {len(active_clients)}")
|
|
|
|
all_clients = Client.get_all_clients()
|
|
print(f"All clients: {len(all_clients)}")
|
|
|
|
# Test client archiving (create a test client to archive)
|
|
print("\nTesting Client Archiving...")
|
|
|
|
archive_test_client = Client.query.filter_by(name='Archive Test Client').first()
|
|
if not archive_test_client:
|
|
archive_test_client = Client(
|
|
name='Archive Test Client',
|
|
description='Client to test archiving functionality'
|
|
)
|
|
db.session.add(archive_test_client)
|
|
db.session.commit()
|
|
print(f"✅ Archive test client created (ID: {archive_test_client.id})")
|
|
|
|
if archive_test_client.status == 'active':
|
|
archive_test_client.archive()
|
|
db.session.commit()
|
|
print(f"✅ Client '{archive_test_client.name}' archived")
|
|
else:
|
|
print(f"✅ Client '{archive_test_client.name}' already archived")
|
|
|
|
# Test client activation
|
|
if archive_test_client.status == 'inactive':
|
|
archive_test_client.activate()
|
|
db.session.commit()
|
|
print(f"✅ Client '{archive_test_client.name}' activated")
|
|
|
|
# Clean up test data (optional)
|
|
print("\nCleaning up test data...")
|
|
|
|
# Delete test project
|
|
if test_project:
|
|
db.session.delete(test_project)
|
|
print("✅ Test project deleted")
|
|
|
|
# Delete test clients
|
|
if test_client:
|
|
db.session.delete(test_client)
|
|
print("✅ Test client deleted")
|
|
|
|
if archive_test_client:
|
|
db.session.delete(archive_test_client)
|
|
print("✅ Archive test client deleted")
|
|
|
|
db.session.commit()
|
|
|
|
print("\n🎉 All tests passed! Client management system is working correctly.")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ Test failed: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
if __name__ == '__main__':
|
|
success = test_client_system()
|
|
sys.exit(0 if success else 1)
|