﻿# SOLUTION: Fix Rating Flow and 500 Error
Date: 2025-09-17
Status: PLANNED

## Fix Summary
1. Add missing view_ratings route
2. Fix redirect flow after rating submission
3. Add auto-refresh or status check for rating button visibility

## Implementation Plan

### 1. Add Missing view_ratings Route (PRIORITY 1)
**File**: app/routes.py
**Location**: After rate_contract function (around line 1625)
**Action**: Add new route function

\\\python
@app.route('/contracts/<int:contract_id>/ratings')
@login_required
def view_ratings(contract_id):
    '''View ratings for a completed contract'''
    from app.models.contract import Contract
    from app.models.rating import Rating
    from app.models.user import User

    contract = Contract.query.get_or_404(contract_id)

    # Check if user has access to this contract
    if current_user.id not in [contract.contractor_id, contract.worker_id]:
        flash('You do not have access to view these ratings.', 'error')
        return redirect(url_for('dashboard'))

    # Get ratings for this contract
    ratings = Rating.query.filter_by(contract_id=contract_id).all()

    # Format ratings for template
    reviews = []
    for rating in ratings:
        reviewer = User.query.get(rating.rater_id)
        reviewee = User.query.get(rating.rated_id)

        reviews.append({
            'reviewer': reviewer,
            'reviewee': reviewee,
            'overall_rating': rating.overall_score,
            'quality_rating': rating.quality_score,
            'communication_rating': rating.communication_score,
            'reliability_rating': rating.reliability_score,
            'professionalism_rating': rating.professionalism_score,
            'comment': rating.review_text,
            'would_work_again': True  # Default or add to model if needed
        })

    return render_template('contracts/ratings.html',
                         contract=contract,
                         reviews=reviews)
\\\

### 2. Fix Redirect After Rating Submission
**File**: app/routes.py
**Function**: rate_contract (line ~1613)
**Action**: Change redirect destination

FROM:
\\\python
return redirect(url_for('contracts_review', contract_id=contract_id))
\\\

TO:
\\\python
# Check if both parties have rated
contract = Contract.query.get(contract_id)
if contract.contractor_rated and contract.worker_rated:
    # Both rated - go to view ratings
    flash('Contract completed! View the mutual ratings below.', 'info')
    return redirect(url_for('view_ratings', contract_id=contract_id))
else:
    # Still waiting for other party - go back to review
    return redirect(url_for('contracts_review', contract_id=contract_id))
\\\

### 3. Add Status Refresh for Rating Button
**File**: app/templates/contracts/review.html
**Location**: After contract signing section
**Action**: Add JavaScript to check for status updates

\\\javascript
<script>
// Auto-refresh contract status after signing
function checkContractStatus() {
    fetch('/api/contracts/{{ contract.id }}/status')
        .then(response => response.json())
        .then(data => {
            if (data.status === 'pending_rating' && '{{ contract.status }}' !== 'pending_rating') {
                // Status changed - reload page to show rating button
                location.reload();
            }
        })
        .catch(error => console.error('Status check failed:', error));
}

// Check every 5 seconds if contract was just signed
{% if contract.status == 'active' %}
    setInterval(checkContractStatus, 5000);
{% endif %}
</script>
\\\

### 4. Add Status Check API Endpoint
**File**: app/blueprints/contracts/rating_routes.py
**Action**: Add status check endpoint

\\\python
@rating_bp.route('/<int:contract_id>/status', methods=['GET'])
@login_required
def get_contract_status(contract_id):
    '''Quick status check for contract'''
    contract = Contract.query.get_or_404(contract_id)

    if current_user.id not in [contract.contractor_id, contract.worker_id]:
        return {'error': 'Unauthorized'}, 403

    return {
        'status': contract.status,
        'contractor_rated': contract.contractor_rated,
        'worker_rated': contract.worker_rated
    }, 200
\\\

## Testing Steps
1. Sign a contract as worker
2. Verify rating button appears without manual refresh
3. Submit rating
4. Verify redirect to ratings view (not My Contracts)
5. Click "View Details" on completed contract
6. Verify ratings display without 500 error

## Rollback Plan
1. Remove view_ratings route from app/routes.py
2. Revert redirect changes in rate_contract
3. Remove JavaScript status checking
4. Remove status API endpoint
