# requirements.txt Flask==2.3.3 Flask-SQLAlchemy==3.0.5 Werkzeug==2.3.7 # models.py - CHUNK 1: Foundation Models from flask_sqlalchemy import SQLAlchemy from werkzeug.security import generate_password_hash, check_password_hash from datetime import datetime, date db = SQLAlchemy() class User(db.Model): __tablename__ = 'users' # Core Identity (5 fields) id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(255), unique=True, nullable=False) password_hash = db.Column(db.String(255), nullable=False) first_name = db.Column(db.String(100), nullable=False) last_name = db.Column(db.String(100), nullable=False) # Business Logic (6 fields) role = db.Column(db.String(20), nullable=False) # 'worker' or 'contractor' phone_number = db.Column(db.String(20), nullable=False) location = db.Column(db.String(100), nullable=False) primary_trade = db.Column(db.String(100)) is_active = db.Column(db.Boolean, default=True) business_name = db.Column(db.String(255)) # Legal Compliance - Tax (4 fields) - CRITICAL FOR AUSTRALIAN LAW abn_number = db.Column(db.String(20), nullable=False) # Required for ALL users gst_registered = db.Column(db.Boolean, default=False) annual_earnings_estimate = db.Column(db.Numeric(12,2), default=0.00) tfn_provided = db.Column(db.Boolean, default=False) # Legal Compliance - Insurance (4 fields) - MANDATORY FOR CONSTRUCTION public_liability_insurance = db.Column(db.String(100)) public_liability_amount = db.Column(db.Numeric(12,2)) workers_comp_insurance = db.Column(db.String(100)) insurance_expiry_date = db.Column(db.Date) # Independent Contractor Classification (4 fields) - FAIR WORK ACT COMPLIANCE worker_control_level = db.Column(db.String(20)) # high, medium, low delegation_rights = db.Column(db.Boolean, default=True) tools_provided_by = db.Column(db.String(20)) # worker, contractor, shared commercial_risk_borne_by = db.Column(db.String(20)) # worker, contractor, shared # Performance (4 fields) jobs_completed = db.Column(db.Integer, default=0) average_rating = db.Column(db.Numeric(3,2), default=0.00) total_reviews = db.Column(db.Integer, default=0) response_rate = db.Column(db.Numeric(5,2), default=0.00) # Gamification (3 fields) total_points = db.Column(db.Integer, default=0) current_level = db.Column(db.Integer, default=1) seasonal_league = db.Column(db.String(20), default='bronze') # Legal Compliance - Privacy (3 fields) privacy_consent = db.Column(db.Boolean, default=False) terms_accepted = db.Column(db.Boolean, default=False) terms_accepted_date = db.Column(db.DateTime) # System (4 fields) date_created = db.Column(db.DateTime, default=datetime.utcnow) last_login = db.Column(db.DateTime) email_verified = db.Column(db.Boolean, default=False) account_status = db.Column(db.String(20), default='active') def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) class Category(db.Model): __tablename__ = 'categories' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) description = db.Column(db.Text) whs_risk_level = db.Column(db.String(20), default='medium') # WHS Act compliance insurance_requirements = db.Column(db.Text) is_active = db.Column(db.Boolean, default=True) # database_setup.py - CHUNK 1: Initial Setup import os from flask import Flask from models import db def create_database(): app = Flask(__name__) # SQLite configuration (stable, no SSL issues) basedir = os.path.abspath(os.path.dirname(__file__)) app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{os.path.join(basedir, "rateright.db")}' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config['SECRET_KEY'] = 'rateright-legal-compliant-2025' # Initialize database db.init_app(app) with app.app_context(): # Create all tables db.create_all() print("โœ… CHUNK 1: Foundation tables created successfully!") # Verify table creation tables = db.engine.table_names() print(f"โœ… Created {len(tables)} tables: {', '.join(tables)}") return app if __name__ == '__main__': create_database() # test_chunk1.py - CHUNK 1: Test Foundation from database_setup import create_database from models import db, User, Category def test_chunk1(): app = create_database() with app.app_context(): print("๐Ÿงช Testing CHUNK 1: Foundation Models...") # Test User creation test_user = User( email='test@rateright.com.au', first_name='Test', last_name='User', role='worker', phone_number='0412345678', location='Sydney, NSW', abn_number='12345678901' ) test_user.set_password('password123') db.session.add(test_user) # Test Category creation test_category = Category( name='Formworker', description='Formwork construction and setup', whs_risk_level='high', insurance_requirements='$20M public liability required' ) db.session.add(test_category) db.session.commit() # Verify user_count = User.query.count() category_count = Category.query.count() print(f"โœ… Users created: {user_count}") print(f"โœ… Categories created: {category_count}") print("โœ… CHUNK 1 completed successfully!") print("๐Ÿ“ฆ Ready for CHUNK 2...") if __name__ == '__main__': test_chunk1()