Sweep all .cshtml files for encoding corruption; add pre-commit guard
Replace all corruption variants with HTML entities across 226 view files: - 3-char UTF-8-as-Win1252 sequences (ae-corruption) - Standalone smart/curly quotes that break C# Razor expressions - Partially re-corrupted variants where the 3rd byte was normalised to ASCII tools/Fix-Encoding.ps1: re-runnable sweep; uses [char] code points so the script itself never contains a literal non-ASCII character; supports -DryRun .githooks/pre-commit: blocks commits containing the ae-corruption byte signature (xc3xa2xe2x82xac); git core.hooksPath = .githooks so the hook is repo-committed and active for all future work on this machine. Build clean; 225 unit tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
@model PowderCoating.Application.DTOs.Accounting.CreateAccountDto
|
||||
@model PowderCoating.Application.DTOs.Accounting.CreateAccountDto
|
||||
@using PowderCoating.Core.Enums
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "New Account";
|
||||
ViewData["PageIcon"] = "bi-journal-plus";
|
||||
ViewData["PageHelpTitle"] = "New Account";
|
||||
ViewData["PageHelpContent"] = "Add a custom account to the Chart of Accounts. Select a Sub-Type first — it auto-sets the Account Type. Use conventional numbering: 1000s = Assets, 2000s = Liabilities, 3000s = Equity, 4000s = Revenue, 5000s = Cost of Goods, 6000s+ = Expenses.";
|
||||
ViewData["PageHelpContent"] = "Add a custom account to the Chart of Accounts. Select a Sub-Type first — it auto-sets the Account Type. Use conventional numbering: 1000s = Assets, 2000s = Liabilities, 3000s = Equity, 4000s = Revenue, 5000s = Cost of Goods, 6000s+ = Expenses.";
|
||||
bool isInline = ViewBag.Inline == true;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
<a tabindex="0" class="help-icon" role="button"
|
||||
data-bs-toggle="popover" data-bs-placement="right" data-bs-trigger="focus"
|
||||
data-bs-title="Account Number"
|
||||
data-bs-content="A numeric code for sorting and organizing accounts. Convention: 1000–1999 Assets, 2000–2999 Liabilities, 3000–3999 Equity, 4000–4999 Revenue, 5000–5999 Cost of Goods, 6000–9999 Expenses. Must be unique. Sub-accounts can use decimals (e.g. 6100.1).">
|
||||
data-bs-content="A numeric code for sorting and organizing accounts. Convention: 1000–1999 Assets, 2000–2999 Liabilities, 3000–3999 Equity, 4000–4999 Revenue, 5000–5999 Cost of Goods, 6000–9999 Expenses. Must be unique. Sub-accounts can use decimals (e.g. 6100.1).">
|
||||
<i class="bi bi-question-circle"></i>
|
||||
</a>
|
||||
</div>
|
||||
@@ -55,7 +55,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<select asp-for="AccountType" asp-items="ViewBag.AccountTypes" class="form-select" id="accountTypeSelect">
|
||||
<option value="">— Select Type —</option>
|
||||
<option value="">— Select Type —</option>
|
||||
</select>
|
||||
<span asp-validation-for="AccountType" class="text-danger small"></span>
|
||||
</div>
|
||||
@@ -70,7 +70,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<select asp-for="AccountSubType" asp-items="ViewBag.AccountSubTypes" class="form-select" id="accountSubTypeSelect">
|
||||
<option value="">— Select Sub-Type —</option>
|
||||
<option value="">— Select Sub-Type —</option>
|
||||
</select>
|
||||
<span asp-validation-for="AccountSubType" class="text-danger small"></span>
|
||||
<div class="form-text text-primary" id="typeAutoSetHint" style="display:none">
|
||||
@@ -89,12 +89,12 @@
|
||||
<a tabindex="0" class="help-icon" role="button"
|
||||
data-bs-toggle="popover" data-bs-placement="right" data-bs-trigger="focus"
|
||||
data-bs-title="Parent Account"
|
||||
data-bs-content="Nest this account under a parent to create a hierarchy — e.g. 'Powder Costs' under 'Cost of Goods Sold'. Sub-accounts roll up into their parent on financial reports. Most accounts work fine without a parent.">
|
||||
data-bs-content="Nest this account under a parent to create a hierarchy — e.g. 'Powder Costs' under 'Cost of Goods Sold'. Sub-accounts roll up into their parent on financial reports. Most accounts work fine without a parent.">
|
||||
<i class="bi bi-question-circle"></i>
|
||||
</a>
|
||||
</div>
|
||||
<select asp-for="ParentAccountId" asp-items="ViewBag.ParentAccounts" class="form-select">
|
||||
<option value="">— None (top-level account) —</option>
|
||||
<option value="">— None (top-level account) —</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
// SubType enum values → AccountType enum values (mirrors server-side mapping)
|
||||
// SubType enum values â†' AccountType enum values (mirrors server-side mapping)
|
||||
const subTypeToAccountType = {
|
||||
8: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, // Assets
|
||||
10: 2, 11: 2, 12: 2, 13: 2, // Liabilities
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
@model PowderCoating.Application.DTOs.Accounting.EditAccountDto
|
||||
@model PowderCoating.Application.DTOs.Accounting.EditAccountDto
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Edit Account";
|
||||
ViewData["PageIcon"] = "bi-pencil-square";
|
||||
ViewData["PageHelpTitle"] = "Edit Account";
|
||||
ViewData["PageHelpContent"] = "You can change number, name, type, sub-type, parent, and opening balance. Changing the account type or sub-type on an account that already has transactions is allowed but use caution — it changes how balances are reported going forward. Inactive accounts are hidden from pickers but preserved in history.";
|
||||
ViewData["PageHelpContent"] = "You can change number, name, type, sub-type, parent, and opening balance. Changing the account type or sub-type on an account that already has transactions is allowed but use caution — it changes how balances are reported going forward. Inactive accounts are hidden from pickers but preserved in history.";
|
||||
}
|
||||
|
||||
<div class="d-flex justify-content-start mb-4">
|
||||
@@ -27,7 +27,7 @@
|
||||
<a tabindex="0" class="help-icon" role="button"
|
||||
data-bs-toggle="popover" data-bs-placement="right" data-bs-trigger="focus"
|
||||
data-bs-title="Account Number"
|
||||
data-bs-content="A numeric code for sorting and organizing accounts. Convention: 1000–1999 Assets, 2000–2999 Liabilities, 3000–3999 Equity, 4000–4999 Revenue, 5000–5999 Cost of Goods, 6000–9999 Expenses. Must be unique.">
|
||||
data-bs-content="A numeric code for sorting and organizing accounts. Convention: 1000–1999 Assets, 2000–2999 Liabilities, 3000–3999 Equity, 4000–4999 Revenue, 5000–5999 Cost of Goods, 6000–9999 Expenses. Must be unique.">
|
||||
<i class="bi bi-question-circle"></i>
|
||||
</a>
|
||||
</div>
|
||||
@@ -81,12 +81,12 @@
|
||||
<a tabindex="0" class="help-icon" role="button"
|
||||
data-bs-toggle="popover" data-bs-placement="right" data-bs-trigger="focus"
|
||||
data-bs-title="Parent Account"
|
||||
data-bs-content="Nest this account under a parent to create a hierarchy — e.g. 'Powder Costs' under 'Cost of Goods Sold'. Sub-accounts roll up into their parent on financial reports. Most accounts work fine without a parent.">
|
||||
data-bs-content="Nest this account under a parent to create a hierarchy — e.g. 'Powder Costs' under 'Cost of Goods Sold'. Sub-accounts roll up into their parent on financial reports. Most accounts work fine without a parent.">
|
||||
<i class="bi bi-question-circle"></i>
|
||||
</a>
|
||||
</div>
|
||||
<select asp-for="ParentAccountId" asp-items="ViewBag.ParentAccounts" class="form-select">
|
||||
<option value="">— None —</option>
|
||||
<option value="">— None —</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@* Bootstrap toast — confirmation before recalculating balances *@
|
||||
@* Bootstrap toast — confirmation before recalculating balances *@
|
||||
<div class="toast-container position-fixed top-50 start-50 translate-middle p-3" style="z-index:1100">
|
||||
<div id="recalcConfirmToast" class="toast align-items-center border-0 bg-dark text-white" role="alert" aria-atomic="true" data-bs-autohide="false">
|
||||
<div class="toast-body d-flex flex-column gap-2 py-3 px-3">
|
||||
@@ -153,7 +153,7 @@
|
||||
<span class="fw-medium">@acct.Name</span>
|
||||
@if (acct.IsSystem)
|
||||
{
|
||||
<span class="badge bg-secondary ms-1" title="System account — cannot be deleted">sys</span>
|
||||
<span class="badge bg-secondary ms-1" title="System account — cannot be deleted">sys</span>
|
||||
}
|
||||
</td>
|
||||
<td><span class="text-muted small">@acct.AccountSubType.ToDisplayName()</span></td>
|
||||
@@ -186,7 +186,7 @@
|
||||
@if (!acct.IsSystem)
|
||||
{
|
||||
<form asp-action="Delete" asp-route-id="@acct.Id" method="post" class="d-inline"
|
||||
onsubmit="return confirm('Delete account @acct.AccountNumber – @acct.Name?')">
|
||||
onsubmit="return confirm('Delete account @acct.AccountNumber – @acct.Name?')">
|
||||
@Html.AntiForgeryToken()
|
||||
<button type="submit" class="btn btn-sm btn-outline-danger" title="Delete">
|
||||
<i class="bi bi-trash"></i>
|
||||
@@ -219,7 +219,7 @@
|
||||
});
|
||||
});
|
||||
|
||||
// Recalculate Balances — show confirmation toast instead of native confirm()
|
||||
// Recalculate Balances — show confirmation toast instead of native confirm()
|
||||
const recalcToast = new bootstrap.Toast(document.getElementById('recalcConfirmToast'));
|
||||
|
||||
document.getElementById('btnRecalcBalances').addEventListener('click', () => {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
@using PowderCoating.Core.Enums
|
||||
|
||||
@{
|
||||
ViewData["Title"] = $"Ledger — {Model.AccountNumber} {Model.Name}";
|
||||
ViewData["Title"] = $"Ledger — {Model.AccountNumber} {Model.Name}";
|
||||
ViewData["PageIcon"] = "bi-journal-text";
|
||||
ViewData["PageHelpTitle"] = "Account Ledger";
|
||||
ViewData["PageHelpContent"] = "A chronological list of every transaction posted to this account. Click any Reference to open the source record. Debit increases asset and expense accounts; credit increases liability, equity, and revenue accounts. Use the date range or quick buttons (This Month, YTD, etc.) to narrow the view.";
|
||||
@@ -60,7 +60,7 @@
|
||||
<nav aria-label="breadcrumb" class="mb-3">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a asp-action="Index">Chart of Accounts</a></li>
|
||||
<li class="breadcrumb-item active">@Model.AccountNumber – @Model.Name</li>
|
||||
<li class="breadcrumb-item active">@Model.AccountNumber – @Model.Name</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
<i class="bi bi-journal-text me-1"></i>
|
||||
Transactions
|
||||
<span class="text-muted fw-normal small ms-1">
|
||||
@Model.From.ToString("MMM d") – @Model.To.ToString("MMM d, yyyy")
|
||||
@Model.From.ToString("MMM d") – @Model.To.ToString("MMM d, yyyy")
|
||||
</span>
|
||||
</span>
|
||||
<a tabindex="0" class="help-icon" role="button"
|
||||
@@ -205,7 +205,7 @@
|
||||
<!-- Opening balance row -->
|
||||
<tr class="table-light">
|
||||
<td class="text-muted small">@Model.From.ToString("MM/dd/yyyy")</td>
|
||||
<td><span class="fw-medium text-muted">—</span></td>
|
||||
<td><span class="fw-medium text-muted">—</span></td>
|
||||
<td><span class="badge bg-dark-subtle text-dark">Opening Balance</span></td>
|
||||
<td class="text-muted small">Balance brought forward as of @Model.From.ToString("MMM d, yyyy")</td>
|
||||
<td></td>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@using PowderCoating.Core.Entities
|
||||
@using PowderCoating.Core.Entities
|
||||
@{
|
||||
ViewData["Title"] = "Year-End Close";
|
||||
ViewData["PageIcon"] = "bi-calendar-check";
|
||||
@@ -33,7 +33,7 @@
|
||||
<div class="alert alert-warning alert-permanent py-2 mb-4">
|
||||
<i class="bi bi-exclamation-triangle me-2"></i>
|
||||
<strong>What this does:</strong> Posts a Journal Entry dated December 31 that zeroes all Revenue
|
||||
and Expense account balances into Retained Earnings — the standard accounting close.
|
||||
and Expense account balances into Retained Earnings — the standard accounting close.
|
||||
Run this <strong>after</strong> all entries for the year are posted and the period is locked.
|
||||
A year can only be closed once.
|
||||
</div>
|
||||
@@ -99,7 +99,7 @@
|
||||
<tr>
|
||||
<td class="fw-bold">@c.ClosedYear</td>
|
||||
<td>@c.ClosedAt.ToLocalTime().ToString("MM/dd/yyyy h:mm tt")</td>
|
||||
<td>@(c.ClosedBy ?? "—")</td>
|
||||
<td>@(c.ClosedBy ?? "—")</td>
|
||||
<td>
|
||||
@if (c.JournalEntry != null)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user