# models.py - CHUNK 3: ADD these models to your existing models.py file # ADD AFTER the Application class: class Contract(db.Model): __tablename__ = 'contracts' # Core Contract (8 fields) id = db.Column(db.Integer, primary_key=True) job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'), nullable=False) application_id = db.Column(db.Integer, db.ForeignKey('applications.id'), nullable=False) contractor_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) worker_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) agreed_rate = db.Column(db.Numeric(10,2)) start_date = db.Column(db.Date) expected_completion_date = db.Column(db.Date) # Legal Compliance (6 fields) terms_and_conditions = db.Column(db.Text) # ICA template content contractor_signed = db.Column(db.Boolean, default=False) worker_signed = db.Column(db.Boolean, default=False) signature_method = db.Column(db.String(50), default='digital') superannuation_handled_by_worker = db.Column(db.Boolean, default=True) termination_notice_period = db.Column(db.Integer, default=7) # days # System (3 fields) status = db.Column(db.String(20), default='pending') created_at = db.Column(db.DateTime, default=datetime.utcnow) version_number = db.Column(db.Integer, default=1) class Payment(db.Model): __tablename__ = 'payments' id = db.Column(db.Integer, primary_key=True) job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'), nullable=False) contract_id = db.Column(db.Integer, db.ForeignKey('contracts.id'), nullable=False) contractor_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) worker_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) amount = db.Column(db.Numeric(10,2), nullable=False) platform_commission = db.Column(db.Numeric(10,2)) platform_fee_percentage = db.Column(db.Numeric(5,2), default=10.00) stripe_payment_intent_id = db.Column(db.String(255)) status = db.Column(db.String(20), default='pending') escrow_release_date = db.Column(db.DateTime) created_at = db.Column(db.DateTime, default=datetime.utcnow) released_at = db.Column(db.DateTime) class Invoice(db.Model): __tablename__ = 'invoices' id = db.Column(db.Integer, primary_key=True) job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'), nullable=False) worker_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) contractor_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) invoice_number = db.Column(db.String(50), unique=True) amount = db.Column(db.Numeric(10,2)) gst_amount = db.Column(db.Numeric(10,2)) # Auto-calculated 10% total_amount = db.Column(db.Numeric(10,2)) description = db.Column(db.Text) status = db.Column(db.String(20), default='pending') issued_date = db.Column(db.Date) due_date = db.Column(db.Date) paid_date = db.Column(db.Date) # database_setup.py - CHUNK 3: REPLACE your existing database_setup.py with this: 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 3: Legal compliance tables created successfully!") # Verify table creation tables = db.engine.table_names() print(f"โœ… Created {len(tables)} tables: {', '.join(tables)}") print("โœ… Core Tables: users, categories, jobs, applications") print("โœ… Legal Tables: contracts, payments, invoices") return app if __name__ == '__main__': create_database() # test_chunk3.py - CHUNK 3: NEW FILE - Create this new test file from database_setup import create_database from models import db, User, Category, Job, Application, Contract, Payment, Invoice from datetime import datetime, timedelta, date def test_chunk3(): app = create_database() with app.app_context(): print("๐Ÿงช Testing CHUNK 3: Legal Compliance Models...") # Clear existing data db.drop_all() db.create_all() # Create test users contractor = User( email='contractor@rateright.com.au', first_name='Sarah', last_name='Wilson', role='contractor', phone_number='0412345678', location='Melbourne, VIC', business_name='Wilson Construction', abn_number='12345678901', gst_registered=True ) contractor.set_password('password123') db.session.add(contractor) worker = User( email='worker@rateright.com.au', first_name='David', last_name='Chen', role='worker', phone_number='0423456789', location='Melbourne, VIC', primary_trade='Electrician', abn_number='98765432109', gst_registered=True, public_liability_insurance='ALLIANZ-PL-2025-001', public_liability_amount=20000000.00 ) worker.set_password('password123') db.session.add(worker) # Create category and job category = Category( name='Electrician', description='Electrical work and installations', whs_risk_level='high', insurance_requirements='$20M public liability required' ) db.session.add(category) db.session.commit() job = Job( title='Main Electrical - New Build', description='Complete electrical fit-out for 3-story residential.', contractor_id=contractor.id, category_id=category.id, location='Melbourne, VIC', budget_min=4000, budget_max=6000, whs_requirements='Lockout/tagout procedures, electrical safety testing', insurance_required=True, white_card_required=True ) db.session.add(job) db.session.commit() # Create application application = Application( job_id=job.id, worker_id=worker.id, status='accepted', proposed_rate=5500, cover_letter='Licensed electrician specializing in residential fit-outs.', abn_verified=True, insurance_verified=True ) db.session.add(application) db.session.commit() # Create contract contract = Contract( job_id=job.id, application_id=application.id, contractor_id=contractor.id, worker_id=worker.id, agreed_rate=5500, start_date=date.today() + timedelta(days=3), expected_completion_date=date.today() + timedelta(days=21), terms_and_conditions='Standard ICA template with Fair Work compliance.', contractor_signed=True, worker_signed=True, signature_method='digital', superannuation_handled_by_worker=True, termination_notice_period=7, status='signed' ) db.session.add(contract) db.session.commit() # Create payment payment = Payment( job_id=job.id, contract_id=contract.id, contractor_id=contractor.id, worker_id=worker.id, amount=5500, platform_commission=550, platform_fee_percentage=10.00, status='held', escrow_release_date=datetime.utcnow() + timedelta(days=25) ) db.session.add(payment) # Create invoice invoice = Invoice( job_id=job.id, worker_id=worker.id, contractor_id=contractor.id, invoice_number='INV-2025-001', amount=5500, gst_amount=550, # 10% GST total_amount=6050, description='Electrical fit-out - residential', status='pending', issued_date=date.today(), due_date=date.today() + timedelta(days=7) ) db.session.add(invoice) db.session.commit() # Verify counts user_count = User.query.count() job_count = Job.query.count() contract_count = Contract.query.count() payment_count = Payment.query.count() invoice_count = Invoice.query.count() print(f"โœ… Users created: {user_count}") print(f"โœ… Jobs created: {job_count}") print(f"โœ… Contracts created: {contract_count}") print(f"โœ… Payments created: {payment_count}") print(f"โœ… Invoices created: {invoice_count}") # Test legal compliance workflow test_contract = Contract.query.first() test_payment = Payment.query.first() test_invoice = Invoice.query.first() print(f"โœ… Contract status: {test_contract.status}") print(f"โœ… Contract rate: ${test_contract.agreed_rate}") print(f"โœ… Payment held in escrow: ${test_payment.amount}") print(f"โœ… Platform commission: ${test_payment.platform_commission}") print(f"โœ… Invoice total (inc GST): ${test_invoice.total_amount}") # Test ABN compliance worker_abn = User.query.filter_by(role='worker').first().abn_number contractor_abn = User.query.filter_by(role='contractor').first().abn_number print(f"โœ… Worker ABN: {worker_abn}") print(f"โœ… Contractor ABN: {contractor_abn}") print("โœ… ABN compliance: No 47% withholding tax risk!") print("โœ… CHUNK 3 completed successfully!") print("โœ… Legal workflow: Application โ†’ Contract โ†’ Payment โ†’ Invoice") print("โœ… Australian tax compliance ready!") print("๐Ÿ“ฆ Ready for CHUNK 4...") if __name__ == '__main__': test_chunk3()