Fix — HTML entity rendering across 60 views

Razor's @() expression auto-encodes &, turning — into — which
rendered as literal text in the browser. Wrapped all such expressions in
@Html.Raw() so the em-dash entity is passed through unescaped.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 09:27:45 -04:00
parent f018653c18
commit 64a9c1531b
60 changed files with 155 additions and 155 deletions
@@ -99,7 +99,7 @@
<tr> <tr>
<td class="fw-bold">@c.ClosedYear</td> <td class="fw-bold">@c.ClosedYear</td>
<td>@c.ClosedAt.ToLocalTime().ToString("MM/dd/yyyy h:mm tt")</td> <td>@c.ClosedAt.ToLocalTime().ToString("MM/dd/yyyy h:mm tt")</td>
<td>@(c.ClosedBy ?? "&mdash;")</td> <td>@Html.Raw(c.ClosedBy ?? "&mdash;")</td>
<td> <td>
@if (c.JournalEntry != null) @if (c.JournalEntry != null)
{ {
@@ -207,16 +207,16 @@
</span> </span>
</td> </td>
<td class="text-center @(row.Today > 0 ? "fw-semibold" : "text-muted")"> <td class="text-center @(row.Today > 0 ? "fw-semibold" : "text-muted")">
@(row.Today > 0 ? row.Today.ToString("N0") : "&mdash;") @Html.Raw(row.Today > 0 ? row.Today.ToString("N0") : "&mdash;")
</td> </td>
<td class="text-center @(row.Last7Days > 0 ? "fw-semibold" : "text-muted")"> <td class="text-center @(row.Last7Days > 0 ? "fw-semibold" : "text-muted")">
@(row.Last7Days > 0 ? row.Last7Days.ToString("N0") : "&mdash;") @Html.Raw(row.Last7Days > 0 ? row.Last7Days.ToString("N0") : "&mdash;")
</td> </td>
<td class="text-center @(row.Last30Days > 0 ? "fw-semibold" : "text-muted")"> <td class="text-center @(row.Last30Days > 0 ? "fw-semibold" : "text-muted")">
@(row.Last30Days > 0 ? row.Last30Days.ToString("N0") : "&mdash;") @Html.Raw(row.Last30Days > 0 ? row.Last30Days.ToString("N0") : "&mdash;")
</td> </td>
<td class="text-center @(row.AllTime > 0 ? "" : "text-muted")"> <td class="text-center @(row.AllTime > 0 ? "" : "text-muted")">
@(row.AllTime > 0 ? row.AllTime.ToString("N0") : "&mdash;") @Html.Raw(row.AllTime > 0 ? row.AllTime.ToString("N0") : "&mdash;")
</td> </td>
<td class="text-center @(row.PhotoCount > 0 ? "" : "text-muted")"> <td class="text-center @(row.PhotoCount > 0 ? "" : "text-muted")">
@if (row.PhotoCount > 0) @if (row.PhotoCount > 0)
@@ -46,19 +46,19 @@
<dd class="col-7">@Model.EntityType</dd> <dd class="col-7">@Model.EntityType</dd>
<dt class="col-5 text-muted">Entity ID</dt> <dt class="col-5 text-muted">Entity ID</dt>
<dd class="col-7">@(Model.EntityId ?? "&mdash;")</dd> <dd class="col-7">@Html.Raw(Model.EntityId ?? "&mdash;")</dd>
<dt class="col-5 text-muted">Description</dt> <dt class="col-5 text-muted">Description</dt>
<dd class="col-7">@(Model.EntityDescription ?? "&mdash;")</dd> <dd class="col-7">@Html.Raw(Model.EntityDescription ?? "&mdash;")</dd>
<dt class="col-5 text-muted">User</dt> <dt class="col-5 text-muted">User</dt>
<dd class="col-7">@Model.UserName</dd> <dd class="col-7">@Model.UserName</dd>
<dt class="col-5 text-muted">Company</dt> <dt class="col-5 text-muted">Company</dt>
<dd class="col-7">@(Model.CompanyName ?? (Model.CompanyId?.ToString() ?? "&mdash;"))</dd> <dd class="col-7">@Html.Raw(Model.CompanyName ?? (Model.CompanyId?.ToString() ?? "&mdash;"))</dd>
<dt class="col-5 text-muted">IP Address</dt> <dt class="col-5 text-muted">IP Address</dt>
<dd class="col-7">@(Model.IpAddress ?? "&mdash;")</dd> <dd class="col-7">@Html.Raw(Model.IpAddress ?? "&mdash;")</dd>
</dl> </dl>
</div> </div>
</div> </div>
@@ -95,8 +95,8 @@
var newVal = newData.ValueKind == JsonValueKind.Object && newData.TryGetProperty(key, out var nv) ? nv.ToString() : null; var newVal = newData.ValueKind == JsonValueKind.Object && newData.TryGetProperty(key, out var nv) ? nv.ToString() : null;
<tr> <tr>
<td class="fw-medium">@key</td> <td class="fw-medium">@key</td>
<td class="text-danger font-monospace">@(oldVal ?? "&mdash;")</td> <td class="text-danger font-monospace">@Html.Raw(oldVal ?? "&mdash;")</td>
<td class="text-success font-monospace">@(newVal ?? "&mdash;")</td> <td class="text-success font-monospace">@Html.Raw(newVal ?? "&mdash;")</td>
</tr> </tr>
} }
} }
@@ -248,7 +248,7 @@
{ {
<tr class="text-muted"> <tr class="text-muted">
<td><code>@ban.IpAddress</code></td> <td><code>@ban.IpAddress</code></td>
<td><small>@(ban.Reason ?? "&mdash;")</small></td> <td><small>@Html.Raw(ban.Reason ?? "&mdash;")</small></td>
<td><small>@ban.BannedAt.ToString("MMM dd, yyyy")</small></td> <td><small>@ban.BannedAt.ToString("MMM dd, yyyy")</small></td>
<td> <td>
@if (!ban.IsActive) @if (!ban.IsActive)
@@ -162,7 +162,7 @@
<td><span class="badge bg-@entry.StatusColor">@entry.StatusLabel</span></td> <td><span class="badge bg-@entry.StatusColor">@entry.StatusLabel</span></td>
<td class="text-end">@entry.Total.ToString("C")</td> <td class="text-end">@entry.Total.ToString("C")</td>
<td class="text-end fw-medium @(entry.BalanceDue > 0 ? "text-danger" : "text-muted")"> <td class="text-end fw-medium @(entry.BalanceDue > 0 ? "text-danger" : "text-muted")">
@(entry.EntryType == "Bill" ? entry.BalanceDue.ToString("C") : "&mdash;") @Html.Raw(entry.EntryType == "Bill" ? entry.BalanceDue.ToString("C") : "&mdash;")
</td> </td>
<td> <td>
@if (entry.EntryType == "Bill") @if (entry.EntryType == "Bill")
@@ -148,7 +148,7 @@
<div class="card-body"> <div class="card-body">
<table class="table table-sm table-borderless mb-0"> <table class="table table-sm table-borderless mb-0">
<tr><th style="width:40%">Company Name</th><td>@Model.CompanyName</td></tr> <tr><th style="width:40%">Company Name</th><td>@Model.CompanyName</td></tr>
<tr><th>Code</th><td>@(Model.CompanyCode ?? "&mdash;")</td></tr> <tr><th>Code</th><td>@Html.Raw(Model.CompanyCode ?? "&mdash;")</td></tr>
<tr><th>Status</th><td><span class="badge @(Model.IsActive ? "bg-success" : "bg-danger")">@(Model.IsActive ? "Active" : "Inactive")</span></td></tr> <tr><th>Status</th><td><span class="badge @(Model.IsActive ? "bg-success" : "bg-danger")">@(Model.IsActive ? "Active" : "Inactive")</span></td></tr>
<tr><th>Time Zone</th><td>@(Model.TimeZone ?? "America/New_York")</td></tr> <tr><th>Time Zone</th><td>@(Model.TimeZone ?? "America/New_York")</td></tr>
<tr><th>Created</th><td>@Model.CreatedAt.ToString("MMM d, yyyy h:mm tt")</td></tr> <tr><th>Created</th><td>@Model.CreatedAt.ToString("MMM d, yyyy h:mm tt")</td></tr>
@@ -174,7 +174,7 @@
<table class="table table-sm table-borderless mb-0"> <table class="table table-sm table-borderless mb-0">
<tr><th style="width:40%">Contact Name</th><td>@Model.PrimaryContactName</td></tr> <tr><th style="width:40%">Contact Name</th><td>@Model.PrimaryContactName</td></tr>
<tr><th>Email</th><td><a href="mailto:@Model.PrimaryContactEmail">@Model.PrimaryContactEmail</a></td></tr> <tr><th>Email</th><td><a href="mailto:@Model.PrimaryContactEmail">@Model.PrimaryContactEmail</a></td></tr>
<tr><th>Phone</th><td>@(Model.Phone ?? "&mdash;")</td></tr> <tr><th>Phone</th><td>@Html.Raw(Model.Phone ?? "&mdash;")</td></tr>
</table> </table>
</div> </div>
</div> </div>
@@ -283,7 +283,7 @@
} }
else { <span class="text-muted">N/A</span> } else { <span class="text-muted">N/A</span> }
</td> </td>
<td>@(user.Department ?? "&mdash;")</td> <td>@Html.Raw(user.Department ?? "&mdash;")</td>
<td> <td>
<span class="badge @(user.IsActive ? "bg-success" : "bg-danger")"> <span class="badge @(user.IsActive ? "bg-success" : "bg-danger")">
@(user.IsActive ? "Active" : "Inactive") @(user.IsActive ? "Active" : "Inactive")
@@ -527,20 +527,20 @@
@{ @{
var firstActivity = onboarding.FirstJobCreatedAt ?? onboarding.FirstQuoteCreatedAt; var firstActivity = onboarding.FirstJobCreatedAt ?? onboarding.FirstQuoteCreatedAt;
} }
@(firstActivity.HasValue ? firstActivity.Value.ToString("MMM d, yyyy") : "&mdash;") @Html.Raw(firstActivity.HasValue ? firstActivity.Value.ToString("MMM d, yyyy") : "&mdash;")
</td> </td>
</tr> </tr>
<tr> <tr>
<th>First Invoice</th> <th>First Invoice</th>
<td>@(onboarding.FirstInvoiceCreatedAt.HasValue ? onboarding.FirstInvoiceCreatedAt.Value.ToString("MMM d, yyyy") : "&mdash;")</td> <td>@Html.Raw(onboarding.FirstInvoiceCreatedAt.HasValue ? onboarding.FirstInvoiceCreatedAt.Value.ToString("MMM d, yyyy") : "&mdash;")</td>
</tr> </tr>
<tr> <tr>
<th>Workflow Completed</th> <th>Workflow Completed</th>
<td>@(onboarding.FirstWorkflowCompletedAt.HasValue ? onboarding.FirstWorkflowCompletedAt.Value.ToString("MMM d, yyyy") : "&mdash;")</td> <td>@Html.Raw(onboarding.FirstWorkflowCompletedAt.HasValue ? onboarding.FirstWorkflowCompletedAt.Value.ToString("MMM d, yyyy") : "&mdash;")</td>
</tr> </tr>
<tr> <tr>
<th>Widget Dismissed</th> <th>Widget Dismissed</th>
<td>@(onboarding.GuidedActivationDismissedAt.HasValue ? onboarding.GuidedActivationDismissedAt.Value.ToString("MMM d, yyyy") : "&mdash;")</td> <td>@Html.Raw(onboarding.GuidedActivationDismissedAt.HasValue ? onboarding.GuidedActivationDismissedAt.Value.ToString("MMM d, yyyy") : "&mdash;")</td>
</tr> </tr>
</table> </table>
</div> </div>
@@ -181,7 +181,7 @@
</td> </td>
<td>@a.AppliedDate.ToLocalTime().ToString("MM/dd/yyyy")</td> <td>@a.AppliedDate.ToLocalTime().ToString("MM/dd/yyyy")</td>
<td class="text-end fw-semibold text-success">@a.AmountApplied.ToString("C")</td> <td class="text-end fw-semibold text-success">@a.AmountApplied.ToString("C")</td>
<td class="small text-muted">@(a.AppliedBy?.FullName ?? "&mdash;")</td> <td class="small text-muted">@Html.Raw(a.AppliedBy?.FullName ?? "&mdash;")</td>
</tr> </tr>
} }
</tbody> </tbody>
@@ -204,7 +204,7 @@ else
</td> </td>
<td>@m.IssueDate.ToLocalTime().ToString("MM/dd/yyyy")</td> <td>@m.IssueDate.ToLocalTime().ToString("MM/dd/yyyy")</td>
<td class="@(expired ? "text-danger fw-semibold" : "")"> <td class="@(expired ? "text-danger fw-semibold" : "")">
@(m.ExpiryDate.HasValue ? m.ExpiryDate.Value.ToLocalTime().ToString("MM/dd/yyyy") : "&mdash;") @Html.Raw(m.ExpiryDate.HasValue ? m.ExpiryDate.Value.ToLocalTime().ToString("MM/dd/yyyy") : "&mdash;")
@if (expired) { <small>(Expired)</small> } @if (expired) { <small>(Expired)</small> }
</td> </td>
<td> <td>
@@ -224,7 +224,7 @@
} }
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Phone</span> <span class="mobile-card-label">Phone</span>
<span class="mobile-card-value">@(customer.Phone ?? "&mdash;")</span> <span class="mobile-card-value">@Html.Raw(customer.Phone ?? "&mdash;")</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Type</span> <span class="mobile-card-label">Type</span>
@@ -563,7 +563,7 @@
<tr> <tr>
<td colspan="2">Vendor Total</td> <td colspan="2">Vendor Total</td>
<td class="text-end">@vendorGroup.TotalLbsNeeded.ToString("N2") lbs</td> <td class="text-end">@vendorGroup.TotalLbsNeeded.ToString("N2") lbs</td>
<td class="text-end">@(vendorGroup.TotalEstCost > 0 ? vendorGroup.TotalEstCost.ToString("C") : "&mdash;")</td> <td class="text-end">@Html.Raw(vendorGroup.TotalEstCost > 0 ? vendorGroup.TotalEstCost.ToString("C") : "&mdash;")</td>
<td></td> <td></td>
</tr> </tr>
</tfoot> </tfoot>
@@ -680,7 +680,7 @@
<tr> <tr>
<td colspan="2">Vendor Total</td> <td colspan="2">Vendor Total</td>
<td class="text-end">@vendorGroup.TotalLbsNeeded.ToString("N2") lbs</td> <td class="text-end">@vendorGroup.TotalLbsNeeded.ToString("N2") lbs</td>
<td class="text-end">@(vendorGroup.TotalEstCost > 0 ? vendorGroup.TotalEstCost.ToString("C") : "&mdash;")</td> <td class="text-end">@Html.Raw(vendorGroup.TotalEstCost > 0 ? vendorGroup.TotalEstCost.ToString("C") : "&mdash;")</td>
<td colspan="2"></td> <td colspan="2"></td>
</tr> </tr>
</tfoot> </tfoot>
@@ -139,7 +139,7 @@
else { <span class="text-muted">&mdash;</span> } else { <span class="text-muted">&mdash;</span> }
</td> </td>
<td class="text-muted"> <td class="text-muted">
@(s.OldestDeletion.HasValue ? s.OldestDeletion.Value.ToString("MM/dd/yyyy") : "&mdash;") @Html.Raw(s.OldestDeletion.HasValue ? s.OldestDeletion.Value.ToString("MM/dd/yyyy") : "&mdash;")
</td> </td>
<td class="text-center"> <td class="text-center">
<input type="checkbox" class="form-check-input entity-select" <input type="checkbox" class="form-check-input entity-select"
@@ -169,7 +169,7 @@
</div> </div>
<div class="mobile-card-title"> <div class="mobile-card-title">
<h6>@s.Label</h6> <h6>@s.Label</h6>
<small>Oldest: @(s.OldestDeletion.HasValue ? s.OldestDeletion.Value.ToString("MM/dd/yyyy") : "&mdash;")</small> <small>Oldest: @Html.Raw(s.OldestDeletion.HasValue ? s.OldestDeletion.Value.ToString("MM/dd/yyyy") : "&mdash;")</small>
</div> </div>
</div> </div>
<div class="mobile-card-body"> <div class="mobile-card-body">
@@ -78,7 +78,7 @@
<div class="small text-muted">@(string.IsNullOrWhiteSpace(row.RecipientEmail) ? "No primary contact email configured" : row.RecipientEmail)</div> <div class="small text-muted">@(string.IsNullOrWhiteSpace(row.RecipientEmail) ? "No primary contact email configured" : row.RecipientEmail)</div>
</td> </td>
<td> <td>
<div>@(string.IsNullOrWhiteSpace(row.CompanyAdminName) ? "&mdash;" : row.CompanyAdminName)</div> <div>@Html.Raw(string.IsNullOrWhiteSpace(row.CompanyAdminName) ? "&mdash;" : row.CompanyAdminName)</div>
@if (!string.IsNullOrWhiteSpace(row.CompanyAdminEmail)) @if (!string.IsNullOrWhiteSpace(row.CompanyAdminEmail))
{ {
<div class="small text-muted">@row.CompanyAdminEmail</div> <div class="small text-muted">@row.CompanyAdminEmail</div>
@@ -75,7 +75,7 @@
<div class="fw-semibold">@company.CompanyName</div> <div class="fw-semibold">@company.CompanyName</div>
<div class="small text-muted">#@company.CompanyId</div> <div class="small text-muted">#@company.CompanyId</div>
</td> </td>
<td>@(string.IsNullOrWhiteSpace(company.PrimaryContactName) ? "&mdash;" : company.PrimaryContactName)</td> <td>@Html.Raw(string.IsNullOrWhiteSpace(company.PrimaryContactName) ? "&mdash;" : company.PrimaryContactName)</td>
<td> <td>
@if (string.IsNullOrWhiteSpace(company.PrimaryContactEmail)) @if (string.IsNullOrWhiteSpace(company.PrimaryContactEmail))
{ {
@@ -87,7 +87,7 @@
} }
</td> </td>
<td> <td>
<div>@(string.IsNullOrWhiteSpace(company.CompanyAdminName) ? "&mdash;" : company.CompanyAdminName)</div> <div>@Html.Raw(string.IsNullOrWhiteSpace(company.CompanyAdminName) ? "&mdash;" : company.CompanyAdminName)</div>
@if (!string.IsNullOrWhiteSpace(company.CompanyAdminEmail)) @if (!string.IsNullOrWhiteSpace(company.CompanyAdminEmail))
{ {
<div class="small text-muted">@company.CompanyAdminEmail</div> <div class="small text-muted">@company.CompanyAdminEmail</div>
@@ -42,7 +42,7 @@
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="text-muted small mb-1">Location</label> <label class="text-muted small mb-1">Location</label>
<p class="mb-0">@(Model.Location ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.Location ?? "&mdash;")</p>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<label class="text-muted small mb-1">Status</label> <label class="text-muted small mb-1">Status</label>
@@ -76,15 +76,15 @@
<div class="row g-3"> <div class="row g-3">
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Manufacturer</label> <label class="text-muted small mb-1">Manufacturer</label>
<p class="mb-0">@(Model.Manufacturer ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.Manufacturer ?? "&mdash;")</p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Model</label> <label class="text-muted small mb-1">Model</label>
<p class="mb-0">@(Model.Model ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.Model ?? "&mdash;")</p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Serial Number</label> <label class="text-muted small mb-1">Serial Number</label>
<p class="mb-0">@(Model.SerialNumber ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.SerialNumber ?? "&mdash;")</p>
</div> </div>
</div> </div>
</div> </div>
@@ -94,15 +94,15 @@
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Manufacturer</label> <label class="text-muted small mb-1">Manufacturer</label>
<p class="mb-0">@(Model.Manufacturer ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.Manufacturer ?? "&mdash;")</p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Model</label> <label class="text-muted small mb-1">Model</label>
<p class="mb-0">@(Model.Model ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.Model ?? "&mdash;")</p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Serial Number</label> <label class="text-muted small mb-1">Serial Number</label>
<p class="mb-0">@(Model.SerialNumber ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.SerialNumber ?? "&mdash;")</p>
</div> </div>
</div> </div>
</div> </div>
@@ -88,7 +88,7 @@
<td>@cert.OriginalAmount.ToString("C")</td> <td>@cert.OriginalAmount.ToString("C")</td>
<td>@cert.IssueDate.ToLocalTime().ToString("MMM d, yyyy")</td> <td>@cert.IssueDate.ToLocalTime().ToString("MMM d, yyyy")</td>
<td> <td>
@(cert.ExpiryDate.HasValue @Html.Raw(cert.ExpiryDate.HasValue
? cert.ExpiryDate.Value.ToLocalTime().ToString("MMM d, yyyy") ? cert.ExpiryDate.Value.ToLocalTime().ToString("MMM d, yyyy")
: "&mdash;") : "&mdash;")
</td> </td>
@@ -298,14 +298,14 @@
{ {
<div class="col-md-6"> <div class="col-md-6">
<label class="text-muted small mb-1">Inventory Account</label> <label class="text-muted small mb-1">Inventory Account</label>
<p class="mb-0">@(Model.InventoryAccountName ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.InventoryAccountName ?? "&mdash;")</p>
</div> </div>
} }
@if (Model.CogsAccountId.HasValue) @if (Model.CogsAccountId.HasValue)
{ {
<div class="col-md-6"> <div class="col-md-6">
<label class="text-muted small mb-1">COGS Account</label> <label class="text-muted small mb-1">COGS Account</label>
<p class="mb-0">@(Model.CogsAccountName ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.CogsAccountName ?? "&mdash;")</p>
</div> </div>
} }
</div> </div>
@@ -380,7 +380,7 @@
</div> </div>
<div class="col-6"> <div class="col-6">
<label class="text-muted small mb-1">Location</label> <label class="text-muted small mb-1">Location</label>
<p class="mb-0">@(Model.Location ?? "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.Location ?? "&mdash;")</p>
</div> </div>
<div class="col-6"> <div class="col-6">
<label class="text-muted small mb-1">Reorder Point</label> <label class="text-muted small mb-1">Reorder Point</label>
@@ -291,7 +291,7 @@
} }
</td> </td>
} }
<td>@(u.CoatColor ?? "&mdash;")</td> <td>@Html.Raw(u.CoatColor ?? "&mdash;")</td>
<td class="text-end">@u.EstimatedLbs.ToString("N3")</td> <td class="text-end">@u.EstimatedLbs.ToString("N3")</td>
<td class="text-end fw-semibold">@u.ActualLbsUsed.ToString("N3")</td> <td class="text-end fw-semibold">@u.ActualLbsUsed.ToString("N3")</td>
<td class="text-end @(variance > 0 ? "variance-over" : variance < 0 ? "variance-under" : "")"> <td class="text-end @(variance > 0 ? "variance-over" : variance < 0 ? "variance-under" : "")">
@@ -81,7 +81,7 @@ else
<tr> <tr>
<td style="color:#aaa;font-size:9pt;">@row</td> <td style="color:#aaa;font-size:9pt;">@row</td>
<td><strong>@item.Name</strong></td> <td><strong>@item.Name</strong></td>
<td>@(item.ColorName ?? "&mdash;")</td> <td>@Html.Raw(item.ColorName ?? "&mdash;")</td>
<td style="font-family:monospace;font-size:9.5pt;">@item.SKU</td> <td style="font-family:monospace;font-size:9.5pt;">@item.SKU</td>
</tr> </tr>
} }
@@ -244,9 +244,9 @@
<div class="text-muted small">@item.Name</div> <div class="text-muted small">@item.Name</div>
} }
</td> </td>
<td>@(item.Manufacturer ?? "&mdash;")</td> <td>@Html.Raw(item.Manufacturer ?? "&mdash;")</td>
<td class="text-muted small">@(item.ManufacturerPartNumber ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(item.ManufacturerPartNumber ?? "&mdash;")</td>
<td>@(item.Finish ?? "&mdash;")</td> <td>@Html.Raw(item.Finish ?? "&mdash;")</td>
<td> <td>
@if (item.QuantityOnHand > 0) @if (item.QuantityOnHand > 0)
{ {
@@ -399,9 +399,9 @@
<div class="text-muted small">@item.Name</div> <div class="text-muted small">@item.Name</div>
} }
</td> </td>
<td>@(item.Manufacturer ?? "&mdash;")</td> <td>@Html.Raw(item.Manufacturer ?? "&mdash;")</td>
<td class="text-muted small">@(item.ManufacturerPartNumber ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(item.ManufacturerPartNumber ?? "&mdash;")</td>
<td>@(item.Finish ?? "&mdash;")</td> <td>@Html.Raw(item.Finish ?? "&mdash;")</td>
<td class="text-end pe-3"> <td class="text-end pe-3">
<button class="btn btn-sm btn-outline-danger me-1 btn-toggle-panel" <button class="btn btn-sm btn-outline-danger me-1 btn-toggle-panel"
data-item-id="@item.Id" data-has-panel="false" data-item-id="@item.Id" data-has-panel="false"
@@ -461,7 +461,7 @@
<td style="border:1px solid #ccc;padding:6px 10px;">@(item.Manufacturer ?? "")</td> <td style="border:1px solid #ccc;padding:6px 10px;">@(item.Manufacturer ?? "")</td>
<td style="border:1px solid #ccc;padding:6px 10px;">@(item.ManufacturerPartNumber ?? "")</td> <td style="border:1px solid #ccc;padding:6px 10px;">@(item.ManufacturerPartNumber ?? "")</td>
<td style="border:1px solid #ccc;padding:6px 10px;">@(item.Finish ?? "")</td> <td style="border:1px solid #ccc;padding:6px 10px;">@(item.Finish ?? "")</td>
<td style="border:1px solid #ccc;padding:6px 10px;">@(item.QuantityOnHand > 0 ? item.QuantityOnHand.ToString("N2") + " " + item.UnitOfMeasure : "&mdash;")</td> <td style="border:1px solid #ccc;padding:6px 10px;">@Html.Raw(item.QuantityOnHand > 0 ? item.QuantityOnHand.ToString("N2") + " " + item.UnitOfMeasure : "&mdash;")</td>
<td style="border:1px solid #ccc;padding:6px 10px;">&nbsp;</td> <td style="border:1px solid #ccc;padding:6px 10px;">&nbsp;</td>
</tr> </tr>
} }
@@ -179,12 +179,12 @@
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Due Date</label> <label class="text-muted small mb-1">Due Date</label>
<p class="mb-0 @(Model.Status == InvoiceStatus.Overdue ? "text-danger fw-bold" : "")"> <p class="mb-0 @(Model.Status == InvoiceStatus.Overdue ? "text-danger fw-bold" : "")">
@(Model.DueDate.HasValue ? Model.DueDate.Value.ToString("MMMM d, yyyy") : "&mdash;") @Html.Raw(Model.DueDate.HasValue ? Model.DueDate.Value.ToString("MMMM d, yyyy") : "&mdash;")
</p> </p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<label class="text-muted small mb-1">Sent Date</label> <label class="text-muted small mb-1">Sent Date</label>
<p class="mb-0">@(Model.SentDate.HasValue ? Model.SentDate.Value.ToString("MMMM d, yyyy") : "&mdash;")</p> <p class="mb-0">@Html.Raw(Model.SentDate.HasValue ? Model.SentDate.Value.ToString("MMMM d, yyyy") : "&mdash;")</p>
</div> </div>
@if (!string.IsNullOrWhiteSpace(Model.CustomerPO)) @if (!string.IsNullOrWhiteSpace(Model.CustomerPO))
{ {
@@ -350,7 +350,7 @@
</span> </span>
</td> </td>
<td class="text-muted"> <td class="text-muted">
@(gcItem.Description.Contains("for ") ? gcItem.Description.Substring(gcItem.Description.IndexOf("for ") + 4).TrimEnd(')') : "&mdash;") @Html.Raw(gcItem.Description.Contains("for ") ? gcItem.Description.Substring(gcItem.Description.IndexOf("for ") + 4).TrimEnd(')') : "&mdash;")
</td> </td>
<td class="text-end fw-semibold">@gcItem.TotalPrice.ToString("C")</td> <td class="text-end fw-semibold">@gcItem.TotalPrice.ToString("C")</td>
<td> <td>
@@ -396,7 +396,7 @@
<tr> <tr>
<td>@p.PaymentDate.ToString("MM/dd/yyyy")</td> <td>@p.PaymentDate.ToString("MM/dd/yyyy")</td>
<td>@p.PaymentMethodDisplay</td> <td>@p.PaymentMethodDisplay</td>
<td>@(p.Reference ?? "&mdash;")</td> <td>@Html.Raw(p.Reference ?? "&mdash;")</td>
<td> <td>
@if (!string.IsNullOrEmpty(p.DepositAccountName)) @if (!string.IsNullOrEmpty(p.DepositAccountName))
{ {
@@ -407,7 +407,7 @@
<span class="text-muted">&mdash;</span> <span class="text-muted">&mdash;</span>
} }
</td> </td>
<td>@(p.RecordedByName ?? "&mdash;")</td> <td>@Html.Raw(p.RecordedByName ?? "&mdash;")</td>
<td class="text-end fw-semibold text-success">@p.Amount.ToString("C")</td> <td class="text-end fw-semibold text-success">@p.Amount.ToString("C")</td>
<td class="text-end"> <td class="text-end">
@if (!isVoided) @if (!isVoided)
@@ -463,7 +463,7 @@
<td>@r.RefundDate.ToString("MM/dd/yyyy")</td> <td>@r.RefundDate.ToString("MM/dd/yyyy")</td>
<td>@r.RefundMethodDisplay</td> <td>@r.RefundMethodDisplay</td>
<td>@r.Reason</td> <td>@r.Reason</td>
<td>@(r.Reference ?? "&mdash;")</td> <td>@Html.Raw(r.Reference ?? "&mdash;")</td>
<td><span class="badge bg-@refundStatusColor">@r.Status</span></td> <td><span class="badge bg-@refundStatusColor">@r.Status</span></td>
<td class="text-end fw-semibold text-danger">(@r.Amount.ToString("C"))</td> <td class="text-end fw-semibold text-danger">(@r.Amount.ToString("C"))</td>
<td class="text-nowrap"> <td class="text-nowrap">
@@ -144,7 +144,7 @@
</td> </td>
<td>@inv.InvoiceDate.ToString("MM/dd/yyyy")</td> <td>@inv.InvoiceDate.ToString("MM/dd/yyyy")</td>
<td class="@(inv.IsOverdue ? "fw-bold text-danger" : "")"> <td class="@(inv.IsOverdue ? "fw-bold text-danger" : "")">
@(inv.DueDate.HasValue ? inv.DueDate.Value.ToString("MM/dd/yyyy") : "&mdash;") @Html.Raw(inv.DueDate.HasValue ? inv.DueDate.Value.ToString("MM/dd/yyyy") : "&mdash;")
</td> </td>
<td class="text-end">@inv.Total.ToString("C")</td> <td class="text-end">@inv.Total.ToString("C")</td>
<td class="text-end @(inv.BalanceDue > 0 ? "fw-semibold" : "text-muted")"> <td class="text-end @(inv.BalanceDue > 0 ? "fw-semibold" : "text-muted")">
@@ -128,7 +128,7 @@
<td class="text-end">@gross.ToString("C")</td> <td class="text-end">@gross.ToString("C")</td>
<td class="text-end text-muted">@inv.OnlineSurchargeCollected.ToString("C")</td> <td class="text-end text-muted">@inv.OnlineSurchargeCollected.ToString("C")</td>
<td class="text-end fw-semibold">@net.ToString("C")</td> <td class="text-end fw-semibold">@net.ToString("C")</td>
<td>@dateDisplay</td> <td>@Html.Raw(dateDisplay)</td>
<td><span class="badge @statusClass">@inv.OnlinePaymentStatus</span></td> <td><span class="badge @statusClass">@inv.OnlinePaymentStatus</span></td>
<td> <td>
@if (!string.IsNullOrEmpty(inv.StripePaymentIntentId)) @if (!string.IsNullOrEmpty(inv.StripePaymentIntentId))
@@ -206,7 +206,7 @@
} }
else else
{ {
@invNum @Html.Raw(invNum)
} }
</td> </td>
<td>@custName</td> <td>@custName</td>
@@ -483,10 +483,10 @@
<tr> <tr>
<td style="text-align: center;">@coat.Sequence</td> <td style="text-align: center;">@coat.Sequence</td>
<td><strong>@coat.CoatName</strong></td> <td><strong>@coat.CoatName</strong></td>
<td>@(coat.ColorName ?? "&mdash;")</td> <td>@Html.Raw(coat.ColorName ?? "&mdash;")</td>
<td>@(coat.ColorCode ?? "&mdash;")</td> <td>@Html.Raw(coat.ColorCode ?? "&mdash;")</td>
<td>@(coat.Finish ?? "&mdash;")</td> <td>@Html.Raw(coat.Finish ?? "&mdash;")</td>
<td>@(coat.VendorName ?? "&mdash;")</td> <td>@Html.Raw(coat.VendorName ?? "&mdash;")</td>
<td> <td>
@if (coat.PowderToOrder.HasValue && coat.PowderToOrder.Value > 0) @if (coat.PowderToOrder.HasValue && coat.PowderToOrder.Value > 0)
{ {
@@ -561,7 +561,7 @@
<tr onclick="window.location='@Url.Action("Details", "Maintenance", new { id = item.Id })'" <tr onclick="window.location='@Url.Action("Details", "Maintenance", new { id = item.Id })'"
style="cursor: pointer;"> style="cursor: pointer;">
<td> <td>
<strong>@(item.Equipment?.EquipmentName ?? "&mdash;")</strong> <strong>@Html.Raw(item.Equipment?.EquipmentName ?? "&mdash;")</strong>
@if (!string.IsNullOrEmpty(item.Equipment?.Location)) @if (!string.IsNullOrEmpty(item.Equipment?.Location))
{ {
<br /><small class="text-muted"><i class="bi bi-geo-alt me-1"></i>@item.Equipment.Location</small> <br /><small class="text-muted"><i class="bi bi-geo-alt me-1"></i>@item.Equipment.Location</small>
@@ -119,7 +119,7 @@
<dt class="col-5 text-muted">Posted</dt> <dt class="col-5 text-muted">Posted</dt>
<dd class="col-7 small"> <dd class="col-7 small">
@Model.PostedAt.Value.ToLocalTime().ToString("MMM d, yyyy h:mm tt")<br /> @Model.PostedAt.Value.ToLocalTime().ToString("MMM d, yyyy h:mm tt")<br />
<span class="text-muted">by @(Model.PostedBy ?? "&mdash;")</span> <span class="text-muted">by @Html.Raw(Model.PostedBy ?? "&mdash;")</span>
</dd> </dd>
} }
<dt class="col-5 text-muted">Created</dt> <dt class="col-5 text-muted">Created</dt>
@@ -188,16 +188,16 @@
@{ @{
var firstActivity = row.FirstJobCreatedAt ?? row.FirstQuoteCreatedAt; var firstActivity = row.FirstJobCreatedAt ?? row.FirstQuoteCreatedAt;
} }
@(firstActivity.HasValue ? firstActivity.Value.ToString("MMM d, yyyy") : "&mdash;") @Html.Raw(firstActivity.HasValue ? firstActivity.Value.ToString("MMM d, yyyy") : "&mdash;")
</td> </td>
<td class="text-muted small"> <td class="text-muted small">
@(row.FirstInvoiceCreatedAt.HasValue ? row.FirstInvoiceCreatedAt.Value.ToString("MMM d, yyyy") : "&mdash;") @Html.Raw(row.FirstInvoiceCreatedAt.HasValue ? row.FirstInvoiceCreatedAt.Value.ToString("MMM d, yyyy") : "&mdash;")
</td> </td>
<td class="text-muted small"> <td class="text-muted small">
@(row.FirstWorkflowCompletedAt.HasValue ? row.FirstWorkflowCompletedAt.Value.ToString("MMM d, yyyy") : "&mdash;") @Html.Raw(row.FirstWorkflowCompletedAt.HasValue ? row.FirstWorkflowCompletedAt.Value.ToString("MMM d, yyyy") : "&mdash;")
</td> </td>
<td class="text-muted small"> <td class="text-muted small">
@(row.GuidedActivationDismissedAt.HasValue ? row.GuidedActivationDismissedAt.Value.ToString("MMM d, yyyy") : "&mdash;") @Html.Raw(row.GuidedActivationDismissedAt.HasValue ? row.GuidedActivationDismissedAt.Value.ToString("MMM d, yyyy") : "&mdash;")
</td> </td>
<td class="text-center"> <td class="text-center">
@switch (row.Status) @switch (row.Status)
@@ -23,7 +23,7 @@
<div class="card-body"> <div class="card-body">
<dl class="row small mb-0"> <dl class="row small mb-0">
<dt class="col-5 text-muted">Company</dt> <dt class="col-5 text-muted">Company</dt>
<dd class="col-7">@(ViewBag.CompanyName ?? (Model.CompanyId > 0 ? $"#{Model.CompanyId}" : "&mdash;"))</dd> <dd class="col-7">@Html.Raw(ViewBag.CompanyName ?? (Model.CompanyId > 0 ? $"#{Model.CompanyId}" : "&mdash;"))</dd>
<dt class="col-5 text-muted">Type</dt> <dt class="col-5 text-muted">Type</dt>
<dd class="col-7">@Model.NotificationType</dd> <dd class="col-7">@Model.NotificationType</dd>
<dt class="col-5 text-muted">Channel</dt> <dt class="col-5 text-muted">Channel</dt>
@@ -188,13 +188,13 @@
<tr> <tr>
<td class="text-muted">Monthly ID</td> <td class="text-muted">Monthly ID</td>
<td class="font-monospace small text-truncate" style="max-width: 120px;" title="@plan.StripePriceIdMonthly"> <td class="font-monospace small text-truncate" style="max-width: 120px;" title="@plan.StripePriceIdMonthly">
@(string.IsNullOrEmpty(plan.StripePriceIdMonthly) ? "&mdash;" : plan.StripePriceIdMonthly) @Html.Raw(string.IsNullOrEmpty(plan.StripePriceIdMonthly) ? "&mdash;" : plan.StripePriceIdMonthly)
</td> </td>
</tr> </tr>
<tr> <tr>
<td class="text-muted">Annual ID</td> <td class="text-muted">Annual ID</td>
<td class="font-monospace small text-truncate" style="max-width: 120px;" title="@plan.StripePriceIdAnnual"> <td class="font-monospace small text-truncate" style="max-width: 120px;" title="@plan.StripePriceIdAnnual">
@(string.IsNullOrEmpty(plan.StripePriceIdAnnual) ? "&mdash;" : plan.StripePriceIdAnnual) @Html.Raw(string.IsNullOrEmpty(plan.StripePriceIdAnnual) ? "&mdash;" : plan.StripePriceIdAnnual)
</td> </td>
</tr> </tr>
</tbody> </tbody>
@@ -115,7 +115,7 @@
<td class="text-end fw-semibold">@item.CurrentStockLbs.ToString("0.##") lbs</td> <td class="text-end fw-semibold">@item.CurrentStockLbs.ToString("0.##") lbs</td>
<td class="text-end">@item.ScheduledDemandLbs.ToString("0.##") lbs</td> <td class="text-end">@item.ScheduledDemandLbs.ToString("0.##") lbs</td>
<td class="text-end @(item.ShortfallLbs > 0 ? "text-danger fw-bold" : "text-muted")"> <td class="text-end @(item.ShortfallLbs > 0 ? "text-danger fw-bold" : "text-muted")">
@(item.ShortfallLbs > 0 ? $"{item.ShortfallLbs:0.##} lbs" : "&mdash;") @Html.Raw(item.ShortfallLbs > 0 ? $"{item.ShortfallLbs:0.##} lbs" : "&mdash;")
</td> </td>
<td class="text-center">@item.ActiveJobCount</td> <td class="text-center">@item.ActiveJobCount</td>
<td class="text-center"> <td class="text-center">
@@ -344,7 +344,7 @@
<br /><small class="text-muted">@w.CoatName</small> <br /><small class="text-muted">@w.CoatName</small>
</td> </td>
<td class="text-muted small">@(w.InventoryItemName ?? "Custom")</td> <td class="text-muted small">@(w.InventoryItemName ?? "Custom")</td>
<td>@(w.Complexity ?? "&mdash;")</td> <td>@Html.Raw(w.Complexity ?? "&mdash;")</td>
<td class="text-end">@w.EstimatedLbs.ToString("0.##") lbs</td> <td class="text-end">@w.EstimatedLbs.ToString("0.##") lbs</td>
<td class="text-end">@w.ActualLbs.ToString("0.##") lbs</td> <td class="text-end">@w.ActualLbs.ToString("0.##") lbs</td>
<td class="text-end text-danger fw-bold">+@w.OveragePct.ToString("0.#")%</td> <td class="text-end text-danger fw-bold">+@w.OveragePct.ToString("0.#")%</td>
@@ -28,7 +28,7 @@ else
<span class="text-muted"> · @coat.ColorName</span> <span class="text-muted"> · @coat.ColorName</span>
} }
</td> </td>
<td class="text-end small">@(coat.EstimatedLbs.HasValue ? $"{coat.EstimatedLbs:0.##}" : "&mdash;")</td> <td class="text-end small">@Html.Raw(coat.EstimatedLbs.HasValue ? $"{coat.EstimatedLbs:0.##}" : "&mdash;")</td>
<td class="text-end small"> <td class="text-end small">
@if (coat.IsRecorded) @if (coat.IsRecorded)
{ {
@@ -61,10 +61,10 @@ else
<td>Total</td> <td>Total</td>
<td class="text-end">@Model.TotalEstimatedLbs.ToString("0.##") lbs</td> <td class="text-end">@Model.TotalEstimatedLbs.ToString("0.##") lbs</td>
<td class="text-end @(Model.TotalActualLbs > 0 ? "text-success" : "")"> <td class="text-end @(Model.TotalActualLbs > 0 ? "text-success" : "")">
@(Model.TotalActualLbs > 0 ? $"{Model.TotalActualLbs:0.##} lbs" : "&mdash;") @Html.Raw(Model.TotalActualLbs > 0 ? $"{Model.TotalActualLbs:0.##} lbs" : "&mdash;")
</td> </td>
<td class="text-end @(Model.TotalVarianceLbs > 0 ? "text-danger" : Model.TotalVarianceLbs < 0 ? "text-success" : "")"> <td class="text-end @(Model.TotalVarianceLbs > 0 ? "text-danger" : Model.TotalVarianceLbs < 0 ? "text-success" : "")">
@(Model.TotalActualLbs > 0 ? $"{(Model.TotalVarianceLbs > 0 ? "+" : "")}{Model.TotalVarianceLbs:0.##} lbs" : "&mdash;") @Html.Raw(Model.TotalActualLbs > 0 ? $"{(Model.TotalVarianceLbs > 0 ? "+" : "")}{Model.TotalVarianceLbs:0.##} lbs" : "&mdash;")
</td> </td>
</tr> </tr>
</tfoot> </tfoot>
@@ -93,7 +93,7 @@
<strong>@tier.TierName</strong> <strong>@tier.TierName</strong>
</td> </td>
<td> <td>
<span class="text-muted small">@(tier.Description ?? "&mdash;")</span> <span class="text-muted small">@Html.Raw(tier.Description ?? "&mdash;")</span>
</td> </td>
<td class="text-center"> <td class="text-center">
@if (tier.DiscountPercent == 0) @if (tier.DiscountPercent == 0)
@@ -256,7 +256,7 @@
<div class="d-flex justify-content-between mb-2"> <div class="d-flex justify-content-between mb-2">
<span class="text-muted">Expected Delivery</span> <span class="text-muted">Expected Delivery</span>
<span class="@(Model.IsOverdue ? "text-danger fw-semibold" : "")"> <span class="@(Model.IsOverdue ? "text-danger fw-semibold" : "")">
@(Model.ExpectedDeliveryDate?.ToString("MM/dd/yyyy") ?? "&mdash;") @Html.Raw(Model.ExpectedDeliveryDate?.ToString("MM/dd/yyyy") ?? "&mdash;")
</span> </span>
</div> </div>
@if (Model.ReceivedDate.HasValue) @if (Model.ReceivedDate.HasValue)
@@ -260,7 +260,7 @@
</span> </span>
</td> </td>
<td>@po.OrderDate.ToString("MM/dd/yyyy")</td> <td>@po.OrderDate.ToString("MM/dd/yyyy")</td>
<td>@(po.ExpectedDeliveryDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td> <td>@Html.Raw(po.ExpectedDeliveryDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td>
<td class="text-center">@po.ItemCount</td> <td class="text-center">@po.ItemCount</td>
<td class="text-end fw-semibold">$@po.TotalAmount.ToString("N2")</td> <td class="text-end fw-semibold">$@po.TotalAmount.ToString("N2")</td>
<td class="text-end"> <td class="text-end">
@@ -156,11 +156,11 @@ else
</a> </a>
<span class="badge bg-secondary ms-1">@vend.Bills.Count bill@(vend.Bills.Count == 1 ? "" : "s")</span> <span class="badge bg-secondary ms-1">@vend.Bills.Count bill@(vend.Bills.Count == 1 ? "" : "s")</span>
</td> </td>
<td class="text-end aging-current">@(vend.TotalCurrent > 0 ? vend.TotalCurrent.ToString("C") : "&mdash;")</td> <td class="text-end aging-current">@Html.Raw(vend.TotalCurrent > 0 ? vend.TotalCurrent.ToString("C") : "&mdash;")</td>
<td class="text-end aging-1-30">@(vend.Total1to30 > 0 ? vend.Total1to30.ToString("C") : "&mdash;")</td> <td class="text-end aging-1-30">@Html.Raw(vend.Total1to30 > 0 ? vend.Total1to30.ToString("C") : "&mdash;")</td>
<td class="text-end aging-31-60">@(vend.Total31to60 > 0 ? vend.Total31to60.ToString("C") : "&mdash;")</td> <td class="text-end aging-31-60">@Html.Raw(vend.Total31to60 > 0 ? vend.Total31to60.ToString("C") : "&mdash;")</td>
<td class="text-end aging-61-90">@(vend.Total61to90 > 0 ? vend.Total61to90.ToString("C") : "&mdash;")</td> <td class="text-end aging-61-90">@Html.Raw(vend.Total61to90 > 0 ? vend.Total61to90.ToString("C") : "&mdash;")</td>
<td class="text-end aging-over90">@(vend.TotalOver90 > 0 ? vend.TotalOver90.ToString("C") : "&mdash;")</td> <td class="text-end aging-over90">@Html.Raw(vend.TotalOver90 > 0 ? vend.TotalOver90.ToString("C") : "&mdash;")</td>
<td class="text-end fw-semibold">@vend.TotalBalance.ToString("C")</td> <td class="text-end fw-semibold">@vend.TotalBalance.ToString("C")</td>
</tr> </tr>
} }
@@ -218,7 +218,7 @@ else
</a> </a>
</td> </td>
<td class="text-muted small">@bill.BillDate.ToString("MM/dd/yyyy")</td> <td class="text-muted small">@bill.BillDate.ToString("MM/dd/yyyy")</td>
<td class="text-muted small">@(bill.DueDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(bill.DueDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td>
<td class="text-end fw-semibold @(bill.DaysOverdue > 30 ? "text-danger" : "")">@bill.BalanceDue.ToString("C")</td> <td class="text-end fw-semibold @(bill.DaysOverdue > 30 ? "text-danger" : "")">@bill.BalanceDue.ToString("C")</td>
<td class="text-end"><span class="badge @ageBadge">@ageLabel</span></td> <td class="text-end"><span class="badge @ageBadge">@ageLabel</span></td>
<td></td> <td></td>
@@ -156,11 +156,11 @@ else
</a> </a>
<span class="badge bg-secondary ms-1">@cust.Invoices.Count inv.</span> <span class="badge bg-secondary ms-1">@cust.Invoices.Count inv.</span>
</td> </td>
<td class="text-end aging-current">@(cust.TotalCurrent > 0 ? cust.TotalCurrent.ToString("C") : "&mdash;")</td> <td class="text-end aging-current">@Html.Raw(cust.TotalCurrent > 0 ? cust.TotalCurrent.ToString("C") : "&mdash;")</td>
<td class="text-end aging-1-30">@(cust.Total1to30 > 0 ? cust.Total1to30.ToString("C") : "&mdash;")</td> <td class="text-end aging-1-30">@Html.Raw(cust.Total1to30 > 0 ? cust.Total1to30.ToString("C") : "&mdash;")</td>
<td class="text-end aging-31-60">@(cust.Total31to60 > 0 ? cust.Total31to60.ToString("C") : "&mdash;")</td> <td class="text-end aging-31-60">@Html.Raw(cust.Total31to60 > 0 ? cust.Total31to60.ToString("C") : "&mdash;")</td>
<td class="text-end aging-61-90">@(cust.Total61to90 > 0 ? cust.Total61to90.ToString("C") : "&mdash;")</td> <td class="text-end aging-61-90">@Html.Raw(cust.Total61to90 > 0 ? cust.Total61to90.ToString("C") : "&mdash;")</td>
<td class="text-end aging-over90">@(cust.TotalOver90 > 0 ? cust.TotalOver90.ToString("C") : "&mdash;")</td> <td class="text-end aging-over90">@Html.Raw(cust.TotalOver90 > 0 ? cust.TotalOver90.ToString("C") : "&mdash;")</td>
<td class="text-end fw-semibold">@cust.TotalBalance.ToString("C")</td> <td class="text-end fw-semibold">@cust.TotalBalance.ToString("C")</td>
</tr> </tr>
} }
@@ -218,7 +218,7 @@ else
</a> </a>
</td> </td>
<td class="text-muted small">@inv.InvoiceDate.ToString("MM/dd/yyyy")</td> <td class="text-muted small">@inv.InvoiceDate.ToString("MM/dd/yyyy")</td>
<td class="text-muted small">@(inv.DueDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(inv.DueDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td>
<td class="text-end fw-semibold @(inv.DaysOverdue > 30 ? "text-danger" : "")">@inv.BalanceDue.ToString("C")</td> <td class="text-end fw-semibold @(inv.DaysOverdue > 30 ? "text-danger" : "")">@inv.BalanceDue.ToString("C")</td>
<td class="text-end"><span class="badge @ageBadge">@ageLabel</span></td> <td class="text-end"><span class="badge @ageBadge">@ageLabel</span></td>
<td></td> <td></td>
@@ -101,11 +101,11 @@
@item.CustomerName @item.CustomerName
</a> </a>
</td> </td>
<td class="small">@(item.Email ?? "&mdash;")</td> <td class="small">@Html.Raw(item.Email ?? "&mdash;")</td>
<td class="small">@(item.Phone ?? "&mdash;")</td> <td class="small">@Html.Raw(item.Phone ?? "&mdash;")</td>
<td class="text-end">@item.TotalJobs</td> <td class="text-end">@item.TotalJobs</td>
<td class="text-end">@item.LifetimeRevenue.ToString("C")</td> <td class="text-end">@item.LifetimeRevenue.ToString("C")</td>
<td>@(item.LastJobDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td> <td>@Html.Raw(item.LastJobDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td>
<td class="text-end"> <td class="text-end">
@if (item.DaysSinceLastJob < 0) @if (item.DaysSinceLastJob < 0)
{ {
@@ -1604,7 +1604,7 @@
<div class="fw-medium">@color.DisplayLabel</div> <div class="fw-medium">@color.DisplayLabel</div>
<div class="text-muted small">@color.SKU</div> <div class="text-muted small">@color.SKU</div>
</td> </td>
<td class="text-muted small">@(color.Manufacturer ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(color.Manufacturer ?? "&mdash;")</td>
<td class="text-end"> <td class="text-end">
<div>@color.TotalLbsUsed.ToString("N1") lbs</div> <div>@color.TotalLbsUsed.ToString("N1") lbs</div>
<div class="progress mt-1" style="height:4px; min-width:80px;"> <div class="progress mt-1" style="height:4px; min-width:80px;">
@@ -1749,7 +1749,7 @@
@c.BalanceDue.ToString("C") @c.BalanceDue.ToString("C")
</td> </td>
<td class="text-end text-muted">@c.AvgInvoiceValue.ToString("C")</td> <td class="text-end text-muted">@c.AvgInvoiceValue.ToString("C")</td>
<td class="text-muted small">@(c.LastInvoiceDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(c.LastInvoiceDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td>
<td class="pe-3"> <td class="pe-3">
<div class="d-flex align-items-center gap-2"> <div class="d-flex align-items-center gap-2">
<div class="progress flex-grow-1" style="height:6px;"> <div class="progress flex-grow-1" style="height:6px;">
@@ -1896,10 +1896,10 @@
<span class="badge @badgeClass">@r.RetentionStatus</span> <span class="badge @badgeClass">@r.RetentionStatus</span>
</td> </td>
<td class="text-center small"> <td class="text-center small">
@(r.LastJobDate.HasValue ? r.LastJobDate.Value.ToString("MMM d, yyyy") : "&mdash;") @Html.Raw(r.LastJobDate.HasValue ? r.LastJobDate.Value.ToString("MMM d, yyyy") : "&mdash;")
</td> </td>
<td class="text-center small"> <td class="text-center small">
@(r.DaysSinceLastJob >= 0 ? r.DaysSinceLastJob + "d" : "&mdash;") @Html.Raw(r.DaysSinceLastJob >= 0 ? r.DaysSinceLastJob + "d" : "&mdash;")
</td> </td>
<td class="text-end">@r.TotalJobs</td> <td class="text-end">@r.TotalJobs</td>
<td class="text-end pe-3 fw-semibold">@r.LifetimeRevenue.ToString("C0")</td> <td class="text-end pe-3 fw-semibold">@r.LifetimeRevenue.ToString("C0")</td>
@@ -2235,7 +2235,7 @@
} }
</td> </td>
<td class="small">@inv.InvoiceDate.ToString("MMM d, yyyy")</td> <td class="small">@inv.InvoiceDate.ToString("MMM d, yyyy")</td>
<td class="small">@(inv.DueDate.HasValue ? inv.DueDate.Value.ToString("MMM d, yyyy") : "&mdash;")</td> <td class="small">@Html.Raw(inv.DueDate.HasValue ? inv.DueDate.Value.ToString("MMM d, yyyy") : "&mdash;")</td>
<td class="text-end">@inv.Total.ToString("C")</td> <td class="text-end">@inv.Total.ToString("C")</td>
<td class="text-end text-success">@inv.AmountPaid.ToString("C")</td> <td class="text-end text-success">@inv.AmountPaid.ToString("C")</td>
<td class="text-end fw-semibold @(inv.BalanceDue > 0 ? "text-danger" : "")">@inv.BalanceDue.ToString("C")</td> <td class="text-end fw-semibold @(inv.BalanceDue > 0 ? "text-danger" : "")">@inv.BalanceDue.ToString("C")</td>
@@ -2349,7 +2349,7 @@
<div class="small text-muted">@p.ColorCode @(!string.IsNullOrEmpty(p.SKU) ? $"· {p.SKU}" : "")</div> <div class="small text-muted">@p.ColorCode @(!string.IsNullOrEmpty(p.SKU) ? $"· {p.SKU}" : "")</div>
} }
</td> </td>
<td class="small text-muted">@(p.Manufacturer ?? "&mdash;")</td> <td class="small text-muted">@Html.Raw(p.Manufacturer ?? "&mdash;")</td>
<td class="text-end">@p.TotalPurchasedLbs.ToString("N1")</td> <td class="text-end">@p.TotalPurchasedLbs.ToString("N1")</td>
<td class="text-end">@p.TotalConsumedLbs.ToString("N1")</td> <td class="text-end">@p.TotalConsumedLbs.ToString("N1")</td>
<td class="text-end"> <td class="text-end">
@@ -52,7 +52,7 @@
<div class="small text-muted">@item.SKU</div> <div class="small text-muted">@item.SKU</div>
} }
</td> </td>
<td>@(item.ColorName ?? "&mdash;")</td> <td>@Html.Raw(item.ColorName ?? "&mdash;")</td>
<td class="text-end">@item.CurrentStockLbs.ToString("N1")</td> <td class="text-end">@item.CurrentStockLbs.ToString("N1")</td>
<td class="text-end">@item.TotalConsumedLbs.ToString("N1")</td> <td class="text-end">@item.TotalConsumedLbs.ToString("N1")</td>
<td class="text-end">@item.TotalPurchasedLbs.ToString("N1")</td> <td class="text-end">@item.TotalPurchasedLbs.ToString("N1")</td>
@@ -85,12 +85,12 @@
} }
</td> </td>
<td>@item.InvoiceDate.ToString("MMM d, yyyy")</td> <td>@item.InvoiceDate.ToString("MMM d, yyyy")</td>
<td>@(item.DueDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td> <td>@Html.Raw(item.DueDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td>
<td class="text-end">@item.Total.ToString("C")</td> <td class="text-end">@item.Total.ToString("C")</td>
<td class="text-end text-success">@item.AmountPaid.ToString("C")</td> <td class="text-end text-success">@item.AmountPaid.ToString("C")</td>
<td class="text-end fw-semibold">@item.BalanceDue.ToString("C")</td> <td class="text-end fw-semibold">@item.BalanceDue.ToString("C")</td>
<td class="text-end @bucketClass"> <td class="text-end @bucketClass">
@(item.DaysOverdue > 0 ? item.DaysOverdue.ToString() : "&mdash;") @Html.Raw(item.DaysOverdue > 0 ? item.DaysOverdue.ToString() : "&mdash;")
</td> </td>
<td><span class="badge @bucketClass bg-opacity-10 border">@item.AgingBucket</span></td> <td><span class="badge @bucketClass bg-opacity-10 border">@item.AgingBucket</span></td>
<td><span class="badge bg-secondary-subtle text-secondary">@item.StatusDisplay</span></td> <td><span class="badge bg-secondary-subtle text-secondary">@item.StatusDisplay</span></td>
@@ -116,7 +116,7 @@
{ {
<tr class="@(i.QuantityOnHand == 0 ? "table-danger" : "table-warning")"> <tr class="@(i.QuantityOnHand == 0 ? "table-danger" : "table-warning")">
<td>@i.Name</td> <td>@i.Name</td>
<td>@(i.ColorName ?? "&mdash;")</td> <td>@Html.Raw(i.ColorName ?? "&mdash;")</td>
<td class="text-end fw-semibold text-danger">@i.QuantityOnHand.ToString("N1")</td> <td class="text-end fw-semibold text-danger">@i.QuantityOnHand.ToString("N1")</td>
<td class="text-end">@i.ReorderPoint.ToString("N1")</td> <td class="text-end">@i.ReorderPoint.ToString("N1")</td>
<td class="text-muted small">@i.UnitOfMeasure</td> <td class="text-muted small">@i.UnitOfMeasure</td>
@@ -60,13 +60,13 @@
} }
</td> </td>
<td> <td>
@(item.ColorName ?? "&mdash;") @Html.Raw(item.ColorName ?? "&mdash;")
@if (!string.IsNullOrEmpty(item.ColorCode)) @if (!string.IsNullOrEmpty(item.ColorCode))
{ {
<span class="badge bg-secondary-subtle text-secondary ms-1">@item.ColorCode</span> <span class="badge bg-secondary-subtle text-secondary ms-1">@item.ColorCode</span>
} }
</td> </td>
<td class="text-muted">@(item.Manufacturer ?? "&mdash;")</td> <td class="text-muted">@Html.Raw(item.Manufacturer ?? "&mdash;")</td>
<td class="text-end">@item.TotalPurchasedLbs.ToString("N1")</td> <td class="text-end">@item.TotalPurchasedLbs.ToString("N1")</td>
<td class="text-end">@item.TotalConsumedLbs.ToString("N1")</td> <td class="text-end">@item.TotalConsumedLbs.ToString("N1")</td>
<td class="text-end fw-semibold @varianceClass">@item.VarianceLbs.ToString("N1")</td> <td class="text-end fw-semibold @varianceClass">@item.VarianceLbs.ToString("N1")</td>
@@ -79,8 +79,8 @@
<td> <td>
@item.DisplayLabel @item.DisplayLabel
</td> </td>
<td class="text-muted small">@(item.SKU ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(item.SKU ?? "&mdash;")</td>
<td class="text-muted small">@(item.Manufacturer ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(item.Manufacturer ?? "&mdash;")</td>
<td class="text-end fw-semibold">@item.TotalLbsUsed.ToString("N1")</td> <td class="text-end fw-semibold">@item.TotalLbsUsed.ToString("N1")</td>
<td class="text-end">@item.TotalCost.ToString("C")</td> <td class="text-end">@item.TotalCost.ToString("C")</td>
<td class="text-end">@item.JobCount</td> <td class="text-end">@item.JobCount</td>
@@ -148,7 +148,7 @@
<tr> <tr>
<td class="ps-4">@line.AccountNumber <span class="text-muted">@line.AccountName</span></td> <td class="ps-4">@line.AccountNumber <span class="text-muted">@line.AccountName</span></td>
<td class="text-end">@line.Amount.ToString("C")</td> <td class="text-end">@line.Amount.ToString("C")</td>
<td class="text-end text-muted small">@(Model.TotalRevenue == 0 ? "&mdash;" : (line.Amount / Model.TotalRevenue * 100).ToString("F1") + "%")</td> <td class="text-end text-muted small">@Html.Raw(Model.TotalRevenue == 0 ? "&mdash;" : (line.Amount / Model.TotalRevenue * 100).ToString("F1") + "%")</td>
</tr> </tr>
} }
<tr class="report-subtotal-row"> <tr class="report-subtotal-row">
@@ -169,18 +169,18 @@
<tr> <tr>
<td class="ps-4">@line.AccountNumber <span class="text-muted">@line.AccountName</span></td> <td class="ps-4">@line.AccountNumber <span class="text-muted">@line.AccountName</span></td>
<td class="text-end">@line.Amount.ToString("C")</td> <td class="text-end">@line.Amount.ToString("C")</td>
<td class="text-end text-muted small">@(Model.TotalRevenue == 0 ? "&mdash;" : (line.Amount / Model.TotalRevenue * 100).ToString("F1") + "%")</td> <td class="text-end text-muted small">@Html.Raw(Model.TotalRevenue == 0 ? "&mdash;" : (line.Amount / Model.TotalRevenue * 100).ToString("F1") + "%")</td>
</tr> </tr>
} }
<tr class="report-subtotal-row"> <tr class="report-subtotal-row">
<td class="ps-4 fw-semibold">Total COGS</td> <td class="ps-4 fw-semibold">Total COGS</td>
<td class="text-end fw-semibold text-warning">(@Model.TotalCogs.ToString("C"))</td> <td class="text-end fw-semibold text-warning">(@Model.TotalCogs.ToString("C"))</td>
<td class="text-end text-muted small">@(Model.TotalRevenue == 0 ? "&mdash;" : (Model.TotalCogs / Model.TotalRevenue * 100).ToString("F1") + "%")</td> <td class="text-end text-muted small">@Html.Raw(Model.TotalRevenue == 0 ? "&mdash;" : (Model.TotalCogs / Model.TotalRevenue * 100).ToString("F1") + "%")</td>
</tr> </tr>
<tr class="report-subtotal-row"> <tr class="report-subtotal-row">
<td class="ps-2 fw-semibold">Gross Profit</td> <td class="ps-2 fw-semibold">Gross Profit</td>
<td class="text-end fw-semibold @(Model.GrossProfit >= 0 ? "text-success" : "text-danger")">@Model.GrossProfit.ToString("C")</td> <td class="text-end fw-semibold @(Model.GrossProfit >= 0 ? "text-success" : "text-danger")">@Model.GrossProfit.ToString("C")</td>
<td class="text-end text-muted small">@(Model.TotalRevenue == 0 ? "&mdash;" : Model.GrossMarginPercent.ToString("F1") + "%")</td> <td class="text-end text-muted small">@Html.Raw(Model.TotalRevenue == 0 ? "&mdash;" : Model.GrossMarginPercent.ToString("F1") + "%")</td>
</tr> </tr>
} }
@@ -198,20 +198,20 @@
<tr> <tr>
<td class="ps-4">@line.AccountNumber <span class="text-muted">@line.AccountName</span></td> <td class="ps-4">@line.AccountNumber <span class="text-muted">@line.AccountName</span></td>
<td class="text-end">@line.Amount.ToString("C")</td> <td class="text-end">@line.Amount.ToString("C")</td>
<td class="text-end text-muted small">@(Model.TotalRevenue == 0 ? "&mdash;" : (line.Amount / Model.TotalRevenue * 100).ToString("F1") + "%")</td> <td class="text-end text-muted small">@Html.Raw(Model.TotalRevenue == 0 ? "&mdash;" : (line.Amount / Model.TotalRevenue * 100).ToString("F1") + "%")</td>
</tr> </tr>
} }
<tr class="report-subtotal-row"> <tr class="report-subtotal-row">
<td class="ps-4 fw-semibold">Total Expenses</td> <td class="ps-4 fw-semibold">Total Expenses</td>
<td class="text-end fw-semibold text-danger">(@Model.TotalExpenses.ToString("C"))</td> <td class="text-end fw-semibold text-danger">(@Model.TotalExpenses.ToString("C"))</td>
<td class="text-end text-muted small">@(Model.TotalRevenue == 0 ? "&mdash;" : (Model.TotalExpenses / Model.TotalRevenue * 100).ToString("F1") + "%")</td> <td class="text-end text-muted small">@Html.Raw(Model.TotalRevenue == 0 ? "&mdash;" : (Model.TotalExpenses / Model.TotalRevenue * 100).ToString("F1") + "%")</td>
</tr> </tr>
</tbody> </tbody>
<tfoot> <tfoot>
<tr class="report-net-row @(Model.NetIncome < 0 ? "report-net-negative" : "")"> <tr class="report-net-row @(Model.NetIncome < 0 ? "report-net-negative" : "")">
<td class="ps-2">Net Income</td> <td class="ps-2">Net Income</td>
<td class="text-end @(Model.NetIncome >= 0 ? "text-success" : "text-danger")">@Model.NetIncome.ToString("C")</td> <td class="text-end @(Model.NetIncome >= 0 ? "text-success" : "text-danger")">@Model.NetIncome.ToString("C")</td>
<td class="text-end text-muted small">@(Model.TotalRevenue == 0 ? "&mdash;" : (Model.NetIncome / Model.TotalRevenue * 100).ToString("F1") + "%")</td> <td class="text-end text-muted small">@Html.Raw(Model.TotalRevenue == 0 ? "&mdash;" : (Model.NetIncome / Model.TotalRevenue * 100).ToString("F1") + "%")</td>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
@@ -205,7 +205,7 @@ else
<td class="text-end fw-semibold">@c.TotalInvoiced.ToString("C")</td> <td class="text-end fw-semibold">@c.TotalInvoiced.ToString("C")</td>
<td class="text-end text-success">@c.TotalPaid.ToString("C")</td> <td class="text-end text-success">@c.TotalPaid.ToString("C")</td>
<td class="text-end @(c.BalanceDue > 0 ? "text-warning" : "text-muted")">@c.BalanceDue.ToString("C")</td> <td class="text-end @(c.BalanceDue > 0 ? "text-warning" : "text-muted")">@c.BalanceDue.ToString("C")</td>
<td class="text-end text-muted small no-print">@(Model.TotalInvoiced == 0 ? "&mdash;" : (c.TotalInvoiced / Model.TotalInvoiced * 100).ToString("F1") + "%")</td> <td class="text-end text-muted small no-print">@Html.Raw(Model.TotalInvoiced == 0 ? "&mdash;" : (c.TotalInvoiced / Model.TotalInvoiced * 100).ToString("F1") + "%")</td>
</tr> </tr>
} }
</tbody> </tbody>
@@ -263,9 +263,9 @@ else
</td> </td>
<td class="text-muted small">@inv.CustomerName</td> <td class="text-muted small">@inv.CustomerName</td>
<td class="text-muted small">@inv.InvoiceDate.ToString("MM/dd/yyyy")</td> <td class="text-muted small">@inv.InvoiceDate.ToString("MM/dd/yyyy")</td>
<td class="text-muted small">@(inv.DueDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(inv.DueDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td>
<td class="text-end">@inv.SubTotal.ToString("C")</td> <td class="text-end">@inv.SubTotal.ToString("C")</td>
<td class="text-end text-muted small">@(inv.TaxAmount > 0 ? inv.TaxAmount.ToString("C") : "&mdash;")</td> <td class="text-end text-muted small">@Html.Raw(inv.TaxAmount > 0 ? inv.TaxAmount.ToString("C") : "&mdash;")</td>
<td class="text-end fw-semibold">@inv.Total.ToString("C")</td> <td class="text-end fw-semibold">@inv.Total.ToString("C")</td>
<td class="text-end text-success">@inv.AmountPaid.ToString("C")</td> <td class="text-end text-success">@inv.AmountPaid.ToString("C")</td>
<td><span class="badge @statusBadge">@inv.Status</span></td> <td><span class="badge @statusBadge">@inv.Status</span></td>
@@ -76,7 +76,7 @@
@item.BalanceDue.ToString("C") @item.BalanceDue.ToString("C")
</td> </td>
<td class="text-end">@item.AvgInvoiceValue.ToString("C")</td> <td class="text-end">@item.AvgInvoiceValue.ToString("C")</td>
<td>@(item.LastInvoiceDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td> <td>@Html.Raw(item.LastInvoiceDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td>
</tr> </tr>
} }
</tbody> </tbody>
@@ -284,11 +284,11 @@ else
<td class="small text-muted">@inv.InvoiceDate.ToString("MM/dd/yyyy")</td> <td class="small text-muted">@inv.InvoiceDate.ToString("MM/dd/yyyy")</td>
<td><span class="badge @statusBadge">@inv.Status</span></td> <td><span class="badge @statusBadge">@inv.Status</span></td>
<td class="text-end">@inv.SubTotal.ToString("C")</td> <td class="text-end">@inv.SubTotal.ToString("C")</td>
<td class="text-end text-muted small">@(isTaxable ? inv.TaxPercent.ToString("F2") + "%" : "&mdash;")</td> <td class="text-end text-muted small">@Html.Raw(isTaxable ? inv.TaxPercent.ToString("F2") + "%" : "&mdash;")</td>
<td class="text-end @(isTaxable ? "fw-semibold text-primary" : "text-muted")">@(isTaxable ? inv.TaxAmount.ToString("C") : "&mdash;")</td> <td class="text-end @Html.Raw(isTaxable ? "fw-semibold text-primary" : "text-muted")">@Html.Raw(isTaxable ? inv.TaxAmount.ToString("C") : "&mdash;")</td>
<td class="text-end fw-semibold">@inv.Total.ToString("C")</td> <td class="text-end fw-semibold">@inv.Total.ToString("C")</td>
<td class="text-end text-success no-print">@inv.AmountPaid.ToString("C")</td> <td class="text-end text-success no-print">@inv.AmountPaid.ToString("C")</td>
<td class="small text-muted">@(string.IsNullOrEmpty(inv.TaxAccountName) ? "&mdash;" : inv.TaxAccountName)</td> <td class="small text-muted">@Html.Raw(string.IsNullOrEmpty(inv.TaxAccountName) ? "&mdash;" : inv.TaxAccountName)</td>
</tr> </tr>
} }
</tbody> </tbody>
@@ -117,7 +117,7 @@ else
<span class="text-danger small"><i class="bi bi-exclamation-triangle me-1"></i>Missing</span> <span class="text-danger small"><i class="bi bi-exclamation-triangle me-1"></i>Missing</span>
} }
</td> </td>
<td class="small">@(row.Address ?? "&mdash;")</td> <td class="small">@Html.Raw(row.Address ?? "&mdash;")</td>
<td class="text-end">@row.BillsPaid.ToString("C")</td> <td class="text-end">@row.BillsPaid.ToString("C")</td>
<td class="text-end">@row.ExpensesPaid.ToString("C")</td> <td class="text-end">@row.ExpensesPaid.ToString("C")</td>
<td class="text-end fw-bold @(row.NeedsForm ? "text-danger" : "")">@row.TotalPaid.ToString("C")</td> <td class="text-end fw-bold @(row.NeedsForm ? "text-danger" : "")">@row.TotalPaid.ToString("C")</td>
@@ -210,7 +210,7 @@
<td class="small fw-semibold">@alert.CompanyName</td> <td class="small fw-semibold">@alert.CompanyName</td>
<td class="small">@alert.PlanName</td> <td class="small">@alert.PlanName</td>
<td><span class="badge bg-@statusClass">@alert.Status</span></td> <td><span class="badge bg-@statusClass">@alert.Status</span></td>
<td class="small">@(alert.EndDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td> <td class="small">@Html.Raw(alert.EndDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</td>
<td class="small @(alert.DaysUntilExpiry < 0 ? "text-danger" : "text-warning")">@daysText</td> <td class="small @(alert.DaysUntilExpiry < 0 ? "text-danger" : "text-warning")">@daysText</td>
<td> <td>
<a asp-controller="SubscriptionManagement" asp-action="Manage" <a asp-controller="SubscriptionManagement" asp-action="Manage"
@@ -248,7 +248,7 @@
<div class="mobile-card-body"> <div class="mobile-card-body">
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">End Date</span> <span class="mobile-card-label">End Date</span>
<span class="mobile-card-value">@(alert.EndDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</span> <span class="mobile-card-value">@Html.Raw(alert.EndDate?.ToString("MM/dd/yyyy") ?? "&mdash;")</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Days</span> <span class="mobile-card-label">Days</span>
@@ -35,7 +35,7 @@
<dd class="col-7"><span class="badge bg-light text-dark border">@Model.EventType</span></dd> <dd class="col-7"><span class="badge bg-light text-dark border">@Model.EventType</span></dd>
<dt class="col-5 text-muted">Company ID</dt> <dt class="col-5 text-muted">Company ID</dt>
<dd class="col-7">@(Model.CompanyId.HasValue ? Model.CompanyId.ToString() : "&mdash;")</dd> <dd class="col-7">@Html.Raw(Model.CompanyId.HasValue ? Model.CompanyId.ToString() : "&mdash;")</dd>
<dt class="col-5 text-muted">Status</dt> <dt class="col-5 text-muted">Status</dt>
<dd class="col-7"><span class="badge bg-@statusClass">@Model.Status</span></dd> <dd class="col-7"><span class="badge bg-@statusClass">@Model.Status</span></dd>
@@ -44,7 +44,7 @@
<dd class="col-7">@Model.ReceivedAt.ToString("MM/dd/yyyy HH:mm:ss") UTC</dd> <dd class="col-7">@Model.ReceivedAt.ToString("MM/dd/yyyy HH:mm:ss") UTC</dd>
<dt class="col-5 text-muted">Processed At</dt> <dt class="col-5 text-muted">Processed At</dt>
<dd class="col-7">@(Model.ProcessedAt.HasValue ? Model.ProcessedAt.Value.ToString("MM/dd/yyyy HH:mm:ss") + " UTC" : "&mdash;")</dd> <dd class="col-7">@Html.Raw(Model.ProcessedAt.HasValue ? Model.ProcessedAt.Value.ToString("MM/dd/yyyy HH:mm:ss") + " UTC" : "&mdash;")</dd>
</dl> </dl>
</div> </div>
</div> </div>
@@ -145,12 +145,12 @@
<td class="small"> <td class="small">
<span class="badge bg-secondary-subtle text-body border">@evt.EventType</span> <span class="badge bg-secondary-subtle text-body border">@evt.EventType</span>
</td> </td>
<td class="small">@(evt.CompanyId.HasValue ? $"#{evt.CompanyId}" : "&mdash;")</td> <td class="small">@Html.Raw(evt.CompanyId.HasValue ? $"#{evt.CompanyId}" : "&mdash;")</td>
<td> <td>
<span class="badge bg-@statusClass">@evt.Status</span> <span class="badge bg-@statusClass">@evt.Status</span>
</td> </td>
<td class="small"> <td class="small">
@(evt.ProcessedAt.HasValue ? evt.ProcessedAt.Value.ToString("HH:mm:ss") : "&mdash;") @Html.Raw(evt.ProcessedAt.HasValue ? evt.ProcessedAt.Value.ToString("HH:mm:ss") : "&mdash;")
</td> </td>
<td> <td>
<a asp-action="Details" asp-route-id="@evt.Id" class="btn btn-outline-secondary btn-sm py-0">View</a> <a asp-action="Details" asp-route-id="@evt.Id" class="btn btn-outline-secondary btn-sm py-0">View</a>
@@ -191,7 +191,7 @@
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Company</span> <span class="mobile-card-label">Company</span>
<span class="mobile-card-value">@(evt.CompanyId.HasValue ? $"#{evt.CompanyId}" : "&mdash;")</span> <span class="mobile-card-value">@Html.Raw(evt.CompanyId.HasValue ? $"#{evt.CompanyId}" : "&mdash;")</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Event ID</span> <span class="mobile-card-label">Event ID</span>
@@ -66,9 +66,9 @@
<dt class="col-7 text-muted">Users</dt> <dt class="col-7 text-muted">Users</dt>
<dd class="col-5 fw-semibold">@ViewBag.UserCount</dd> <dd class="col-5 fw-semibold">@ViewBag.UserCount</dd>
<dt class="col-7 text-muted">Stripe Customer</dt> <dt class="col-7 text-muted">Stripe Customer</dt>
<dd class="col-5"><code class="small">@(Model.StripeCustomerId ?? "&mdash;")</code></dd> <dd class="col-5"><code class="small">@Html.Raw(Model.StripeCustomerId ?? "&mdash;")</code></dd>
<dt class="col-7 text-muted">Stripe Sub</dt> <dt class="col-7 text-muted">Stripe Sub</dt>
<dd class="col-5"><code class="small">@(Model.StripeSubscriptionId ?? "&mdash;")</code></dd> <dd class="col-5"><code class="small">@Html.Raw(Model.StripeSubscriptionId ?? "&mdash;")</code></dd>
</dl> </dl>
</div> </div>
</div> </div>
@@ -97,7 +97,7 @@
</tr> </tr>
<tr> <tr>
<th class="ps-4">Last Migration</th> <th class="ps-4">Last Migration</th>
<td><small class="text-muted font-monospace">@(Model.LastAppliedMigration ?? "&mdash;")</small></td> <td><small class="text-muted font-monospace">@Html.Raw(Model.LastAppliedMigration ?? "&mdash;")</small></td>
</tr> </tr>
<tr> <tr>
<th class="ps-4">Last Seed Run</th> <th class="ps-4">Last Seed Run</th>
@@ -153,7 +153,7 @@
<td class="text-nowrap small text-muted">@row.Timestamp.Tz(ViewBag.CompanyTimeZone as string).ToString("MM/dd HH:mm:ss")</td> <td class="text-nowrap small text-muted">@row.Timestamp.Tz(ViewBag.CompanyTimeZone as string).ToString("MM/dd HH:mm:ss")</td>
<td><span class="badge @LevelBadge(row.Level)">@row.Level</span></td> <td><span class="badge @LevelBadge(row.Level)">@row.Level</span></td>
<td class="small text-truncate" style="max-width:180px" title="@row.SourceContext"> <td class="small text-truncate" style="max-width:180px" title="@row.SourceContext">
@(row.SourceContext?.Split('.').LastOrDefault() ?? "&mdash;") @Html.Raw(row.SourceContext?.Split('.').LastOrDefault() ?? "&mdash;")
</td> </td>
<td class="small text-truncate" style="max-width:400px"> <td class="small text-truncate" style="max-width:400px">
@row.Message @row.Message
@@ -162,8 +162,8 @@
<i class="bi bi-bug text-danger ms-1" title="Has exception"></i> <i class="bi bi-bug text-danger ms-1" title="Has exception"></i>
} }
</td> </td>
<td class="small text-muted">@(row.UserName ?? "&mdash;")</td> <td class="small text-muted">@Html.Raw(row.UserName ?? "&mdash;")</td>
<td class="small text-muted text-center">@(row.CompanyId?.ToString() ?? "&mdash;")</td> <td class="small text-muted text-center">@Html.Raw(row.CompanyId?.ToString() ?? "&mdash;")</td>
<td class="text-center"><i class="bi bi-zoom-in text-muted small"></i></td> <td class="text-center"><i class="bi bi-zoom-in text-muted small"></i></td>
</tr> </tr>
} }
@@ -195,7 +195,7 @@
<div class="mobile-card-header"> <div class="mobile-card-header">
<div class="mobile-card-icon @cardIconBg"><i class="bi @cardIcon"></i></div> <div class="mobile-card-icon @cardIconBg"><i class="bi @cardIcon"></i></div>
<div class="mobile-card-title"> <div class="mobile-card-title">
<h6>@msgTruncated</h6> <h6>@Html.Raw(msgTruncated)</h6>
<small class="text-muted">@row.Timestamp.Tz(ViewBag.CompanyTimeZone as string).ToString("MM/dd HH:mm:ss")</small> <small class="text-muted">@row.Timestamp.Tz(ViewBag.CompanyTimeZone as string).ToString("MM/dd HH:mm:ss")</small>
</div> </div>
</div> </div>
@@ -208,7 +208,7 @@
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Source</span> <span class="mobile-card-label">Source</span>
<span class="mobile-card-value small">@(row.SourceContext?.Split('.').LastOrDefault() ?? "&mdash;")</span> <span class="mobile-card-value small">@Html.Raw(row.SourceContext?.Split('.').LastOrDefault() ?? "&mdash;")</span>
</div> </div>
@if (row.UserName != null) @if (row.UserName != null)
{ {
@@ -67,8 +67,8 @@
} }
</td> </td>
<td>@rate.Rate.ToString("0.##")%</td> <td>@rate.Rate.ToString("0.##")%</td>
<td>@(rate.State ?? "&mdash;")</td> <td>@Html.Raw(rate.State ?? "&mdash;")</td>
<td class="text-muted small">@(rate.Description ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(rate.Description ?? "&mdash;")</td>
<td class="text-center"> <td class="text-center">
@if (rate.IsDefault) @if (rate.IsDefault)
{ {
@@ -220,23 +220,23 @@
<div class="mobile-card-body"> <div class="mobile-card-body">
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Users</span> <span class="mobile-card-label">Users</span>
<span class="mobile-card-value">@row.Users / @LimitDisplay(row.MaxUsers)</span> <span class="mobile-card-value">@row.Users / @Html.Raw(LimitDisplay(row.MaxUsers))</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Active Jobs</span> <span class="mobile-card-label">Active Jobs</span>
<span class="mobile-card-value">@row.ActiveJobs / @LimitDisplay(row.MaxActiveJobs)</span> <span class="mobile-card-value">@row.ActiveJobs / @Html.Raw(LimitDisplay(row.MaxActiveJobs))</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Customers</span> <span class="mobile-card-label">Customers</span>
<span class="mobile-card-value">@row.Customers / @LimitDisplay(row.MaxCustomers)</span> <span class="mobile-card-value">@row.Customers / @Html.Raw(LimitDisplay(row.MaxCustomers))</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Active Quotes</span> <span class="mobile-card-label">Active Quotes</span>
<span class="mobile-card-value">@row.ActiveQuotes / @LimitDisplay(row.MaxActiveQuotes)</span> <span class="mobile-card-value">@row.ActiveQuotes / @Html.Raw(LimitDisplay(row.MaxActiveQuotes))</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Catalog Items</span> <span class="mobile-card-label">Catalog Items</span>
<span class="mobile-card-value">@row.CatalogItems / @LimitDisplay(row.MaxCatalogItems)</span> <span class="mobile-card-value">@row.CatalogItems / @Html.Raw(LimitDisplay(row.MaxCatalogItems))</span>
</div> </div>
</div> </div>
<div class="mobile-card-footer"> <div class="mobile-card-footer">
@@ -123,13 +123,13 @@
} }
</td> </td>
<td> <td>
<span class="path-badge text-muted" title="@u.CurrentPath">@(u.CurrentPath ?? "&mdash;")</span> <span class="path-badge text-muted" title="@u.CurrentPath">@Html.Raw(u.CurrentPath ?? "&mdash;")</span>
</td> </td>
<td> <td>
<div class="mb-1 small text-muted">@secsAgo s ago</div> <div class="mb-1 small text-muted">@secsAgo s ago</div>
<div class="last-seen-bar" style="width:@barPct%"></div> <div class="last-seen-bar" style="width:@barPct%"></div>
</td> </td>
<td class="small text-muted">@(u.IpAddress ?? "&mdash;")</td> <td class="small text-muted">@Html.Raw(u.IpAddress ?? "&mdash;")</td>
</tr> </tr>
} }
</tbody> </tbody>
@@ -154,7 +154,7 @@
<div class="mobile-card-body"> <div class="mobile-card-body">
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Company</span> <span class="mobile-card-label">Company</span>
<span class="mobile-card-value">@(u.CompanyName ?? "&mdash;")</span> <span class="mobile-card-value">@Html.Raw(u.CompanyName ?? "&mdash;")</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Role</span> <span class="mobile-card-label">Role</span>
@@ -167,7 +167,7 @@
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Page</span> <span class="mobile-card-label">Page</span>
<span class="mobile-card-value small text-muted" style="font-family:monospace">@(u.CurrentPath ?? "&mdash;")</span> <span class="mobile-card-value small text-muted" style="font-family:monospace">@Html.Raw(u.CurrentPath ?? "&mdash;")</span>
</div> </div>
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Last Seen</span> <span class="mobile-card-label">Last Seen</span>
@@ -205,7 +205,7 @@
<td> <td>
<a asp-controller="Bills" asp-action="Details" asp-route-id="@bill.Id">@bill.BillNumber</a> <a asp-controller="Bills" asp-action="Details" asp-route-id="@bill.Id">@bill.BillNumber</a>
</td> </td>
<td class="text-muted small">@(bill.DueDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td> <td class="text-muted small">@Html.Raw(bill.DueDate?.ToString("MMM d, yyyy") ?? "&mdash;")</td>
<td class="text-end">@bill.BalanceDue.ToString("C")</td> <td class="text-end">@bill.BalanceDue.ToString("C")</td>
<td class="text-end" style="width:150px"> <td class="text-end" style="width:150px">
<form asp-action="Apply" method="post" class="d-inline"> <form asp-action="Apply" method="post" class="d-inline">
@@ -106,7 +106,7 @@
<div class="mobile-card-row"> <div class="mobile-card-row">
<span class="mobile-card-label">Remaining</span> <span class="mobile-card-label">Remaining</span>
<span class="mobile-card-value @(vc.RemainingAmount > 0 ? "text-success fw-semibold" : "text-muted")"> <span class="mobile-card-value @(vc.RemainingAmount > 0 ? "text-success fw-semibold" : "text-muted")">
@(vc.RemainingAmount > 0 ? vc.RemainingAmount.ToString("C") : "&mdash;") @Html.Raw(vc.RemainingAmount > 0 ? vc.RemainingAmount.ToString("C") : "&mdash;")
</span> </span>
</div> </div>
@if (!string.IsNullOrWhiteSpace(vc.Memo)) @if (!string.IsNullOrWhiteSpace(vc.Memo))
@@ -70,9 +70,9 @@
<td> <td>
<strong>@vendor.CompanyName</strong> <strong>@vendor.CompanyName</strong>
</td> </td>
<td>@(vendor.ContactName ?? "&mdash;")</td> <td>@Html.Raw(vendor.ContactName ?? "&mdash;")</td>
<td>@(vendor.Phone ?? "&mdash;")</td> <td>@Html.Raw(vendor.Phone ?? "&mdash;")</td>
<td>@(vendor.Email ?? "&mdash;")</td> <td>@Html.Raw(vendor.Email ?? "&mdash;")</td>
<td> <td>
@if (vendor.InventoryItemCount > 0) @if (vendor.InventoryItemCount > 0)
{ {