Files
PowderCoatingLogix/src/PowderCoating.Web/Views/Expenses/Index.cshtml
T
spouliot 21b39161a3 Fix encoding corruption in Bills and Expenses views
Replace literal Unicode chars (em dash, ellipsis, angle quotes, box-drawing)
with HTML entities to prevent corruption from AI tools and Windows encoding.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 17:06:31 -04:00

123 lines
5.3 KiB
Plaintext

@model List<PowderCoating.Application.DTOs.Accounting.ExpenseListDto>
@{
ViewData["Title"] = "Expenses";
ViewData["PageIcon"] = "bi-receipt";
ViewData["PageHelpTitle"] = "Expenses";
ViewData["PageHelpContent"] = "Expenses are direct purchases paid immediately (credit card, cash, debit). Use Bills instead when you receive a vendor invoice now but pay later. Each expense posts to an expense account and reduces a payment account. Optionally link to a Vendor and Job for detailed cost tracking.";
}
<div class="d-flex justify-content-end mb-4">
<a asp-action="Create" class="btn btn-primary">
<i class="bi bi-plus-lg me-1"></i>New Expense
</a>
</div>
@if (TempData["Success"] != null)
{
<div class="alert alert-success alert-dismissible fade show">
<i class="bi bi-check-circle me-2"></i>@TempData["Success"]
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@if ((decimal)ViewBag.TotalAmount > 0)
{
<div class="alert alert-info alert-permanent d-flex align-items-center gap-2 mb-4">
<i class="bi bi-info-circle fs-5"></i>
<span>Total shown: <strong>@(((decimal)ViewBag.TotalAmount).ToString("C"))</strong></span>
</div>
}
<div class="card shadow-sm mb-3">
<div class="card-body py-2">
<form method="get" class="row g-2 align-items-end">
<div class="col-md-3">
<input type="search" name="search" value="@ViewBag.Search" class="form-control"
placeholder="Search memo or vendor&hellip;" />
</div>
<div class="col-md-3">
<select name="accountId" class="form-select">
<option value="">All Expense Accounts</option>
@foreach (var item in (IEnumerable<Microsoft.AspNetCore.Mvc.Rendering.SelectListItem>)ViewBag.AccountFilter)
{
<option value="@item.Value" selected="@(ViewBag.AccountId?.ToString() == item.Value)">@item.Text</option>
}
</select>
</div>
<div class="col-md-2">
<input type="date" name="from" value="@ViewBag.From" class="form-control" title="From date" />
</div>
<div class="col-md-2">
<input type="date" name="to" value="@ViewBag.To" class="form-control" title="To date" />
</div>
<div class="col-auto">
<button type="submit" class="btn btn-outline-primary"><i class="bi bi-search me-1"></i>Filter</button>
<a asp-action="Index" class="btn btn-outline-secondary ms-1">Clear</a>
</div>
</form>
</div>
</div>
@if (Model.Any())
{
<div class="card shadow-sm">
<div class="card-body p-0">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Expense #</th>
<th>Date</th>
<th>Vendor</th>
<th>Account</th>
<th>Paid From</th>
<th>Method</th>
<th>Job</th>
<th>Memo</th>
<th class="text-end">Amount</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var exp in Model)
{
<tr>
<td>
<a asp-action="Details" asp-route-id="@exp.Id" class="fw-medium text-decoration-none">
@exp.ExpenseNumber
</a>
</td>
<td>@exp.Date.ToString("MMM d, yyyy")</td>
<td>@exp.VendorName</td>
<td>
<span class="text-muted small">@exp.ExpenseAccountNumber</span> @exp.ExpenseAccountName
</td>
<td><span class="text-muted small">@exp.PaymentAccountName</span></td>
<td>@exp.PaymentMethod</td>
<td>@exp.JobNumber</td>
<td><span class="text-muted small">@exp.Memo</span></td>
<td class="text-end fw-medium">@exp.Amount.ToString("C")</td>
<td>
<a asp-action="Details" asp-route-id="@exp.Id" class="btn btn-sm btn-outline-primary me-1">
<i class="bi bi-eye"></i>
</a>
<a asp-action="Edit" asp-route-id="@exp.Id" class="btn btn-sm btn-outline-secondary">
<i class="bi bi-pencil"></i>
</a>
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
}
else
{
<div class="text-center py-5">
<i class="bi bi-receipt-cutoff display-3 text-muted"></i>
<p class="mt-3 text-muted">No expenses found. Record your first expense to get started.</p>
<a asp-action="Create" class="btn btn-primary mt-2"><i class="bi bi-plus-lg me-1"></i>New Expense</a>
</div>
}