Database changes (run sql/migration_drop_pc_tables.sql on prod): - Drop pc, pc_backup_phase2, pc_to_machine_id_mapping tables - Rename pcid columns to machineid in machineoverrides, dualpathassignments, networkinterfaces - Recreate 9 views to use machines.machineid instead of pcid - Clean orphaned records and add FK constraints to machines table ASP fixes: - editprinter.asp: Fix CLng type mismatch when no printerid provided - includes/sql.asp: Remove AutoDeactivateExpiredNotifications (endtime handles expiry) - includes/leftsidebar.asp: Update fiscal week banner styling, remove dead Information link - charts/warrantychart.asp: Use vw_warranty_status instead of pc table Dashboard API renames (naming convention): - shopfloor-dashboard: Update to use apishopfloor.asp, apibusinessunits.asp - tv-dashboard: Rename api_slides.asp to apislides.asp 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
108 lines
4.4 KiB
Plaintext
108 lines
4.4 KiB
Plaintext
<%
|
|
' Use vw_warranty_status view which joins machines with warranties table
|
|
strSQL2 = "SELECT " & _
|
|
"COALESCE(SUM(CASE WHEN warrantystatus = 'Active' AND warrantydaysremaining > 90 THEN 1 ELSE 0 END), 0) as active_good, " & _
|
|
"COALESCE(SUM(CASE WHEN warrantystatus = 'Active' AND warrantydaysremaining BETWEEN 31 AND 90 THEN 1 ELSE 0 END), 0) as active_warning, " & _
|
|
"COALESCE(SUM(CASE WHEN warrantystatus = 'Active' AND warrantydaysremaining <= 30 AND warrantydaysremaining >= 0 THEN 1 ELSE 0 END), 0) as expiring_soon, " & _
|
|
"COALESCE(SUM(CASE WHEN warrantystatus = 'Expired' OR warrantydaysremaining < 0 THEN 1 ELSE 0 END), 0) as expired, " & _
|
|
"COALESCE(SUM(CASE WHEN warrantystatus IS NULL OR warrantystatus = '' OR warrantystatus = 'Unknown' THEN 1 ELSE 0 END), 0) as unknown, " & _
|
|
"COUNT(*) as total " & _
|
|
"FROM vw_warranty_status"
|
|
set rswarranty = objconn.Execute(strSQL2)
|
|
activeGood = CLng(rswarranty("active_good"))
|
|
activeWarning = CLng(rswarranty("active_warning"))
|
|
expiringSoon = CLng(rswarranty("expiring_soon"))
|
|
expired = CLng(rswarranty("expired"))
|
|
unknown = CLng(rswarranty("unknown"))
|
|
total = CLng(rswarranty("total"))
|
|
If total = 0 Then total = 1
|
|
activeGoodPct = FormatNumber(CDbl(activeGood)/CDbl(total)*100,1)
|
|
activeWarningPct = FormatNumber(CDbl(activeWarning)/CDbl(total)*100,1)
|
|
expiringSoonPct = FormatNumber(CDbl(expiringSoon)/CDbl(total)*100,1)
|
|
expiredPct = FormatNumber(CDbl(expired)/CDbl(total)*100,1)
|
|
unknownPct = FormatNumber(CDbl(unknown)/CDbl(total)*100,1)
|
|
%>
|
|
<script>
|
|
$(function() {
|
|
var ctx = document.getElementById("warrantyChart").getContext('2d');
|
|
var myChart = new Chart(ctx, {
|
|
type: 'doughnut',
|
|
data: {
|
|
labels: ["Active (>90 days)", "Active (31-90 days)", "Expiring Soon (<=30 days)", "Expired", "Unknown"],
|
|
datasets: [{
|
|
backgroundColor: [
|
|
"#ffffff",
|
|
"rgba(255, 255, 255, 0.80)",
|
|
"rgba(255, 255, 255, 0.60)",
|
|
"rgba(255, 255, 255, 0.40)",
|
|
"rgba(255, 255, 255, 0.20)"
|
|
],
|
|
data: [<%=activeGood%>, <%=activeWarning%>, <%=expiringSoon%>, <%=expired%>, <%=unknown%>],
|
|
borderWidth: [1, 1, 1, 1, 1]
|
|
}]
|
|
},
|
|
options: {
|
|
maintainAspectRatio: false,
|
|
legend: {
|
|
position: "bottom",
|
|
display: false,
|
|
labels: {
|
|
fontColor: '#ddd',
|
|
boxWidth: 15
|
|
}
|
|
},
|
|
tooltips: {
|
|
displayColors: false
|
|
}
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<div class="col-lg-4">
|
|
<div class="card">
|
|
<div class="card-header">Warranty Status
|
|
<div class="card-action">
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="chart-container-1">
|
|
<canvas id="warrantyChart"></canvas>
|
|
</div>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table align-items-center">
|
|
<tbody>
|
|
<tr>
|
|
<td><i class="fa fa-circle text-white mr-2"></i>Active (>90 days)</td>
|
|
<td><%=activeGood%></td>
|
|
<td><%=activeGoodPct%>%</td>
|
|
</tr>
|
|
<tr>
|
|
<td><i class="fa fa-circle text-light-1 mr-2"></i>Active (31-90 days)</td>
|
|
<td><%=activeWarning%></td>
|
|
<td><%=activeWarningPct%>%</td>
|
|
</tr>
|
|
<tr>
|
|
<td><i class="fa fa-circle text-light-2 mr-2"></i>Expiring Soon (<=30 days)</td>
|
|
<td><%=expiringSoon%></td>
|
|
<td><%=expiringSoonPct%>%</td>
|
|
</tr>
|
|
<tr>
|
|
<td><i class="fa fa-circle text-light-3 mr-2"></i>Expired</td>
|
|
<td><%=expired%></td>
|
|
<td><%=expiredPct%>%</td>
|
|
</tr>
|
|
<% If unknown > 0 Then %>
|
|
<tr>
|
|
<td><i class="fa fa-circle text-light-4 mr-2"></i>Unknown</td>
|
|
<td><%=unknown%></td>
|
|
<td><%=unknownPct%>%</td>
|
|
</tr>
|
|
<% End If %>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|