|
|
<!DOCTYPE html> |
|
|
<html> |
|
|
<head> |
|
|
<title>Subcontractor Performance Score App</title> |
|
|
<style> |
|
|
body { font-family: Arial, sans-serif; margin: 20px; background-color: #f5f7fa; } |
|
|
h1, h2 { color: #333; } |
|
|
.container { max-width: 1200px; margin: 0 auto; } |
|
|
.summary-cards { display: flex; gap: 20px; margin-bottom: 20px; } |
|
|
.card { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); flex: 1; text-align: center; } |
|
|
.card h3 { margin: 0 0 10px; color: #555; } |
|
|
.card p { margin: 0; font-size: 24px; color: #333; } |
|
|
.leaderboard, .alerts, .top-performers, .reports { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); margin-bottom: 20px; } |
|
|
table { width: 100%; border-collapse: collapse; } |
|
|
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #ddd; } |
|
|
th { background-color: #f2f2f2; } |
|
|
.status-good { background: #e6f4ea; color: #2e7d32; padding: 5px 10px; border-radius: 12px; display: inline-block; } |
|
|
.status-alert { background: #fff3e0; color: #ef6c00; padding: 5px 10px; border-radius: 12px; display: inline-block; } |
|
|
.trend-up { color: green; } |
|
|
.trend-down { color: red; } |
|
|
.trend-flat { color: gray; } |
|
|
.score-circle { display: inline-block; width: 40px; height: 40px; line-height: 40px; text-align: center; border-radius: 50%; background: #e0e0e0; margin-right: 5px; } |
|
|
.reports-section { display: flex; gap: 20px; } |
|
|
.reports-section > div { flex: 1; } |
|
|
.checkbox-label { margin-right: 20px; } |
|
|
.btn { background: #1976d2; color: white; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; } |
|
|
.btn:hover { background: #1565c0; } |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
<div class="container"> |
|
|
<h1>Vendor Performance Dashboard</h1> |
|
|
<p>Monitor and manage subcontractor performance across projects</p> |
|
|
|
|
|
|
|
|
<div class="summary-cards"> |
|
|
<div class="card"> |
|
|
<h3>Total Vendors</h3> |
|
|
<p>{{ total_vendors }}</p> |
|
|
<small>+2 in last month</small> |
|
|
</div> |
|
|
<div class="card"> |
|
|
<h3>Performance Alerts</h3> |
|
|
<p>{{ performance_alerts }}</p> |
|
|
<small>{{ percent_alerts }}% of vendors</small> |
|
|
</div> |
|
|
<div class="card"> |
|
|
<h3>Top Performers</h3> |
|
|
<p>{{ top_performers }}</p> |
|
|
<small>{{ percent_top }}% of vendors</small> |
|
|
</div> |
|
|
<div class="card"> |
|
|
<h3>Improving Vendors</h3> |
|
|
<p>{{ improving_vendors }}</p> |
|
|
<small>{{ percent_improving }}% of vendors</small> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="leaderboard"> |
|
|
<h2>Vendor Leaderboard</h2> |
|
|
<p>Top performing subcontractors this month</p> |
|
|
{% if top_logs %} |
|
|
<table> |
|
|
<tr> |
|
|
<th>Rank</th> |
|
|
<th>Vendor</th> |
|
|
<th>Score</th> |
|
|
<th>Trend</th> |
|
|
<th>Status</th> |
|
|
</tr> |
|
|
{% for log in top_logs %} |
|
|
<tr> |
|
|
<td>#{{ log.idx }}</td> |
|
|
<td>{{ log.vendorLogName }}</td> |
|
|
<td>{{ log.scores.finalScore }}</td> |
|
|
<td class="{{ log.trend }}">{{ log.trend_symbol }}</td> |
|
|
<td><span class="{{ log.status_class }}">{{ log.status_text }}</span></td> |
|
|
</tr> |
|
|
{% endfor %} |
|
|
</table> |
|
|
{% else %} |
|
|
<p>No leaderboard data available.</p> |
|
|
{% endif %} |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="alerts"> |
|
|
<h2>Performance Alerts</h2> |
|
|
<p>Vendors requiring attention</p> |
|
|
{% if alert_logs %} |
|
|
{% for log in alert_logs %} |
|
|
<div style="margin-bottom: 10px;"> |
|
|
<span style="color: #ef6c00;">⚠️ {{ log.vendorLogName }}</span> - Overall: {{ log.scores.finalScore }} |
|
|
<br>Quality: {{ log.scores.qualityScore }} | Timeliness: {{ log.scores.timelinessScore }} |
|
|
<a href="#" style="margin-left: 10px; color: #1976d2;">Review</a> |
|
|
</div> |
|
|
{% endfor %} |
|
|
{% else %} |
|
|
<p>No vendors require attention at this time.</p> |
|
|
{% endif %} |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="top-performers"> |
|
|
<h2>Top Performing Vendors</h2> |
|
|
<p>Vendors with the highest performance scores this month</p> |
|
|
{% if top_performing_logs %} |
|
|
<div style="display: flex; gap: 20px; flex-wrap: wrap;"> |
|
|
{% for log in top_performing_logs %} |
|
|
<div style="flex: 1; min-width: 200px;"> |
|
|
<p>{{ log.vendorLogName }}<br><small>Last updated: 5/15/2025</small></p> |
|
|
<span class="score-circle">{{ log.scores.finalScore }}</span> Overall |
|
|
<span class="score-circle">{{ log.scores.qualityScore }}</span> Quality |
|
|
<span class="score-circle">{{ log.scores.timelinessScore }}</span> Time |
|
|
<span class="score-circle">{{ log.scores.safetyScore }}</span> Safety |
|
|
<span class="score-circle">{{ log.scores.communicationScore }}</span> Comm |
|
|
</div> |
|
|
{% endfor %} |
|
|
</div> |
|
|
{% else %} |
|
|
<p>No top performing vendors available.</p> |
|
|
{% endif %} |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="reports"> |
|
|
<h2>Reports & Certifications</h2> |
|
|
<p>Generate and manage vendor performance reports</p> |
|
|
<div class="reports-section"> |
|
|
<div> |
|
|
<h3>Generate Vendor Report</h3> |
|
|
<form action="/generate_report" method="POST"> |
|
|
<div style="margin-bottom: 10px;"> |
|
|
<label>Select Vendor</label><br> |
|
|
<select name="vendor_name" style="width: 100%; padding: 8px; margin-top: 5px;" required> |
|
|
<option value="">Choose a vendor</option> |
|
|
{% for vendor in vendor_names %} |
|
|
<option value="{{ vendor }}">{{ vendor }}</option> |
|
|
{% endfor %} |
|
|
</select> |
|
|
</div> |
|
|
<div style="margin-bottom: 10px;"> |
|
|
<label>Report Month</label><br> |
|
|
<input type="text" name="report_month" value="{{ report_month }}" readonly style="width: 100%; padding: 8px; margin-top: 5px;"> |
|
|
</div> |
|
|
<div style="margin-bottom: 10px;"> |
|
|
<label>Include in Report</label><br> |
|
|
<label class="checkbox-label"><input type="checkbox" checked> Quality Metrics</label> |
|
|
<label class="checkbox-label"><input type="checkbox" checked> Timeliness</label> |
|
|
<label class="checkbox-label"><input type="checkbox" checked> Safety Record</label> |
|
|
<label class="checkbox-label"><input type="checkbox" checked> Communication</label> |
|
|
<label class="checkbox-label"><input type="checkbox" checked> Incidents</label> |
|
|
<label class="checkbox-label"><input type="checkbox" checked> Recommendations</label> |
|
|
</div> |
|
|
<button type="submit" class="btn">Generate Report</button> |
|
|
</form> |
|
|
</div> |
|
|
<div> |
|
|
<h3>Recent Reports</h3> |
|
|
{% if sorted_logs %} |
|
|
{% for log in sorted_logs[:5] %} |
|
|
<div style="margin-bottom: 10px;"> |
|
|
📄 {{ log.vendorLogName }} - Monthly Performance |
|
|
<span style="float: right;"> |
|
|
<small>5/15/2025</small> |
|
|
<a href="#" style="margin-left: 10px;">⬇</a> |
|
|
</span> |
|
|
</div> |
|
|
{% endfor %} |
|
|
{% else %} |
|
|
<p>No recent reports available.</p> |
|
|
{% endif %} |
|
|
<small>Last report generated: 3 hours ago</small> |
|
|
<br> |
|
|
<a href="/reports" style="color: #1976d2;">View All Reports</a> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</body> |
|
|
</html> |