Initial commit

This commit is contained in:
2026-04-23 21:38:24 -04:00
commit 63e12a9636
1762 changed files with 1672620 additions and 0 deletions
@@ -0,0 +1,288 @@
@{
ViewData["Title"] = "Accounts Payable";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Accounts Payable</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Accounts Payable (AP) tracks money your shop owes to vendors. When you receive a vendor invoice
for supplies, services, or equipment, you record it in the system as a <strong>bill</strong>.
The system tracks each bill's status, due date, and outstanding balance so you always know what
you owe and when it is due.
</p>
<p>
When you make a payment to a vendor, you record it against the bill and the balance reduces.
This gives you a clear, real-time picture of your upcoming financial obligations and helps you
avoid late payments — and the late fees or strained vendor relationships that come with them.
</p>
<p>
Bills can be created manually or generated automatically from a received Purchase Order.
Creating bills from POs saves time and eliminates the risk of data entry errors. You can find
Accounts Payable under <strong>Accounting &rsaquo; Bills</strong> in the left sidebar.
</p>
</section>
<section id="creating-a-bill" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Creating a Bill
</h2>
<h3 class="h6 fw-semibold mt-3 mb-2">From a Purchase Order (recommended)</h3>
<p>
The fastest and most accurate way to create a bill is from a received Purchase Order. Open the
received PO and click <strong>Create Bill</strong>. The system generates a bill pre-filled with
all line items, quantities, and prices from the PO — linked to the vendor and expense accounts
automatically. See the <a asp-controller="Help" asp-action="PurchaseOrders">Purchase Orders help page</a>
for step-by-step instructions.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Manually</h3>
<p>
To create a bill that is not linked to a PO — for example, a utility bill, a service invoice,
or a vendor charge that arrived without a matching order:
</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Accounting &rsaquo; Bills</strong> and click <strong>New Bill</strong>.</li>
<li class="mb-2">Select the <strong>Vendor</strong>. The vendor's default expense account and payment terms are applied automatically.</li>
<li class="mb-2">Enter the <strong>Bill Date</strong> (the date on the vendor's invoice) and the <strong>Due Date</strong> (calculated from payment terms, but you can override it).</li>
<li class="mb-2">Enter the vendor's own <strong>Reference Number</strong> (their invoice number) so you can cross-reference it if the vendor contacts you.</li>
<li class="mb-2">
Add one or more <strong>line items</strong>:
<ul class="mt-1">
<li><strong>Expense Account</strong> — the accounting category this cost belongs to (e.g., Cost of Goods Sold, Shop Supplies, Equipment Maintenance).</li>
<li><strong>Description</strong> — a brief note about what this line covers.</li>
<li><strong>Quantity</strong> and <strong>Unit Price</strong>.</li>
</ul>
</li>
<li class="mb-2">Add any internal <strong>Notes</strong>.</li>
<li class="mb-2">Click <strong>Save Bill</strong>. The bill is saved as a Draft.</li>
</ol>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Draft bills are not yet in your AP ledger. They do not affect your reported AP balance until
you mark them as <strong>Open</strong>. This gives you time to review and verify a bill before
it becomes an official obligation.
</div>
</div>
</section>
<section id="bill-statuses" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-tag text-primary me-2"></i>Bill Statuses
</h2>
<p>
Bills move through the following statuses as they are processed and paid.
</p>
<div class="table-responsive">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width:25%">Status</th>
<th>What it means</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-secondary">Draft</span></td>
<td>The bill has been entered but not yet verified or posted. It is not in the AP ledger and does not affect your reported AP balance. Can be edited freely.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Open</span></td>
<td>The bill has been verified, posted to the AP ledger, and the balance is officially owed to the vendor. Appears in your AP balance and aging reports.</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark">Partially Paid</span></td>
<td>At least one payment has been recorded against the bill but the full balance has not been settled.</td>
</tr>
<tr>
<td><span class="badge bg-success">Paid</span></td>
<td>The full bill amount has been paid. The balance is zero and the bill is closed.</td>
</tr>
<tr>
<td><span class="badge bg-secondary">Voided</span></td>
<td>The bill was cancelled before payment. Voided bills are kept for record-keeping but do not affect your AP balance.</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="marking-open" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-check-circle text-primary me-2"></i>Marking a Bill as Open
</h2>
<p>
When you have verified that a bill is accurate — it matches the goods you received and the
prices you agreed on — you mark it as Open to post it to your AP ledger.
</p>
<ol class="mb-3">
<li class="mb-2">Open the Draft bill from <strong>Accounting &rsaquo; Bills</strong>.</li>
<li class="mb-2">Review all line items, the vendor reference number, the bill date, and the due date.</li>
<li class="mb-2">Click <strong>Mark as Open</strong>.</li>
<li class="mb-2">The bill status changes to Open and the balance is now included in your total AP balance.</li>
</ol>
<p>
From an accounting perspective, marking a bill as Open records the following entries:
</p>
<ul class="mb-3">
<li>Debits the expense account(s) specified on the bill lines (e.g., Cost of Goods Sold)</li>
<li>Credits Accounts Payable for the total amount owed</li>
</ul>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
Once a bill is marked as Open, its line items are locked for editing. If you discover an
error after marking Open, contact your bookkeeper before making any adjustments. Incorrect
changes can affect your financial statements.
</div>
</div>
</section>
<section id="recording-payments" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-cash-coin text-primary me-2"></i>Recording a Payment
</h2>
<p>
When you pay a vendor — whether in full or as a partial payment — you record the payment against
the open bill. The system supports multiple partial payments on a single bill.
</p>
<ol class="mb-3">
<li class="mb-2">Open the Open or Partially Paid bill from <strong>Accounting &rsaquo; Bills</strong>.</li>
<li class="mb-2">Click <strong>Record Payment</strong>.</li>
<li class="mb-2">
Enter the payment details:
<ul class="mt-1">
<li><strong>Amount</strong> — how much you are paying now. Can be less than the full balance for partial payments.</li>
<li><strong>Payment Method</strong> — Check, ACH / Bank Transfer, Credit Card, Cash, or Wire Transfer.</li>
<li><strong>Payment Date</strong> — the date the payment was made or will be made.</li>
<li><strong>Reference Number</strong> — check number, wire confirmation, or ACH batch ID. Always fill this in for non-cash payments to simplify reconciliation.</li>
<li><strong>Notes</strong> — any additional information about this payment.</li>
</ul>
</li>
<li class="mb-2">Click <strong>Save Payment</strong>.</li>
</ol>
<p>
The bill status updates automatically to <strong>Partially Paid</strong> if a balance remains,
or <strong>Paid</strong> if the full amount has been settled. From an accounting perspective,
paying a bill debits Accounts Payable and credits your bank or cash account for the amount paid.
</p>
</section>
<section id="ai-receipt-scanning" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-robot text-primary me-2"></i>AI Receipt Scanning
</h2>
<p>
Instead of manually entering a vendor bill, you can upload a photo or PDF of the vendor's
paper invoice and let AI extract the details automatically.
</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Accounting &rsaquo; Bills</strong> and click <strong>Scan Receipt</strong>.</li>
<li class="mb-2">Upload a photo (JPG/PNG) or a PDF of the vendor's invoice.</li>
<li class="mb-2">The AI reads the document and pre-fills the vendor, bill date, line items, and amounts into a new draft bill.</li>
<li class="mb-2">Review the extracted data — correct any fields that were misread — and save the bill.</li>
</ol>
<p>
The uploaded file is automatically attached to the bill so you always have the original
document on record.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
AI extraction accuracy depends on image quality. For best results, use a well-lit photo
with the full invoice visible and no obstructions. Always review the extracted values
before saving.
</div>
</div>
</section>
<section id="smart-account-categorization" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-tags text-primary me-2"></i>Smart Account Categorization
</h2>
<p>
When entering line items on a bill, the system can suggest the correct expense account for
each line based on the description. After you type or paste a line description and move to
the next field, AI analyzes the text and suggests the most likely account (e.g., "powder
coating materials" → Cost of Goods Sold).
</p>
<p>
You can accept the suggestion or override it with any account from your chart of accounts.
Suggestions are non-binding and do not change anything until you save the bill.
</p>
</section>
<section id="expense-accounts" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-folder2-open text-primary me-2"></i>Expense Accounts
</h2>
<p>
Each line item on a bill must be assigned to an <strong>expense account</strong> — an accounting
category that determines where the cost appears in your financial reports. Common expense accounts
used in a powder coating shop include:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Cost of Goods Sold (COGS)</strong> — raw materials, powder coatings, and consumables that go directly into jobs.</li>
<li class="mb-1"><strong>Shop Supplies</strong> — items used in the shop that are not directly tied to a specific job (masking tape, gloves, cleaning solvents).</li>
<li class="mb-1"><strong>Equipment Maintenance</strong> — service, repairs, and parts for your oven, sandblaster, and coating booths.</li>
<li class="mb-1"><strong>Utilities</strong> — gas, electricity, and water bills that power the shop.</li>
<li class="mb-1"><strong>Rent / Occupancy</strong> — monthly rent or lease payments for your shop premises.</li>
<li class="mb-1"><strong>Operating Expenses</strong> — general overhead that does not fit another specific category.</li>
</ul>
<p>
The <strong>vendor's default expense account</strong> is set on the vendor record and pre-fills
each new bill line automatically. For example, if your powder supplier is linked to COGS, every
bill line from that vendor starts with COGS selected. You can override the account on any
individual line item as needed.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
Expense accounts are defined in <strong>Settings &rsaquo; Chart of Accounts</strong>.
If you are unsure which account to use for a particular cost, ask your accountant or
bookkeeper before posting the bill. Using the wrong account affects your Profit &amp; Loss
report and can complicate your year-end. See the
<a asp-controller="Help" asp-action="Settings">Settings help page</a> for information
on managing your chart of accounts.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#creating-a-bill">Creating a Bill</a>
<a class="nav-link py-1 px-3 small text-body" href="#bill-statuses">Bill Statuses</a>
<a class="nav-link py-1 px-3 small text-body" href="#marking-open">Marking a Bill as Open</a>
<a class="nav-link py-1 px-3 small text-body" href="#recording-payments">Recording a Payment</a>
<a class="nav-link py-1 px-3 small text-body" href="#ai-receipt-scanning">AI Receipt Scanning</a>
<a class="nav-link py-1 px-3 small text-body" href="#smart-account-categorization">Smart Categorization</a>
<a class="nav-link py-1 px-3 small text-body" href="#expense-accounts">Expense Accounts</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,241 @@
@{
ViewData["Title"] = "Customers";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Customers</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
The Customers section is the starting point for all work in the shop. Every quote, job, and invoice
belongs to a customer record. Keeping your customer list accurate and up to date ensures you can
quickly pull up a customer's full history — all their past jobs, outstanding quotes, and unpaid
invoices in one place.
</p>
<p>
You can find Customers under <strong>Operations &rsaquo; Customers</strong> in the left sidebar.
The list is searchable and sortable. Use the search box at the top of the list to find a customer
by name, email, or phone number.
</p>
</section>
<section id="customer-types" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-diagram-2 text-primary me-2"></i>Customer Types
</h2>
<p>
When creating a customer you must choose one of two types. This affects how the customer appears
in reports and how pricing tiers are applied.
</p>
<div class="row g-3">
<div class="col-md-6">
<div class="card border-primary border-opacity-25 h-100">
<div class="card-header bg-primary bg-opacity-10 fw-semibold">
<i class="bi bi-building me-1"></i> Commercial
</div>
<div class="card-body">
<p class="card-text small mb-0">
Use this for businesses — auto body shops, fabricators, manufacturers, or any company
that sends you work regularly. Commercial customers can have a <strong>pricing tier</strong>
applied (e.g., volume discounts) and a <strong>credit limit</strong> set. They typically
have a company name in addition to a contact person.
</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-secondary border-opacity-25 h-100">
<div class="card-header bg-secondary bg-opacity-10 fw-semibold">
<i class="bi bi-person me-1"></i> Non-Commercial
</div>
<div class="card-body">
<p class="card-text small mb-0">
Use this for individuals — homeowners who bring in patio furniture, hobbyists with
motorcycle parts, or anyone who is not representing a business. Non-commercial customers
typically do not have a company name and are priced at standard retail rates.
</p>
</div>
</div>
</div>
</div>
</section>
<section id="adding-a-customer" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-person-plus text-primary me-2"></i>Adding a Customer
</h2>
<p>Follow these steps to add a new customer:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Operations &rsaquo; Customers</strong> and click the <strong>New Customer</strong> button in the top-right corner.</li>
<li class="mb-2">Choose the <strong>Customer Type</strong> — Commercial or Non-Commercial.</li>
<li class="mb-2">
Fill in the customer details:
<ul class="mt-1">
<li><strong>Company Name</strong> — required for Commercial customers.</li>
<li><strong>Contact Name</strong> — the person you deal with day to day.</li>
<li><strong>Email</strong> — used for quote and invoice notifications.</li>
<li><strong>Phone</strong> — primary contact number.</li>
<li><strong>Address</strong> — billing and shipping address fields.</li>
</ul>
</li>
<li class="mb-2">For Commercial customers, optionally set a <strong>Pricing Tier</strong> and <strong>Credit Limit</strong>.</li>
<li class="mb-2">Add any <strong>Notes</strong> that your team should know about this customer (e.g., "Requires 48-hour advance notice before pickup").</li>
<li class="mb-2">Click <strong>Save Customer</strong>.</li>
</ol>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
You can also create a customer automatically when converting an approved prospect quote. The
system pre-fills the customer form with the prospect's details from the quote.
</div>
</div>
</section>
<section id="editing-a-customer" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-pencil text-primary me-2"></i>Editing a Customer
</h2>
<p>
To update a customer's details, find the customer in the list and click their name to open the
Details page. Then click the <strong>Edit</strong> button (pencil icon) in the top-right corner
of the details page.
</p>
<p>
You can also click the <i class="bi bi-pencil"></i> icon directly in the customer list to jump
straight to the edit form.
</p>
<p>
All fields can be updated at any time. Changes take effect immediately and are reflected on all
linked jobs, quotes, and invoices.
</p>
</section>
<section id="customer-details" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-card-text text-primary me-2"></i>Customer Details Page
</h2>
<p>
The Customer Details page is your hub for everything related to a single customer. Open it by
clicking a customer's name anywhere in the system.
</p>
<p>The details page shows:</p>
<ul>
<li><strong>Contact information</strong> — name, email, phone, and address.</li>
<li><strong>Account summary</strong> — current balance, credit limit, and pricing tier.</li>
<li>
<strong>Jobs tab</strong> — every job created for this customer, with status and date. Click
a job number to open it.
</li>
<li>
<strong>Quotes tab</strong> — all quotes sent to this customer, including pending and
historical quotes. Click a quote number to open it.
</li>
<li>
<strong>Invoices tab</strong> — all invoices with payment status. Quickly see who owes money
and how much.
</li>
<li>
<strong>Deposits tab</strong> — all deposits recorded for this customer across any job or quote.
</li>
<li><strong>Notes</strong> — any notes saved against the customer record.</li>
</ul>
</section>
<section id="credit-limit" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-credit-card text-primary me-2"></i>Credit Limit
</h2>
<p>
The credit limit is the maximum amount of unpaid invoices a commercial customer is allowed to carry
at one time. It is set on the customer record and displayed on the Customer Details page alongside
their current outstanding balance.
</p>
<p>
When a customer's outstanding balance approaches or exceeds their credit limit, the system displays
a warning flag on their record and on any new jobs or invoices you try to create for them. This is
a visual warning only — the system does not automatically block new work — but it gives your team
a clear signal to follow up on payment before starting more jobs.
</p>
<p>
If you do not want to set a credit limit, leave the field at <strong>0</strong> (the default), which
means no limit is enforced.
</p>
</section>
<section id="tax-exempt" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-patch-check text-primary me-2"></i>Tax Exempt Customers
</h2>
<p>
If a customer is tax exempt (e.g., a non-profit or a reseller with a valid exemption certificate),
check the <strong>Tax Exempt</strong> box on their customer record. You can also upload their
exemption certificate as an attachment for your records.
</p>
<p>
When a tax-exempt customer is selected on a new quote or invoice, the tax rate automatically
defaults to <strong>0%</strong> — no manual adjustment needed. Tax-exempt customers are marked
with a ★ in the customer dropdown when creating quotes and invoices so your team can spot them
at a glance.
</p>
</section>
<section id="deactivating-a-customer" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-person-dash text-primary me-2"></i>Deactivating a Customer
</h2>
<p>
If a customer no longer does business with you, you can deactivate them rather than deleting them
outright. Deactivating keeps all their historical jobs, quotes, and invoices intact for your records,
but removes them from the active customer list so they do not clutter your search results.
</p>
<p>To deactivate a customer:</p>
<ol class="mb-3">
<li class="mb-1">Open the customer's Details page.</li>
<li class="mb-1">Click the <strong>Delete</strong> (or Deactivate) button.</li>
<li class="mb-1">Confirm the action in the dialog that appears.</li>
</ol>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
<strong>Note:</strong> Deactivation is a "soft delete." The customer's record and all linked data
are preserved in the database and visible to Administrators. The customer simply no longer appears
in standard searches and lists. Contact your administrator if you need a record fully restored.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#customer-types">Customer Types</a>
<a class="nav-link py-1 px-3 small text-body" href="#adding-a-customer">Adding a Customer</a>
<a class="nav-link py-1 px-3 small text-body" href="#editing-a-customer">Editing a Customer</a>
<a class="nav-link py-1 px-3 small text-body" href="#customer-details">Customer Details Page</a>
<a class="nav-link py-1 px-3 small text-body" href="#credit-limit">Credit Limit</a>
<a class="nav-link py-1 px-3 small text-body" href="#tax-exempt">Tax Exempt</a>
<a class="nav-link py-1 px-3 small text-body" href="#deactivating-a-customer">Deactivating a Customer</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,309 @@
@{
ViewData["Title"] = "Equipment & Maintenance";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Equipment &amp; Maintenance</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
The Equipment module lets you keep a full register of every piece of machinery in your shop —
curing ovens, sandblasters, coating booths, compressors, conveyors, and anything else you
rely on to do the work. Each equipment record includes its current operating status and a
complete maintenance log.
</p>
<p>
Keeping this information up to date pays off in two ways. First, your team always knows
which machines are available and which are down for service — preventing jobs from being
scheduled on equipment that is not ready. Second, the maintenance history gives you a
paper trail for warranty claims, insurance, and resale.
</p>
<p>
Find Equipment under <strong>Equipment</strong> in the left sidebar.
</p>
</section>
<section id="adding-equipment" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Adding Equipment
</h2>
<p>To add a piece of equipment to the system:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Equipment</strong> and click <strong>New Equipment</strong>.</li>
<li class="mb-2">
Fill in the equipment details:
<ul class="mt-1">
<li><strong>Name</strong> — a short, descriptive name (e.g., "Main Curing Oven" or "Blast Cabinet #2").</li>
<li><strong>Model / Serial Number</strong> — from the manufacturer's plate on the machine. Useful for warranty and service calls.</li>
<li><strong>Manufacturer</strong> — who made the equipment.</li>
<li><strong>Purchase Date</strong> — when your shop acquired it.</li>
<li><strong>Last Service Date</strong> — the date it was last professionally serviced or inspected.</li>
<li><strong>Next Service Due</strong> — when the next scheduled service is due. This triggers alerts on the Dashboard.</li>
<li><strong>Location</strong> — where in the shop the equipment is located (e.g., "Bay 1", "Back Room").</li>
<li><strong>Notes</strong> — any important operational notes, quirks, or warnings for the team.</li>
</ul>
</li>
<li class="mb-2">Set the initial <strong>Status</strong> (see below).</li>
<li class="mb-2">Click <strong>Save Equipment</strong>.</li>
</ol>
</section>
<section id="equipment-status" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-toggles text-primary me-2"></i>Equipment Status
</h2>
<p>
Every piece of equipment has a status that reflects its current condition. Update the status
whenever the equipment's situation changes — this keeps the Dashboard accurate and lets
supervisors quickly see what is available.
</p>
<div class="table-responsive">
<table class="table table-bordered align-middle">
<thead class="table-light">
<tr>
<th style="width:28%">Status</th>
<th>What it means</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-success fs-6 py-1 px-2"><i class="bi bi-check-circle me-1"></i>Operational</span></td>
<td>
The equipment is fully functional and available for use. This is the normal
day-to-day status for working machines.
</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark fs-6 py-1 px-2"><i class="bi bi-exclamation-triangle me-1"></i>Needs Maintenance</span></td>
<td>
The equipment is still operational but a maintenance task is overdue or a minor
issue has been flagged. The machine can still be used with caution, but maintenance
should be scheduled promptly to avoid a breakdown.
</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark fs-6 py-1 px-2"><i class="bi bi-wrench me-1"></i>Under Maintenance</span></td>
<td>
The equipment is currently being serviced or repaired and is <strong>not available</strong>
for production. Do not schedule jobs that require this equipment until its status
returns to Operational.
</td>
</tr>
<tr>
<td><span class="badge bg-danger fs-6 py-1 px-2"><i class="bi bi-x-circle me-1"></i>Out of Service</span></td>
<td>
The equipment has broken down or failed and cannot be used. A maintenance record
should be created immediately with a priority of High or Critical.
</td>
</tr>
<tr>
<td><span class="badge bg-secondary fs-6 py-1 px-2"><i class="bi bi-archive me-1"></i>Retired</span></td>
<td>
The equipment has been decommissioned and is no longer in service. It remains in
the system for historical records but is excluded from active listings and the
Dashboard.
</td>
</tr>
</tbody>
</table>
</div>
<p class="mt-3">
To update an equipment's status, open its Details page and click <strong>Edit</strong>, then
change the Status field. You can also log a maintenance record (see below), which can update
the status as part of the workflow.
</p>
</section>
<section id="maintenance-records" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-clipboard-check text-primary me-2"></i>Maintenance Records
</h2>
<p>
Every service, repair, inspection, or maintenance task performed on a piece of equipment should
be logged as a maintenance record. Over time this builds a complete service history that is
invaluable for troubleshooting recurring problems, planning replacements, and demonstrating
due diligence.
</p>
<p>To log a maintenance record:</p>
<ol class="mb-3">
<li class="mb-2">Open the equipment's Details page.</li>
<li class="mb-2">Click <strong>Add Maintenance Record</strong>.</li>
<li class="mb-2">
Fill in the details:
<ul class="mt-1">
<li><strong>Task Description</strong> — what was done or needs to be done (e.g., "Replace heating element", "Annual burner service", "Belt tension check").</li>
<li><strong>Type</strong> — choose <strong>Scheduled</strong> for planned preventive maintenance, or <strong>Corrective</strong> for repairs to fix a problem.</li>
<li><strong>Scheduled Date</strong> — when the task is planned for (or when it was done).</li>
<li><strong>Completion Date</strong> — leave blank if the task has not been done yet.</li>
<li><strong>Cost</strong> — what the service cost (parts, labor, contractor fees).</li>
<li><strong>Priority</strong> — how urgent this task is (see below).</li>
<li><strong>Assigned To</strong> — the shop worker responsible for this task.</li>
<li><strong>Notes</strong> — parts used, observations, instructions for next time.</li>
</ul>
</li>
<li class="mb-2">Click <strong>Save</strong>.</li>
</ol>
<p>
Open maintenance records (those without a completion date) appear on the Dashboard as upcoming
tasks. When the work is done, open the record and fill in the <strong>Completion Date</strong>
and any final notes to mark it as done.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Recurring Maintenance</h3>
<p>
For maintenance that happens on a regular schedule (e.g., monthly filter cleaning, quarterly
burner service), set the <strong>Recurrence</strong> field when creating the record — choose
from Daily, Weekly, Monthly, Quarterly, or Annually. When you complete the record, the system
automatically creates the next maintenance record at the appropriate interval. This ensures
preventive maintenance tasks never fall through the cracks.
</p>
</section>
<section id="maintenance-priority" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-flag text-primary me-2"></i>Maintenance Priority
</h2>
<p>
When creating a maintenance record, set the priority to reflect how urgently the task needs
to be completed. Priority affects how records are sorted on the Dashboard and in the
maintenance list.
</p>
<div class="row g-3">
<div class="col-md-6">
<div class="card border-secondary border-opacity-25 h-100">
<div class="card-body py-2 px-3">
<h6 class="mb-1"><span class="badge bg-secondary me-1">Low</span></h6>
<p class="small mb-0 text-muted">
Routine preventive tasks that can be scheduled at the next convenient opportunity.
Example: lubricate conveyor chain, clean filters.
</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-primary border-opacity-25 h-100">
<div class="card-body py-2 px-3">
<h6 class="mb-1"><span class="badge bg-primary me-1">Normal</span></h6>
<p class="small mb-0 text-muted">
Standard scheduled maintenance that should be completed within the planned
service window. Example: annual burner inspection, thermocouple calibration.
</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-warning border-opacity-25 h-100">
<div class="card-body py-2 px-3">
<h6 class="mb-1"><span class="badge bg-warning text-dark me-1">High</span></h6>
<p class="small mb-0 text-muted">
A developing problem that will cause a breakdown if not addressed soon. Production
should be monitored. Example: unusual vibration in the blaster motor, oven
not reaching set temperature.
</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-danger border-opacity-25 h-100">
<div class="card-body py-2 px-3">
<h6 class="mb-1"><span class="badge bg-danger me-1">Critical</span></h6>
<p class="small mb-0 text-muted">
Equipment is down or unsafe to operate. All work on this machine must stop
immediately. Example: oven element failure, electrical fault, safety switch
bypassed.
</p>
</div>
</div>
</div>
</div>
</section>
<section id="oven-scheduler" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-calendar-week text-primary me-2"></i>Oven Scheduler
</h2>
<p>
The <strong>Oven Scheduler</strong> (<a href="/OvenScheduler">/OvenScheduler</a>) lets you
group jobs into oven batches to maximize curing oven utilization. It uses your configured
Named Ovens (set up in <strong>Settings &rsaquo; Company Settings &rsaquo; Named Ovens</strong>)
to show available capacity in square feet as you add jobs to a batch.
</p>
<p>To use the Oven Scheduler:</p>
<ol class="mb-3">
<li class="mb-2">Go to the Oven Scheduler from the sidebar.</li>
<li class="mb-2">Select the oven you are loading.</li>
<li class="mb-2">Add jobs to the batch — the remaining capacity updates as you add items.</li>
<li class="mb-2">Progress batches through Loading → In Progress → Completed as work is done.</li>
</ol>
<p>
To configure your ovens for the scheduler, see
<a asp-controller="Help" asp-action="Settings" fragment="named-ovens">Settings &rsaquo; Named Ovens</a>.
</p>
</section>
<section id="assigning-maintenance" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-person-gear text-primary me-2"></i>Assigning Maintenance Tasks
</h2>
<p>
Each maintenance record can be assigned to one shop worker — typically someone in the
<strong>Maintenance</strong> role, or a <strong>Supervisor</strong> who will coordinate
with an outside service technician.
</p>
<p>
To assign a task, select the worker from the <strong>Assigned To</strong> dropdown when
creating or editing the maintenance record. Only active workers are listed.
</p>
<p>
Assigned tasks appear on the Dashboard grouped by worker, so supervisors can see their
team's maintenance workload at a glance. When a task is completed, the assigned worker
(or a manager) should update the completion date and any notes so the record reflects
exactly what was done and when.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
For work done by an outside contractor (e.g., a refrigeration technician servicing
your blast cabinet compressor), you can either create a temporary worker record for
the contractor or simply note their name and company in the <strong>Notes</strong>
field of the maintenance record.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#adding-equipment">Adding Equipment</a>
<a class="nav-link py-1 px-3 small text-body" href="#equipment-status">Equipment Status</a>
<a class="nav-link py-1 px-3 small text-body" href="#maintenance-records">Maintenance Records</a>
<a class="nav-link py-1 px-3 small text-body" href="#maintenance-priority">Maintenance Priority</a>
<a class="nav-link py-1 px-3 small text-body" href="#oven-scheduler">Oven Scheduler</a>
<a class="nav-link py-1 px-3 small text-body" href="#assigning-maintenance">Assigning Maintenance</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,347 @@
@{
ViewData["Title"] = "Getting Started";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Getting Started</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
This system is purpose-built to run a powder coating shop from end to end. At its core it helps you
track every job that comes through the door — from the first quote all the way through coating,
curing, quality check, and final delivery. Along the way it manages your customers, vendors,
inventory of powders and supplies, shop equipment, and the workers on your floor.
</p>
<p>
Everything is connected. When you create a quote for a customer and they approve it, you can convert
that quote into a job with a single click. When a job is invoiced, the customer's account balance
updates automatically. When powder is consumed on a job, the inventory count goes down. You always
have a clear picture of where work stands and what materials you have on hand.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Tip:</strong> Use the navigation sidebar on the left to jump between modules. The system
remembers where you left off in most list views, including any search filters you applied.
</div>
</div>
</section>
<section id="logging-in" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-box-arrow-in-right text-primary me-2"></i>Logging In
</h2>
<p>
Open the app in your browser and you will be taken to the login page. Enter your email address and
password, then click <strong>Sign In</strong>.
</p>
<ol class="mb-3">
<li class="mb-1">Enter the email address your administrator set up for you.</li>
<li class="mb-1">Enter your password. Passwords are case-sensitive.</li>
<li class="mb-1">Click <strong>Sign In</strong>. You will land on the Dashboard.</li>
</ol>
<h5 class="fw-semibold">First login — set your permanent password</h5>
<p>
When a new company account is created, the system generates a secure temporary password and emails
it to the address used during signup. The first time you log in with that temporary password, you
will be redirected to a <strong>Set Your Password</strong> page automatically.
</p>
<ol class="mb-3">
<li class="mb-1">Enter the temporary password from your welcome email.</li>
<li class="mb-1">Enter and confirm your new permanent password.</li>
<li class="mb-1">Click <strong>Set Password &amp; Continue</strong>.</li>
</ol>
<p>
You cannot access any other part of the application until this step is complete. Once done, the
temporary password is invalidated and you land directly on the Dashboard.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-3" role="alert">
<i class="bi bi-envelope-check-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Didn't receive the welcome email?</strong> Check your spam or junk folder first.
If it's still not there, contact your company administrator — they can reset your password
from the User Management section.
</div>
</div>
<h5 class="fw-semibold">Forgot your password?</h5>
<p>
On the login page, click the <strong>Forgot your password?</strong> link. Enter your email address
and the system will send you a reset link. Check your inbox (and spam folder) and follow the
instructions in the email. Reset links expire after a short time, so use them promptly.
</p>
<p>
If you do not receive an email or cannot log in, contact your company administrator — they can reset
your password from the User Management section.
</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-shield-lock flex-shrink-0 mt-1"></i>
<div>
<strong>Keep your password safe.</strong> Do not share your login details with anyone, even
co-workers. Every action in the system is logged with your account name.
</div>
</div>
</section>
<section id="navigating" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-compass text-primary me-2"></i>Navigating the System
</h2>
<p>
The left sidebar is your main navigation. It is divided into sections so related features are grouped
together. Click any item to go to that section. On smaller screens the sidebar collapses — tap the
menu icon at the top to open it.
</p>
<div class="table-responsive">
<table class="table table-bordered table-sm align-middle">
<thead class="table-light">
<tr>
<th style="width:30%">Section</th>
<th>What you will find there</th>
</tr>
</thead>
<tbody>
<tr>
<td><i class="bi bi-speedometer2 me-1 text-primary"></i><strong>Dashboard</strong></td>
<td>A live summary of today's jobs, outstanding quotes, low-stock alerts, equipment needing attention, and a daily tip.</td>
</tr>
<tr>
<td><i class="bi bi-briefcase me-1 text-primary"></i><strong>Operations</strong></td>
<td>Customers, Quotes, Jobs, Invoices, Appointments/Calendar, Job Priority Board, Gift Certificates, and Shop Workers — the day-to-day work of the shop.</td>
</tr>
<tr>
<td><i class="bi bi-box-seam me-1 text-primary"></i><strong>Inventory</strong></td>
<td>Catalog Items, Inventory Items, Vendors, and Purchase Orders.</td>
</tr>
<tr>
<td><i class="bi bi-bank me-1 text-primary"></i><strong>Accounting</strong></td>
<td>Bills (Accounts Payable), Chart of Accounts, and Accounting Export.</td>
</tr>
<tr>
<td><i class="bi bi-tools me-1 text-primary"></i><strong>Equipment</strong></td>
<td>Equipment records, Maintenance, Oven Scheduler, and Powder Insights.</td>
</tr>
<tr>
<td><i class="bi bi-bar-chart me-1 text-primary"></i><strong>Reports</strong></td>
<td>Financial summaries, AR aging, job performance, AI-powered analysis, cash flow forecasting, and more.</td>
</tr>
<tr>
<td><i class="bi bi-gear me-1 text-primary"></i><strong>Settings</strong></td>
<td>Company info, pricing rates, operating costs, Named Ovens, AI Profile, Pricing Tiers, User Management, and Billing. Visible to Admins and Managers.</td>
</tr>
</tbody>
</table>
</div>
<p class="mt-3">
The top bar shows your profile avatar, a <strong>notification bell</strong>, and a quick-search box.
Use the search box to find customers, jobs, or quotes by name or number without navigating through menus.
</p>
<p>
The <strong>notification bell</strong> (<i class="bi bi-bell-fill"></i>) alerts you to customer
actions in real time — a quote approved or declined online, an invoice or deposit paid online,
and any platform announcements from the Powder Coating Logix team. A red badge shows the count of
unread items. Click the bell to see recent notifications and navigate directly to the related record.
Notifications are stored persistently so you will not miss one if you were not logged in when it
arrived.
</p>
</section>
<section id="roles-and-permissions" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-shield-check text-primary me-2"></i>Roles and Permissions
</h2>
<p>
Every user is assigned a role that controls what they can see and do. Your administrator assigns
your role when they create your account. If you cannot access something you expect to, ask your
administrator — they may need to update your role.
</p>
<div class="table-responsive">
<table class="table table-bordered align-middle">
<thead class="table-light">
<tr>
<th style="width:18%">Role</th>
<th>What they can do</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<span class="badge bg-danger">Admin</span>
</td>
<td>
Full access to all features including user management, company settings, pricing
configuration, and all reports. Can create, edit, and delete any record. Should
be limited to the company owner or office manager.
</td>
</tr>
<tr>
<td>
<span class="badge bg-warning text-dark">Manager</span>
</td>
<td>
Can manage all operational data — customers, jobs, quotes, invoices, inventory,
equipment, and workers. Can view reports and adjust settings, but cannot manage
user accounts or change platform-level configuration.
</td>
</tr>
<tr>
<td>
<span class="badge bg-primary">Employee</span>
</td>
<td>
Can create and edit jobs and quotes, manage customers, and update inventory.
Cannot delete records, manage users, or access financial reports. Suited to
office staff who handle quoting and customer communication.
</td>
</tr>
<tr>
<td>
<span class="badge bg-info text-dark">Shop Floor</span>
</td>
<td>
Can view jobs assigned to them and update job status as work progresses (e.g.,
move a job from <em>Sandblasting</em> to <em>Cleaning</em>). Cannot create or
edit quotes, invoices, or customer records. Designed for workers on the floor
who only need to update what they are working on.
</td>
</tr>
<tr>
<td>
<span class="badge bg-secondary">Read Only</span>
</td>
<td>
View-only access to most parts of the system. Cannot create, edit, or delete
any records. Useful for accountants or auditors who need visibility but should
not make changes.
</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="your-first-steps" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-list-check text-primary me-2"></i>Your First Steps
</h2>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-3" role="alert">
<i class="bi bi-magic flex-shrink-0 mt-1"></i>
<div>
<strong>New to the system?</strong> Use the <a href="/SetupWizard">Setup Wizard</a> to
configure your company, operating costs, named ovens, and initial inventory in a guided
10-step walkthrough. The wizard is the fastest way to get your shop configured and ready.
</div>
</div>
<p>
If you prefer to configure things manually, or if you are returning to complete partial setup,
work through these steps in order. Each step builds on the last — for example, inventory items
need vendors before you can record purchases, and jobs need customers before you can create them.
</p>
<div class="list-group shadow-sm">
<div class="list-group-item list-group-item-action d-flex gap-3 align-items-start py-3">
<span class="badge bg-primary rounded-pill mt-1 flex-shrink-0">1</span>
<div>
<h6 class="mb-1 fw-semibold"><i class="bi bi-truck me-1"></i>Set up your vendors</h6>
<p class="mb-0 text-muted small">
Go to <strong>Inventory &rsaquo; Vendors</strong> and add the companies you buy powder and
other supplies from. Include their payment terms and a contact name. Vendors are linked to
inventory items so you always know where to reorder.
</p>
</div>
</div>
<div class="list-group-item list-group-item-action d-flex gap-3 align-items-start py-3">
<span class="badge bg-primary rounded-pill mt-1 flex-shrink-0">2</span>
<div>
<h6 class="mb-1 fw-semibold"><i class="bi bi-box-seam me-1"></i>Add your inventory items</h6>
<p class="mb-0 text-muted small">
Go to <strong>Inventory &rsaquo; Items</strong> and enter the powders, primers, and
consumables you stock. Set each item's unit cost, reorder point, and link it to the vendor
you buy it from. This feeds into job costing and low-stock alerts.
</p>
</div>
</div>
<div class="list-group-item list-group-item-action d-flex gap-3 align-items-start py-3">
<span class="badge bg-primary rounded-pill mt-1 flex-shrink-0">3</span>
<div>
<h6 class="mb-1 fw-semibold"><i class="bi bi-tools me-1"></i>Add your equipment</h6>
<p class="mb-0 text-muted small">
Go to <strong>Equipment</strong> and add your oven, sandblaster, coating booth, and any
other machinery. Recording equipment lets you log maintenance and feeds into the operating
cost calculations used in job pricing.
</p>
</div>
</div>
<div class="list-group-item list-group-item-action d-flex gap-3 align-items-start py-3">
<span class="badge bg-primary rounded-pill mt-1 flex-shrink-0">4</span>
<div>
<h6 class="mb-1 fw-semibold"><i class="bi bi-person-badge me-1"></i>Add your shop workers</h6>
<p class="mb-0 text-muted small">
Go to <strong>Operations &rsaquo; Shop Workers</strong> and add the people who work in your
shop. Assign each worker a role (Coater, Sandblaster, etc.). Workers can then be assigned
to jobs and maintenance tasks.
</p>
</div>
</div>
<div class="list-group-item list-group-item-action d-flex gap-3 align-items-start py-3">
<span class="badge bg-primary rounded-pill mt-1 flex-shrink-0">5</span>
<div>
<h6 class="mb-1 fw-semibold"><i class="bi bi-people me-1"></i>Create your first customer</h6>
<p class="mb-0 text-muted small">
Go to <strong>Operations &rsaquo; Customers</strong> and add a customer. Choose Commercial
for businesses or Non-Commercial for individuals. You will need a customer record before
you can create a job or a quote for them.
</p>
</div>
</div>
<div class="list-group-item list-group-item-action d-flex gap-3 align-items-start py-3">
<span class="badge bg-success rounded-pill mt-1 flex-shrink-0">6</span>
<div>
<h6 class="mb-1 fw-semibold"><i class="bi bi-briefcase me-1"></i>Create your first job</h6>
<p class="mb-0 text-muted small">
Go to <strong>Operations &rsaquo; Jobs</strong> and click <strong>New Job</strong>. Select
the customer, describe the work, add line items, set a due date, and assign a worker.
Then update the job status as it moves through the shop.
</p>
</div>
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#logging-in">Logging In</a>
<a class="nav-link py-1 px-3 small text-body" href="#navigating">Navigating the System</a>
<a class="nav-link py-1 px-3 small text-body" href="#roles-and-permissions">Roles and Permissions</a>
<a class="nav-link py-1 px-3 small text-body" href="#your-first-steps">Your First Steps</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,283 @@
@{
ViewData["Title"] = "Help Center";
}
<div class="d-flex align-items-center gap-2 mb-3">
<h1 class="h3 mb-0"><i class="bi bi-question-circle text-primary me-2"></i>Help Center</h1>
</div>
<div class="card border-0 shadow-sm mb-4 bg-primary text-white">
<div class="card-body py-4">
<div class="row align-items-center">
<div class="col">
<h2 class="h4 mb-1 text-white">Welcome to the Help Center</h2>
<p class="mb-0 opacity-75">
Find step-by-step guides for every part of the powder coating shop management system.
Whether you are setting up the shop for the first time or need a quick refresher,
the articles below have you covered.
</p>
</div>
<div class="col-auto d-none d-md-block">
<i class="bi bi-book-half" style="font-size:4rem; opacity:0.3;"></i>
</div>
</div>
</div>
</div>
<div class="row g-4">
<div class="col-lg-9">
<!-- Getting Started -->
<h2 class="h6 fw-semibold mb-2 text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">Getting Started</h2>
<div class="row g-3 mb-4">
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-primary bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-rocket-takeoff text-primary fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Getting Started</h5>
<p class="card-text text-muted small mb-2">Log in, navigate the system, understand user roles, and take your first steps setting up the shop.</p>
<a asp-controller="Help" asp-action="GettingStarted" class="btn btn-sm btn-outline-primary">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Operations -->
<h2 class="h6 fw-semibold mb-2 text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">Operations</h2>
<div class="row g-3 mb-4">
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-primary bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-briefcase text-primary fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Jobs</h5>
<p class="card-text text-muted small mb-2">Create and manage jobs, track status through the shop workflow, assign workers, and manage line items.</p>
<a asp-controller="Help" asp-action="Jobs" class="btn btn-sm btn-outline-primary">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-success bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-file-earmark-text text-success fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Quotes</h5>
<p class="card-text text-muted small mb-2">Build quotes for customers and prospects, use the pricing engine, and convert approved quotes into jobs.</p>
<a asp-controller="Help" asp-action="Quotes" class="btn btn-sm btn-outline-success">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-warning bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-receipt text-warning fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Invoices</h5>
<p class="card-text text-muted small mb-2">Create invoices from completed jobs, send them to customers, record payments, and track outstanding balances.</p>
<a asp-controller="Help" asp-action="Invoices" class="btn btn-sm btn-outline-warning">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-info bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-people text-info fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Customers</h5>
<p class="card-text text-muted small mb-2">Add and manage commercial and non-commercial customers, set credit limits, and view their job and invoice history.</p>
<a asp-controller="Help" asp-action="Customers" class="btn btn-sm btn-outline-info">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Inventory & Purchasing -->
<h2 class="h6 fw-semibold mb-2 text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">Inventory &amp; Purchasing</h2>
<div class="row g-3 mb-4">
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-primary bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-box-seam text-primary fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Inventory</h5>
<p class="card-text text-muted small mb-2">Track powders and supplies, monitor stock levels, set reorder points, and record stock transactions.</p>
<a asp-controller="Help" asp-action="Inventory" class="btn btn-sm btn-outline-primary">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-success bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-truck text-success fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Vendors</h5>
<p class="card-text text-muted small mb-2">Manage suppliers, set payment terms, link vendors to inventory items, and track purchase history.</p>
<a asp-controller="Help" asp-action="Vendors" class="btn btn-sm btn-outline-success">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-warning bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-cart3 text-warning fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Purchase Orders</h5>
<p class="card-text text-muted small mb-2">Create POs for vendors, track submission and receipt, and convert received POs into vendor bills.</p>
<a asp-controller="Help" asp-action="PurchaseOrders" class="btn btn-sm btn-outline-warning">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-danger bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-bank text-danger fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Accounts Payable</h5>
<p class="card-text text-muted small mb-2">Record vendor bills, track what you owe, mark bills as paid, and manage your AP ledger.</p>
<a asp-controller="Help" asp-action="AccountsPayable" class="btn btn-sm btn-outline-danger">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Shop Management -->
<h2 class="h6 fw-semibold mb-2 text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">Shop Management</h2>
<div class="row g-3 mb-4">
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-info bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-person-badge text-info fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Shop Workers</h5>
<p class="card-text text-muted small mb-2">Add floor staff, assign roles like Coater or Sandblaster, and link workers to jobs and maintenance tasks.</p>
<a asp-controller="Help" asp-action="ShopWorkers" class="btn btn-sm btn-outline-info">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-secondary bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-tools text-secondary fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Equipment &amp; Maintenance</h5>
<p class="card-text text-muted small mb-2">Track your oven, sandblaster, and coating booth. Log maintenance records and schedule upcoming service.</p>
<a asp-controller="Help" asp-action="Equipment" class="btn btn-sm btn-outline-secondary">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Reports & Admin -->
<h2 class="h6 fw-semibold mb-2 text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">Reports &amp; Admin</h2>
<div class="row g-3 mb-4">
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-primary bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-bar-chart text-primary fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Reports</h5>
<p class="card-text text-muted small mb-2">Financial summaries, AR aging, job throughput, inventory levels, and equipment status — all in one place.</p>
<a asp-controller="Help" asp-action="Reports" class="btn btn-sm btn-outline-primary">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-success bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-gear text-success fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Settings</h5>
<p class="card-text text-muted small mb-2">Configure company info, pricing rates, operating costs, pricing tiers, and chart of accounts.</p>
<a asp-controller="Help" asp-action="Settings" class="btn btn-sm btn-outline-success">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card border-0 shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-start gap-3">
<div class="rounded-3 bg-secondary bg-opacity-10 p-2 flex-shrink-0">
<i class="bi bi-person-circle text-secondary fs-4"></i>
</div>
<div>
<h5 class="card-title mb-1">Your Profile</h5>
<p class="card-text text-muted small mb-2">Update your contact details, change your password, upload a profile photo, and choose your display theme.</p>
<a asp-controller="Help" asp-action="UserProfile" class="btn btn-sm btn-outline-secondary">Read more <i class="bi bi-arrow-right ms-1"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-3 d-none d-lg-block">
@await Html.PartialAsync("_HelpNav")
</div>
</div>
@@ -0,0 +1,456 @@
@{
ViewData["Title"] = "Inventory";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Inventory</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
The Inventory module tracks every powder, primer, consumable, and supply item your shop uses.
Each item has a current stock level, a unit cost that feeds into job pricing calculations, and
a reorder point that triggers a low-stock alert when stock drops to or below it.
</p>
<p>
Keeping inventory accurate matters for two reasons. First, your job and quote pricing is only
as accurate as the unit costs stored in inventory — outdated costs lead to under-pricing.
Second, knowing how much powder you have on hand before a job starts prevents the frustrating
situation of running out of material mid-job.
</p>
<p>
You can find Inventory under <strong>Inventory &rsaquo; Items</strong> in the left sidebar.
</p>
</section>
<section id="adding-items" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Adding Inventory Items
</h2>
<p>To add a new item to your inventory:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Inventory &rsaquo; Items</strong> and click <strong>New Item</strong>.</li>
<li class="mb-2">
Fill in the item details:
<ul class="mt-1">
<li><strong>Item Name</strong> — a clear, descriptive name (e.g., "Gloss Black Powder — Tiger Drylac 49/90005").</li>
<li><strong>SKU / Part Number</strong> — the manufacturer's part number or your internal SKU.</li>
<li><strong>Category</strong> — Powder, Primer, Consumable, Shop Supply, or other category as appropriate.</li>
<li><strong>Unit of Measure</strong> — lbs, kg, each, litre, etc.</li>
<li><strong>Unit Cost</strong> — your purchase cost per unit. Used in quote and job pricing calculations.</li>
<li><strong>Current Quantity on Hand</strong> — the number of units you have right now. This becomes the opening stock level.</li>
<li><strong>Reorder Point</strong> — the quantity at which you want to be alerted to reorder. See the Reorder Points section below.</li>
<li><strong>Vendor / Supplier</strong> — the vendor you purchase this item from. Linking a vendor lets you quickly see who to call when stock runs low.</li>
</ul>
</li>
<li class="mb-2">
For powder coatings, the <strong>Coverage Rate</strong> (sq ft per lb) and <strong>Transfer Efficiency %</strong>
default to <strong>30 sq ft/lb</strong> and <strong>65%</strong> respectively — typical starting values for most powder
and application setups. Adjust these to match your specific powder and equipment. Both values are used when
calculating powder needed on quotes and jobs.
</li>
<li class="mb-2">Click <strong>Save Item</strong>.</li>
</ol>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
When you save a new item with an opening stock quantity greater than zero, the system automatically
records an <strong>Initial</strong> transaction for that quantity. This gives you a clean audit trail
from day one without any manual entry.
</div>
</div>
</section>
<section id="stock-levels" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-boxes text-primary me-2"></i>Stock Levels and Reorder Points
</h2>
<p>
The <strong>quantity on hand</strong> for each item is updated automatically whenever a transaction
is recorded — a purchase receipt increases stock, a job consumption decreases it, and a manual
adjustment sets it to the corrected count.
</p>
<p>
The <strong>reorder point</strong> is the safety threshold below which you do not want your stock
to fall. When the quantity on hand reaches or drops below the reorder point, the item appears in
the low-stock alerts section on your Dashboard and is flagged in the Inventory list. Think of it
as the signal to place a new order with your vendor.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Setting a good reorder point</h3>
<p>
A good reorder point accounts for two factors:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Lead time</strong> — how many days it typically takes for your vendor to deliver after you place an order. If lead time is 5 days, your reorder point should cover at least 5 days of usage.</li>
<li class="mb-1"><strong>Daily usage rate</strong> — how much of the item you typically consume per day based on your job volume.</li>
</ul>
<p>
For example, if you use 3 lbs of a powder per day and your vendor takes 5 days to deliver, a
reorder point of 20 lbs (3 &times; 5 + a small safety buffer) ensures you never run out while
waiting for the delivery.
</p>
</section>
<section id="stock-adjustment" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-slash-minus text-primary me-2"></i>Stock Adjustment
</h2>
<p>
Use the <strong>Stock Adjustment</strong> button on any item's Details page to quickly correct the
quantity on hand without going through the full edit form. This is the fastest way to record a
physical count correction, log a waste event, or add stock received outside of a formal Purchase Order.
</p>
<p>Click <strong>Stock Adjustment</strong> in the Actions panel and choose one of three modes:</p>
<ul class="mb-3">
<li class="mb-2"><strong>Add Stock</strong> — increases the current quantity by the amount you enter. Use for received goods, returns, or found stock.</li>
<li class="mb-2"><strong>Remove Stock</strong> — decreases the current quantity by the amount you enter. Use for waste, spillage, or damage write-offs.</li>
<li class="mb-2"><strong>Set Exact</strong> — sets the quantity on hand to the exact number you enter, regardless of the current value. Use after a physical inventory count to correct the balance.</li>
</ul>
<p>
A <strong>reason</strong> is required for every adjustment. Common reasons are listed in the dropdown
(received from PO, physical count correction, waste, etc.). Add optional notes for additional detail.
The modal shows your current stock and a live preview of the new balance as you type.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-journal-check flex-shrink-0 mt-1"></i>
<div>
Every stock adjustment is automatically recorded as an <strong>Adjustment</strong> transaction in the
item's activity history, including the reason and notes you entered. You can review all past
adjustments on the <strong>Inventory Activity</strong> page.
</div>
</div>
</section>
<section id="transactions" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-arrow-left-right text-primary me-2"></i>Transaction Types
</h2>
<p>
Every stock movement is recorded as a transaction with a date, quantity, and running balance,
giving you a complete audit trail. Transactions are created automatically by the system
(when you create an item, edit a quantity, receive a PO, or record powder usage on a job)
and manually through the Stock Adjustment modal.
</p>
<div class="table-responsive mb-3">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width:25%">Transaction Type</th>
<th>When it is recorded</th>
<th style="width:15%">Effect on stock</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Initial</strong></td>
<td>Opening balance when an item is first created with stock on hand.</td>
<td class="text-success fw-semibold">+ Increases</td>
</tr>
<tr>
<td><strong>Purchase</strong></td>
<td>Stock received from a vendor via a Purchase Order receipt.</td>
<td class="text-success fw-semibold">+ Increases</td>
</tr>
<tr>
<td><strong>Return</strong></td>
<td>Stock returned to inventory from a job or returned from a vendor.</td>
<td class="text-success fw-semibold">+ Increases</td>
</tr>
<tr>
<td><strong>Adjustment</strong></td>
<td>Manual correction via the Stock Adjustment modal, or any direct change to Quantity on Hand through the edit form.</td>
<td class="text-muted">+/&minus;</td>
</tr>
<tr>
<td><strong>Transfer</strong></td>
<td>Stock moved between locations or storage areas.</td>
<td class="text-muted">+/&minus;</td>
</tr>
<tr>
<td><strong>Job Usage</strong></td>
<td>Powder consumed during a job — recorded automatically when actual usage is entered on a job coat.</td>
<td class="text-danger fw-semibold">&minus; Decreases</td>
</tr>
<tr>
<td><strong>Sale</strong></td>
<td>Stock consumed or sold outside of a job.</td>
<td class="text-danger fw-semibold">&minus; Decreases</td>
</tr>
<tr>
<td><strong>Waste</strong></td>
<td>Material scrapped, spilled, or otherwise lost and cannot be used.</td>
<td class="text-danger fw-semibold">&minus; Decreases</td>
</tr>
</tbody>
</table>
</div>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
Always add a <strong>note</strong> when recording a Waste or Adjustment. Notes make it much
easier to understand your stock history during audits or when investigating discrepancies
between physical counts and the system.
</div>
</div>
</section>
<section id="activity-ledger" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-journal-text text-primary me-2"></i>Inventory Activity
</h2>
<p>
The <strong>Inventory Activity</strong> page (<strong>Inventory &rsaquo; Inventory Activity</strong> in the
sidebar, or click <strong>View Activity History</strong> on any item's Details page) gives you a
complete view of all stock movements and powder usage across your shop.
</p>
<p>It has two tabs:</p>
<ul class="mb-3">
<li class="mb-2">
<strong>Stock Transactions</strong> — every transaction recorded against your inventory items,
showing date, type, quantity (green for additions, red for deductions), unit cost, total cost,
running balance after the transaction, and a link to the source Purchase Order if applicable.
</li>
<li class="mb-2">
<strong>Powder Usage by Job</strong> — every instance of powder being consumed on a job coat,
showing the job number (linked to the job), customer, color applied, estimated vs actual pounds
used, and the variance. A totals row at the bottom summarises the full filtered selection.
</li>
</ul>
<p>
Use the filter bar at the top to narrow results by <strong>item</strong>, <strong>date range</strong>,
and <strong>transaction type</strong>. Summary pills above the tabs show total lbs received, total
lbs used, and net adjustments for the current filter.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
To see the history for a single powder, open its Details page and click
<strong>View Activity History</strong> — the Inventory Activity page will open pre-filtered
to that item.
</div>
</div>
</section>
<section id="qr-labels" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-qr-code text-primary me-2"></i>QR Code Labels &amp; Mobile Usage Logging
</h2>
<p>
Every inventory item has a printable <strong>QR code label</strong>. Stick it on the bag, bin,
or shelf and shop floor workers can scan it with their phone to log how much they used —
without ever touching a desktop.
</p>
<h3 class="h6 fw-semibold mt-4 mb-2">Printing a label</h3>
<ol class="mb-3">
<li class="mb-1">Open the inventory item's Details page.</li>
<li class="mb-1">Click <strong>Print QR Label</strong> in the Actions panel — the label opens in a new tab.</li>
<li class="mb-1">Click <strong>Print Label</strong> and send it to your printer. The label is sized for a standard 3.5&Prime; label and includes the item name, SKU, colour, finish, and manufacturer.</li>
</ol>
<h3 class="h6 fw-semibold mt-4 mb-2">Scanning and logging usage</h3>
<ol class="mb-3">
<li class="mb-1">Point your phone camera at the QR code on the label. Your browser opens the <strong>Log Usage</strong> page for that item.</li>
<li class="mb-1">
<strong>Select a job</strong> (optional but recommended):
<ul class="mt-1">
<li><em>My Jobs</em> — active jobs assigned to your account appear first.</li>
<li><em>Other Jobs</em> — any other open job in the system.</li>
<li><em>No Job</em> — log usage without a job reference (e.g. a waste event).</li>
</ul>
</li>
<li class="mb-1">Enter the <strong>quantity</strong> used. A live preview shows what the new stock balance will be.</li>
<li class="mb-1">Choose a <strong>reason</strong>: Job Usage, Waste / Spillage, Correction, or Transfer Out.</li>
<li class="mb-1">Add optional notes, then tap <strong>Save Usage Log</strong>.</li>
</ol>
<h3 class="h6 fw-semibold mt-4 mb-2">After saving</h3>
<p class="mb-3">
The success screen gives you two options:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Log Another Item for This Job</strong> — returns to the scan page with the same job pre-selected, so you can quickly log the next powder without re-picking the job.</li>
<li class="mb-1"><strong>Back to Inventory</strong> or <strong>View Item Details</strong> — returns to a neutral state.</li>
</ul>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Every scan-based usage log is recorded as a <strong>JobUsage</strong> or <strong>Adjustment</strong>
transaction and immediately reduces the item's quantity on hand. You can review it on the
<a href="/Inventory/Ledger" class="alert-link">Inventory Activity</a> page.
The first time a worker scans on a new device they will be asked to log in — after that the
browser keeps them signed in.
</div>
</div>
</section>
<section id="low-stock-alerts" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-exclamation-triangle text-primary me-2"></i>Stock Status and Alerts
</h2>
<p>Every inventory item displays one of three stock statuses:</p>
<ul class="mb-3">
<li class="mb-2">
<span class="badge bg-success me-1">In Stock</span>
Quantity on hand is above the reorder point. No action needed.
</li>
<li class="mb-2">
<span class="badge bg-danger me-1">Low Stock</span>
Quantity on hand is greater than zero but at or below the reorder point.
This is your signal to place a reorder with your vendor.
</li>
<li class="mb-2">
<span class="badge bg-dark me-1">Out of Stock</span>
Quantity on hand is zero. Jobs using this powder cannot proceed until stock is replenished.
An alert banner is shown on the item's Details page prompting you to use Stock Adjustment to add inventory.
</li>
</ul>
<p>Low Stock and Out of Stock items appear in the Inventory Alerts section on the Dashboard and in the Operations Report. Use the <strong>Low Stock</strong> filter on the Inventory list to see only items needing attention.</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
An item continues to show as Low Stock or Out of Stock even after you have placed a Purchase
Order, until the goods are physically received and the PO is marked as Received in the system.
This is intentional — it reminds you that stock has not yet arrived.
</div>
</div>
</section>
<section id="powder-insights" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-graph-up-arrow text-primary me-2"></i>Powder Insights
</h2>
<p>
<strong>Powder Insights</strong> (<a href="/PowderInsights">/PowderInsights</a>) is an
AI-powered analysis of your powder usage patterns, efficiency trends, and cost optimization
opportunities. It is accessible from the Equipment section of the sidebar.
</p>
<ul class="mb-3">
<li class="mb-1">Requires at least <strong>10 jobs</strong> with powder data to generate basic insights.</li>
<li class="mb-1">Predictive and cost-optimization features unlock at <strong>150 jobs</strong>.</li>
<li class="mb-1">Shows usage trends by powder color/type, efficiency benchmarks, and suggestions for reducing waste.</li>
</ul>
<p>
The more accurately you record powder usage and efficiency on your inventory items, the more
useful Powder Insights becomes over time.
</p>
</section>
<section id="inventory-categories" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-tags text-primary me-2"></i>Inventory Categories &amp; the "Is Coating" Flag
</h2>
<p>
Every inventory item belongs to a <strong>category</strong> (e.g. "Powder Coatings", "Primers",
"Shop Supplies"). Categories help you organize items in your list, but one setting on a category
has a direct effect on what appears in your quote and job workflows: the <strong>Is Coating</strong> flag.
</p>
<p>
<strong>Only items whose category has "Is Coating" enabled will appear in the powder color
dropdown</strong> when building a quote or job item. If a category does not have this flag set,
all items in that category are treated as general supplies and are excluded from the color picker.
</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-4" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Blank powder color dropdown?</strong> This is almost always caused by the inventory
category for your powder coatings not having <strong>Is Coating</strong> checked. Follow
the steps below to fix it.
</div>
</div>
<h3 class="h6 fw-semibold mt-3 mb-2">How to enable "Is Coating" on a category</h3>
<ol class="mb-3">
<li class="mb-2">Go to <strong><a asp-controller="CompanySettings" asp-action="Index">Company Settings</a> &rsaquo; Data Lookups &rsaquo; Inventory Categories</strong>.</li>
<li class="mb-2">Find the category that contains your powder coating colors (e.g. "Powder Coatings").</li>
<li class="mb-2">Click the edit icon and check the <strong>Is Coating</strong> checkbox.</li>
<li class="mb-2">Save. Items in that category will immediately appear in the powder color dropdown on all quotes and jobs — no restart required.</li>
</ol>
<h3 class="h6 fw-semibold mt-3 mb-2">Which categories should have "Is Coating" enabled?</h3>
<p>
Only categories that contain actual powder coating colors — the materials that go into the oven
and bond to the part. Do <strong>not</strong> enable this on categories for primers, masking
supplies, consumables, or equipment. Enabling it on non-coating categories will pollute the
color dropdown with irrelevant items and make it harder to find the right powder.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
The "Is Coating" flag also controls where the <strong>sample panel toggle</strong> appears
on an item's Details page. The toggle — "I have a swatch/sample of this color" — only
shows up for items in a coating category, and those items are the ones tracked on the
<strong>Sample Panels</strong> page.
</div>
</div>
</section>
<section id="powder-usage" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-droplet text-primary me-2"></i>Powder Usage on Jobs
</h2>
<p>
When a job item uses a powder coating from your inventory, the system calculates how much powder
will be needed before the job begins. This estimate is based on three values:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Surface area</strong> — the total square footage to be coated (entered per item in the job or quote wizard).</li>
<li class="mb-1"><strong>Coverage rate</strong> — how many square feet one pound of the selected powder covers (set on the inventory item).</li>
<li class="mb-1"><strong>Number of coats</strong> — selected when you add the coating to the item.</li>
</ul>
<p>
The <strong>Powder Needed</strong> figure appears in the item wizard as you build the quote or job,
and is shown in the Coatings column on the Job Details page. Use it to quickly verify that you
have sufficient stock on hand before scheduling the job for production.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Coverage rates vary by powder type, application equipment, and operator technique. Use a
conservative (lower) coverage rate in your inventory settings to build in a safety margin.
It is better to order slightly more than to run short mid-job.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#adding-items">Adding Inventory Items</a>
<a class="nav-link py-1 px-3 small text-body" href="#stock-levels">Stock Levels and Reorder Points</a>
<a class="nav-link py-1 px-3 small text-body" href="#stock-adjustment">Stock Adjustment</a>
<a class="nav-link py-1 px-3 small text-body" href="#transactions">Transaction Types</a>
<a class="nav-link py-1 px-3 small text-body" href="#activity-ledger">Inventory Activity</a>
<a class="nav-link py-1 px-3 small text-body" href="#qr-labels">QR Labels &amp; Mobile Logging</a>
<a class="nav-link py-1 px-3 small text-body" href="#low-stock-alerts">Stock Status and Alerts</a>
<a class="nav-link py-1 px-3 small text-body" href="#powder-insights">Powder Insights</a>
<a class="nav-link py-1 px-3 small text-body" href="#inventory-categories">Inventory Categories &amp; Is Coating</a>
<a class="nav-link py-1 px-3 small text-body" href="#powder-usage">Powder Usage on Jobs</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,395 @@
@{
ViewData["Title"] = "Invoices";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Invoices</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Invoices are the formal request for payment you send to customers after their work is complete.
Each job can have one invoice. The system tracks payment status in real time — you can see at a
glance which customers owe money, how much, and how long the balance has been outstanding.
</p>
<p>
Invoices can be emailed to customers directly from the system (when email is configured) and
downloaded as PDFs to print or send manually. Payments — whether in full or in partial
installments — are logged against the invoice, and the customer's outstanding balance on their
account is updated automatically with every transaction.
</p>
<p>
You can find Invoices under <strong>Operations &rsaquo; Invoices</strong> in the left sidebar.
</p>
</section>
<section id="creating-an-invoice" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Creating an Invoice
</h2>
<p>
The easiest way to create an invoice is directly from the job it belongs to. This pre-fills
all line items and pricing automatically.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">From a Job (recommended)</h3>
<ol class="mb-3">
<li class="mb-2">Open the job from <strong>Operations &rsaquo; Jobs</strong> and go to its Details page.</li>
<li class="mb-2">Scroll to the <strong>Invoice</strong> section near the bottom of the page.</li>
<li class="mb-2">Click <strong>Create Invoice</strong>. The system generates an invoice pre-filled with all the job's line items and the final pricing.</li>
<li class="mb-2">Review the invoice — check line items, totals, and the due date — then click <strong>Save Invoice</strong>.</li>
</ol>
<h3 class="h6 fw-semibold mt-3 mb-2">From the Invoices list (manual)</h3>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Operations &rsaquo; Invoices</strong> and click <strong>New Invoice</strong>.</li>
<li class="mb-2">Select the customer and then select the job this invoice is for.</li>
<li class="mb-2">Add or adjust line items as needed.</li>
<li class="mb-2">Set the invoice date, due date, and any notes.</li>
<li class="mb-2">Click <strong>Save Invoice</strong>.</li>
</ol>
<p>
Invoice numbers are generated in the format <code>INV-YYMM-####</code>
(for example, <code>INV-2503-0007</code>). Each job can only have one invoice — if an invoice
already exists for a job, the Create Invoice button on the Job Details page is replaced with a
link to the existing invoice.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
You can create an invoice for a job at any time — you do not need to wait until the job
reaches a Completed or Delivered status. Some shops invoice on deposit when a job is
approved; others invoice on pickup. The system is flexible.
</div>
</div>
</section>
<section id="invoice-statuses" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-tag text-primary me-2"></i>Invoice Statuses
</h2>
<p>
Invoices move through statuses that reflect their current payment state. Each status is shown
as a color-coded badge throughout the system.
</p>
<div class="table-responsive">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width:30%">Status</th>
<th>What it means</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-secondary">Draft</span></td>
<td>The invoice has been created but not yet sent to the customer. It can still be edited freely. It does not yet affect the customer's balance.</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark">Sent</span></td>
<td>The invoice has been delivered to the customer and a due date is set. The balance is now reflected in the customer's outstanding account.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Partially Paid</span></td>
<td>At least one payment has been received but the full balance has not yet been settled.</td>
</tr>
<tr>
<td><span class="badge bg-success">Paid</span></td>
<td>The full invoice amount has been received. The customer's balance is reduced to zero for this invoice.</td>
</tr>
<tr>
<td><span class="badge bg-danger">Overdue</span></td>
<td>The due date has passed and there is still an outstanding balance. Overdue invoices are flagged prominently in the AR Aging report.</td>
</tr>
<tr>
<td><span class="badge bg-secondary">Voided</span></td>
<td>The invoice was cancelled. The balance is reversed on the customer's account. See the Voiding section below for restrictions.</td>
</tr>
<tr>
<td><span class="badge bg-dark">Written Off</span></td>
<td>The balance has been written off as bad debt. The outstanding amount is removed from the customer's account but is recorded for reporting purposes.</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="sending-an-invoice" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-send text-primary me-2"></i>Sending an Invoice
</h2>
<p>
Once you have saved an invoice as a Draft and reviewed it, you are ready to send it to the customer.
</p>
<ol class="mb-3">
<li class="mb-2">Open the invoice from <strong>Operations &rsaquo; Invoices</strong> or from the job's Details page.</li>
<li class="mb-2">Click <strong>Send Invoice</strong>. The status changes from Draft to Sent.</li>
<li class="mb-2">If email notifications are configured, the customer receives an email with the invoice details and total due.</li>
<li class="mb-2">A due date is set automatically based on the customer's payment terms (e.g., Net 30 means the due date is 30 days from today).</li>
</ol>
<p>
You can also click <strong>Download PDF</strong> on any invoice to generate a print-ready PDF
that you can email manually, attach to an existing email thread, or hand to the customer in person.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
Once an invoice is sent, the line items and total are locked for editing. If you need to make
a correction after sending, void the invoice and create a new one. This ensures a clean audit
trail.
</div>
</div>
</section>
<section id="recording-payments" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-cash-coin text-primary me-2"></i>Recording a Payment
</h2>
<p>
When a customer pays — whether in full or as a partial payment — you record it against the invoice.
The system supports multiple partial payments on a single invoice.
</p>
<ol class="mb-3">
<li class="mb-2">Open the invoice and click <strong>Record Payment</strong>.</li>
<li class="mb-2">
Fill in the payment details:
<ul class="mt-1">
<li><strong>Amount</strong> — how much was received this time. Can be less than the full balance for partial payments.</li>
<li><strong>Payment Method</strong> — Cash, Check, Credit/Debit Card, Bank Transfer / ACH, or Digital Payment.</li>
<li><strong>Payment Date</strong> — defaults to today.</li>
<li><strong>Reference Number</strong> — optional. Use for check numbers, transaction IDs, or wire reference numbers.</li>
<li><strong>Notes</strong> — any additional notes about this payment.</li>
</ul>
</li>
<li class="mb-2">Click <strong>Save Payment</strong>.</li>
</ol>
<p>
The invoice status updates automatically — to <strong>Partially Paid</strong> if there is still
a remaining balance, or <strong>Paid</strong> if the full amount has been received. The customer's
outstanding balance on their account is reduced by the payment amount. All payments are shown in
a payment log on the invoice Details page.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
You can delete an individual payment from the payment log on the invoice Details page if it
was recorded in error. Deleting a payment reverses its effect on the invoice status and the
customer balance.
</div>
</div>
</section>
<section id="voiding-an-invoice" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-x-circle text-primary me-2"></i>Voiding an Invoice
</h2>
<p>
If an invoice was created in error — for example, against the wrong job or with incorrect line
items that cannot be corrected — you can void it to remove it from the customer's outstanding
balance.
</p>
<ol class="mb-3">
<li class="mb-2">Open the invoice and click <strong>Void Invoice</strong>.</li>
<li class="mb-2">Confirm the action in the dialog that appears.</li>
<li class="mb-2">The invoice status changes to Voided and the balance is reversed on the customer's account.</li>
</ol>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Restrictions:</strong> Only invoices in <strong>Draft</strong> or <strong>Sent</strong>
status can be voided. If an invoice has payments recorded against it, you must delete those
payments first before you can void the invoice. Invoices that are Partially Paid or Paid
cannot be voided directly — consider writing off the remaining balance instead if needed.
</div>
</div>
</section>
<section id="customer-balance" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-wallet2 text-primary me-2"></i>Customer Balance
</h2>
<p>
Every customer in the system has a running <strong>current balance</strong> that represents
their total outstanding amount across all unpaid invoices. The balance is updated automatically
whenever an invoice is sent, a payment is recorded, or an invoice is voided.
</p>
<p>You can see the current balance on the Customer Details page, shown alongside the customer's credit limit.</p>
<ul class="mb-3">
<li class="mb-1">When an invoice is <strong>sent</strong>, the balance increases by the invoice total.</li>
<li class="mb-1">When a <strong>payment is recorded</strong>, the balance decreases by the payment amount.</li>
<li class="mb-1">When an invoice is <strong>voided</strong>, the balance decreases by the invoice total.</li>
</ul>
<p>
If a customer's outstanding balance is approaching or has exceeded their credit limit, a warning
flag is shown on their customer record, on new jobs you try to create for them, and on new invoices.
This is a visual warning only — the system does not automatically block new work — but it provides
a clear signal to follow up on payment.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Use the <strong>AR Aging</strong> table in <a asp-controller="Help" asp-action="Reports">Reports &rsaquo; Financial</a>
to see all outstanding balances broken down by how many days past due they are. This is the
quickest way to identify which customers need a payment follow-up call.
</div>
</div>
</section>
<section id="deposits" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-piggy-bank text-primary me-2"></i>Deposits
</h2>
<p>
If a customer pays a deposit before work starts, record it from the <strong>Job Details</strong>
or <strong>Quote Details</strong> page using the <strong>Record Deposit</strong> button in the
Deposits card.
</p>
<p>
When you create an invoice from a job, <strong>all unapplied deposits are automatically applied
as payments</strong> on the new invoice. The invoice's Amount Paid and status update accordingly
— you may find the invoice is already partially or fully paid at creation time.
</p>
<p>
Each deposit generates a receipt (receipt number format: <code>DEP-YYMM-####</code>) that can
be downloaded as a PDF immediately after recording.
</p>
</section>
<section id="gift-certificates" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-gift text-primary me-2"></i>Gift Certificates
</h2>
<p>
Gift certificates are issued and managed at <a href="/GiftCertificates">Gift Certificates</a>
in the Operations section of the sidebar.
</p>
<p>
To apply a gift certificate to an invoice, open the Invoice Details page and click
<strong>Apply Gift Certificate</strong>. Enter the certificate code — the system looks up
the remaining balance and applies it as a payment up to the invoice amount.
</p>
</section>
<section id="online-payments" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-credit-card text-primary me-2"></i>Online Payments
</h2>
<p>
Customers can pay invoices online without logging in. The
<strong>Online Payments</strong> page (<a href="/Invoices/OnlinePayments">/Invoices/OnlinePayments</a>)
lists all open invoices with a shareable payment link. Clicking the link takes the customer to
a Stripe-hosted checkout page where they can pay by credit or debit card. Payment is recorded
automatically and the invoice status updates to <em>Paid</em> or <em>Partially Paid</em>.
Your team receives a bell notification when payment is received.
</p>
<h3 class="h6 fw-semibold mt-4 mb-2">One-Time Setup: Connecting Stripe</h3>
<p>
Online payments require a Stripe Connect account linked to your company. A <strong>Company Admin</strong>
completes this once:
</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Settings &rsaquo; Billing</strong> (<a href="/Billing">/Billing</a>).</li>
<li class="mb-2">Click <strong>Connect with Stripe</strong> (or <em>Set Up Online Payments</em>).</li>
<li class="mb-2">You are redirected to Stripe — create a new Stripe account or connect an existing one.</li>
<li class="mb-2">Complete Stripe&rsquo;s onboarding: enter your business details, add a bank account for payouts, and verify your identity as required by Stripe.</li>
<li class="mb-2">Once Stripe approves the account, you are returned to the app and Stripe Connect status shows <strong>Active</strong>.</li>
<li class="mb-2">Payment links now appear on Invoice Details and on the Online Payments page.</li>
</ol>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-3" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
If you don&rsquo;t see a <strong>Connect with Stripe</strong> button, online payments may not be
included in your current subscription plan. Check <a href="/Billing">Settings &rsaquo; Billing</a>
for your plan details or contact Powder Coating Logix support.
</div>
</div>
<h3 class="h6 fw-semibold mt-4 mb-2">Sharing a Payment Link</h3>
<p>
Once Stripe Connect is active, open any Invoice Details page and use one of these options:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Copy Payment Link</strong> — copies the URL to your clipboard so you can paste it into an email, text, or any other message.</li>
<li class="mb-1"><strong>Send Payment Link</strong> — emails the payment link directly to the customer&rsquo;s email address on file, with a brief message and the invoice amount.</li>
</ul>
<p>
The link is unique to each invoice and does not expire as long as the invoice remains unpaid.
Voided invoices do not generate payment links.
</p>
</section>
<section id="payment-reminders" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-bell text-primary me-2"></i>Automated Payment Reminders
</h2>
<p>
The system can automatically email customers when their invoices become overdue — without you
having to remember to follow up manually. This feature is controlled from
<strong>Settings &rsaquo; Notifications &rsaquo; Automated Payment Reminders</strong>.
</p>
<ul class="mb-3">
<li class="mb-2">
<strong>Enable Payment Reminders</strong> — turn the feature on or off for your company at any time.
When off, no automated emails are sent.
</li>
<li class="mb-2">
<strong>Reminder Days</strong> — a comma-separated list of day milestones past the due date at which
reminders are sent. The default is <code>7,14,30</code> (one reminder at 7 days overdue, another at
14, and a final one at 30).
</li>
</ul>
<p>
Each morning the system checks for overdue invoices in <strong>Sent</strong>,
<strong>Partially Paid</strong>, or <strong>Overdue</strong> status and sends a reminder email
if the invoice has reached one of your configured day thresholds for the first time that day.
Customers who have opted out of email notifications are never contacted.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
See <a asp-controller="Help" asp-action="Settings" fragment="notifications">Settings &rsaquo; Notification Settings</a>
for full details on configuring reminder thresholds and the email sender identity.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#creating-an-invoice">Creating an Invoice</a>
<a class="nav-link py-1 px-3 small text-body" href="#invoice-statuses">Invoice Statuses</a>
<a class="nav-link py-1 px-3 small text-body" href="#sending-an-invoice">Sending an Invoice</a>
<a class="nav-link py-1 px-3 small text-body" href="#recording-payments">Recording a Payment</a>
<a class="nav-link py-1 px-3 small text-body" href="#voiding-an-invoice">Voiding an Invoice</a>
<a class="nav-link py-1 px-3 small text-body" href="#customer-balance">Customer Balance</a>
<a class="nav-link py-1 px-3 small text-body" href="#deposits">Deposits</a>
<a class="nav-link py-1 px-3 small text-body" href="#gift-certificates">Gift Certificates</a>
<a class="nav-link py-1 px-3 small text-body" href="#online-payments">Online Payments</a>
<a class="nav-link py-1 px-3 small text-body" href="#payment-reminders">Payment Reminders</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,619 @@
@{
ViewData["Title"] = "Jobs";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Jobs</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Jobs are the core unit of work in the shop. Every item that comes through the door for coating is
tracked as a job. A job belongs to a customer, has a status that moves it through the shop workflow,
a priority level, a due date, and one or more line items describing the work to be performed.
</p>
<p>
You can find Jobs under <strong>Operations &rsaquo; Jobs</strong> in the left sidebar. The list is
searchable and sortable by job number, status, priority, scheduled date, due date, and price. Jobs
can be created manually or converted automatically from an approved quote — no need to re-enter
information that is already in the system.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
The fastest way to create a job is to start with a quote. Build and approve the quote, then
click <strong>Convert to Job</strong> — all items, coatings, and pricing carry over automatically.
</div>
</div>
</section>
<section id="creating-a-job" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Creating a Job
</h2>
<p>To create a job manually:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Operations &rsaquo; Jobs</strong> and click the <strong>New Job</strong> button in the top-right corner.</li>
<li class="mb-2">Select the <strong>Customer</strong> — this field is required. Type to search by name or company.</li>
<li class="mb-2">Enter a <strong>Job Description</strong> summarising the work (e.g., "Powder coat motorcycle frame — gloss black").</li>
<li class="mb-2">Set the <strong>Scheduled Date</strong> (when work is expected to begin) and the <strong>Due Date</strong> (when the customer expects pickup or delivery).</li>
<li class="mb-2">Choose a <strong>Priority</strong> — Normal is the default; see the Job Priority section below for all levels.</li>
<li class="mb-2">Optionally assign a <strong>Worker</strong> from your shop workers list.</li>
<li class="mb-2">Enter the customer's <strong>PO Number</strong> if they require one for their own records.</li>
<li class="mb-2">Add any <strong>Special Instructions</strong> your team needs to know before starting work.</li>
<li class="mb-2">Add one or more <strong>Line Items</strong> describing each piece being coated. See the Job Items section below.</li>
<li class="mb-2">Click <strong>Save Job</strong>.</li>
</ol>
<p>
The system automatically generates a unique job number in the format <code>JOB-YYMM-####</code>
(for example, <code>JOB-2503-0042</code>). This number appears on all documents related to the job.
</p>
</section>
<section id="job-status" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-arrow-right-circle text-primary me-2"></i>Job Status
</h2>
<p>
Each job moves through a defined sequence of statuses as it progresses through the shop. The status
is displayed as a color-coded badge on the job list and details page. You can update a job's status
at any time by opening the job and editing it.
</p>
<p>
The two special statuses — <strong>On Hold</strong> and <strong>Cancelled</strong> — can be applied
at any point in the workflow regardless of the current status. Use On Hold to pause a job temporarily
(waiting for customer approval, missing materials, etc.) and Cancelled to formally close a job that
will not be completed.
</p>
<div class="table-responsive">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width:30%">Status</th>
<th>What it means</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-secondary">Pending</span></td>
<td>Job has been entered but work has not started. Initial state for all new jobs.</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark">Quoted</span></td>
<td>A formal quote has been generated and sent to the customer for this job.</td>
</tr>
<tr>
<td><span class="badge bg-success">Approved</span></td>
<td>The customer has approved the quote and authorised the work to proceed.</td>
</tr>
<tr>
<td><span class="badge bg-primary">In Preparation</span></td>
<td>The job has been pulled from the queue and prep work has begun.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Sandblasting</span></td>
<td>The parts are being surface-blasted to remove rust, old coatings, or contaminants.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Masking / Taping</span></td>
<td>Areas that must not be coated are being masked off or taped.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Cleaning</span></td>
<td>Parts are being chemically cleaned and degreased before coating is applied.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">In Oven</span></td>
<td>Parts are in the pre-heat oven being brought to the correct application temperature.</td>
</tr>
<tr>
<td><span class="badge bg-primary">Coating</span></td>
<td>Powder coating is being applied to the parts via electrostatic spray gun.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Curing</span></td>
<td>Coated parts are in the curing oven at temperature to flow and bond the powder.</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark">Quality Check</span></td>
<td>Finished parts are being inspected for coverage, adhesion, and surface defects.</td>
</tr>
<tr>
<td><span class="badge bg-success">Completed</span></td>
<td>Work is done and the job has passed quality inspection.</td>
</tr>
<tr>
<td><span class="badge bg-success">Ready for Pickup</span></td>
<td>Parts are packaged and waiting for the customer to collect them.</td>
</tr>
<tr>
<td><span class="badge bg-secondary">Delivered</span></td>
<td>Parts have been collected by the customer or delivered to their location.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">On Hold</span></td>
<td>Job is temporarily paused. Can be applied at any point in the workflow.</td>
</tr>
<tr>
<td><span class="badge bg-danger">Cancelled</span></td>
<td>Job will not be completed. Can be applied at any point in the workflow.</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="job-priority" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-flag text-primary me-2"></i>Job Priority
</h2>
<p>
Every job has a priority level that tells your team how urgently a job needs to move through the shop.
Priorities are color-coded throughout the system — in the job list, on the job details page, and on
any dashboards. Set or change the priority in the Create or Edit form.
</p>
<div class="table-responsive mb-3">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width:30%">Priority</th>
<th>When to use it</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-secondary">Low</span></td>
<td>Non-urgent work that can be scheduled when the shop has capacity. No specific deadline pressure.</td>
</tr>
<tr>
<td><span class="badge bg-primary">Normal</span></td>
<td>Standard shop priority. Used for the majority of jobs. Work is completed within the agreed timeframe.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">High</span></td>
<td>Customer has a firm deadline or the job is part of a larger project. Should be worked ahead of Normal jobs.</td>
</tr>
<tr>
<td><span class="badge bg-danger">Urgent</span></td>
<td>Job must be completed very soon. Push to the front of the queue and notify the supervisor.</td>
</tr>
<tr>
<td><span class="badge bg-dark">Rush</span></td>
<td>Same-day or next-day turnaround required. Rush jobs are highlighted prominently in the job list to ensure they are never missed. A rush surcharge may apply.</td>
</tr>
</tbody>
</table>
</div>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
Rush jobs appear highlighted in the job list so they stand out at a glance. Make sure your team
understands that a Rush priority means the job takes precedence over everything else currently
on the floor.
</div>
</div>
</section>
<section id="job-items" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-list-check text-primary me-2"></i>Job Items
</h2>
<p>
Each job contains one or more line items, each describing a distinct piece or group of parts being
coated. Items are added using the item wizard when creating or editing a job.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Item Types</h3>
<ul class="mb-3">
<li class="mb-2">
<strong>Calculated Item</strong> — enter surface area, quantity, and complexity. The system
calculates material, labor, and equipment costs automatically. Select one or more powder
coatings and optional prep services (sandblasting, masking, cleaning).
</li>
<li class="mb-2">
<strong>Custom Work Item</strong> — enter a free-text description and a manual price. Use this for
one-off work that does not fit the standard calculation model.
</li>
<li class="mb-2">
<strong>AI Photo Quote Item</strong> — upload photos of the parts and let AI (Claude) estimate
the surface area, complexity, and labor time. Review and override any value before accepting.
Up to two follow-up rounds of questions are supported.
</li>
<li class="mb-2">
<strong>Labor Item</strong> — a line item representing time and labor charges only, without
material costs.
</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Surface Area and Coatings</h3>
<p>
For each item you enter the <strong>surface area in square feet</strong> and the <strong>quantity</strong>
of parts. You then select which powder coating(s) to apply. The system calculates how much powder is
needed per coat based on the surface area, the coating's coverage rate (sq ft per lb), and the
application efficiency factor.
</p>
<p>
The <strong>Powder Needed</strong> estimate is shown live in the wizard as you enter the surface area
and select coatings. This helps you check whether you have enough stock on hand before committing to
the job schedule.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Prep Services</h3>
<p>
Each item can also include optional <strong>prep services</strong> — sandblasting, masking, or
chemical cleaning — that will be carried out before coating. These are selected in the wizard and
appear as sub-lines under the item on the job details page.
</p>
<h3 class="h6 fw-semibold mt-4 mb-2">Save to Product Catalog</h3>
<p>
After completing the coatings and prep services steps, <strong>Calculated</strong> and
<strong>AI Photo Quote</strong> items include one final optional step: <strong>Save to Product Catalog</strong>.
This lets you turn the item you just configured into a reusable catalog entry so it can be selected
instantly on future quotes or jobs — without re-entering dimensions, coatings, or prep services.
</p>
<p>The wizard pre-fills the catalog form with:</p>
<ul class="mb-3">
<li><strong>Name</strong> — taken from the item description (or AI-generated description); you can edit it</li>
<li><strong>Default Price</strong> — copied from the item's calculated or manually adjusted unit price</li>
<li><strong>Description</strong> — the item description</li>
<li><strong>Sandblasting / Masking</strong> — automatically checked if those prep services were selected</li>
<li><strong>Category</strong> — choose from your active catalog categories</li>
</ul>
<p>At the bottom of the step you have two options:</p>
<ul class="mb-3">
<li><strong>Save to Catalog &amp; Add</strong> — saves the catalog item immediately and then adds the line item to the job.</li>
<li><strong>Skip — Add to Job Only</strong> — skips the save and adds the item to the job without creating a catalog entry.</li>
</ul>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-3" role="alert">
<i class="bi bi-info-circle-fill flex-shrink-0 mt-1"></i>
<div>
The catalog save happens immediately when you click <strong>Save to Catalog &amp; Add</strong> — before the job form is submitted. The catalog item is preserved even if you later discard the job. You can view and manage all saved items at <a asp-controller="CatalogItems" asp-action="Index">Catalog Items</a>.
</div>
</div>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Items on the job details page are grouped by type — Catalog Items, Custom Work, and Labor — to
make it easy to see exactly what work is being performed and which materials are required.
</div>
</div>
</section>
<section id="converting-from-quote" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-arrow-left-right text-primary me-2"></i>Converting from a Quote
</h2>
<p>
When a customer approves a quote, the quickest way to create the job is to convert the quote directly
rather than re-entering all the details manually.
</p>
<ol class="mb-3">
<li class="mb-2">Open the approved quote from <strong>Operations &rsaquo; Quotes</strong>.</li>
<li class="mb-2">Click the <strong>Convert to Job</strong> button on the quote details page.</li>
<li class="mb-2">
The system creates a new job pre-filled with:
<ul class="mt-1">
<li>All line items, surface areas, and quantities from the quote</li>
<li>All coatings and prep services selected for each item</li>
<li>The final pricing calculated on the quote</li>
<li>The customer record the quote was linked to</li>
</ul>
</li>
<li class="mb-2">Review the new job, set the scheduled date and priority, assign a worker if needed, and click <strong>Save Job</strong>.</li>
</ol>
<p>
The quote status changes to <strong>Converted</strong> and is linked to the new job. You can navigate
between the quote and the job at any time using the link shown on each record's details page.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
If the quote was created for a prospect (not yet a customer), you must first convert the prospect
to a customer before converting the quote to a job. See the
<a asp-controller="Help" asp-action="Quotes">Quotes help page</a> for details on prospect conversion.
</div>
</div>
</section>
<section id="creating-an-invoice" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-receipt text-primary me-2"></i>Creating an Invoice from a Job
</h2>
<p>
Once a job is complete — or at any time when you are ready to bill the customer — you can create an
invoice directly from the job's Details page. There is no need to manually re-enter pricing.
</p>
<ol class="mb-3">
<li class="mb-2">Open the job from <strong>Operations &rsaquo; Jobs</strong> and go to its Details page.</li>
<li class="mb-2">
Scroll to the <strong>Invoice</strong> section at the bottom of the page.
<ul class="mt-1">
<li>If no invoice exists yet, you will see a <strong>Create Invoice</strong> button.</li>
<li>If an invoice already exists, you will see a link to open it.</li>
</ul>
</li>
<li class="mb-2">Click <strong>Create Invoice</strong>. The system generates a new invoice pre-filled with all the job's line items and the final pricing.</li>
<li class="mb-2">Review the invoice, confirm the due date, and save it.</li>
</ol>
<p>
Each job can only have one invoice. Once the invoice is created, the Create Invoice button is replaced
with a link to view the existing invoice.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Any deposits recorded against this job are automatically applied as payments when the invoice
is created. For full details on invoicing, see the
<a asp-controller="Help" asp-action="Invoices">Invoices help page</a>.
</div>
</div>
</section>
<section id="photos-notes" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-camera text-primary me-2"></i>Photos and Notes
</h2>
<h3 class="h6 fw-semibold mt-3 mb-2">Job Photos</h3>
<p>
Upload before, during, and after photos directly from the Job Details page. Photo types include
<strong>Before</strong>, <strong>Progress</strong>, <strong>After</strong>,
<strong>Quality Check</strong>, <strong>Issue</strong>, and <strong>Completed</strong>.
Photos are visible to anyone who opens the job record and help document the work performed.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Job Notes</h3>
<p>
Add internal notes to a job from the Details page. Notes are private — they are not visible
to the customer. Use them for team communication, special handling instructions, or to log
anything notable that happened during production.
</p>
</section>
<section id="time-and-rework" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-clock text-primary me-2"></i>Time Entries and Rework
</h2>
<h3 class="h6 fw-semibold mt-3 mb-2">Time Entries</h3>
<p>
Log labor time against a job from the Job Details page using the <strong>Time Entries</strong>
section. Each entry records who worked on the job, how long, and when. Use this to track
actual hours vs. estimated hours for costing and productivity analysis.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Rework</h3>
<p>
If finished parts fail quality inspection or need to be re-coated, create a rework record
from the Job Details page. Rework records track the rework type, the reason (adhesion failure,
color mismatch, damage, etc.), and the resolution. This data helps identify recurring quality
issues over time.
</p>
</section>
<section id="job-templates" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-clipboard2-check text-primary me-2"></i>Job Templates
</h2>
<p>
If you do the same type of work repeatedly — for example, a standard wheel refinish package —
you can save a job's line items as a template and reuse it for future jobs.
</p>
<p>Templates are managed at <strong>/JobTemplates</strong>. To use a template:</p>
<ol class="mb-3">
<li class="mb-2">When creating a new job, look for the <strong>Load Template</strong> option.</li>
<li class="mb-2">Select the template you want to use.</li>
<li class="mb-2">The line items, coatings, and prep services from the template are pre-filled into the new job.</li>
<li class="mb-2">Adjust any fields as needed for this specific job, then save.</li>
</ol>
</section>
<section id="shop-display-and-board" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-display text-primary me-2"></i>Shop Display and Priority Board
</h2>
<h3 class="h6 fw-semibold mt-3 mb-2">Shop Display</h3>
<p>
The <strong>Shop Display</strong> (<a href="/Jobs/ShopDisplay">/Jobs/ShopDisplay</a>) opens a
full-screen view of all active jobs and their current statuses, designed for a TV or large
monitor mounted on the shop floor. Workers can see at a glance what jobs are in their queue
without needing to log in or use a computer.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Job Priority Board</h3>
<p>
The <strong>Priority Board</strong> (<a href="/JobsPriority">/JobsPriority</a>) is a
Kanban-style view of all active jobs, sorted by priority and status. It is the best view for
supervisors who need to triage work and decide what gets done first. Rush and Urgent jobs are
highlighted prominently.
</p>
</section>
<section id="part-intake" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-box-seam text-primary me-2"></i>Part Intake
</h2>
<p>
The <strong>Part Intake</strong> workflow lets you formally check in a customer's parts at
drop-off — before any work begins. This creates a timestamped record of how many pieces
arrived, their condition, and who received them, which protects the shop if a customer later
disputes pre-existing damage or a missing piece.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">How to record an intake</h3>
<ol class="mb-3">
<li class="mb-2">Open the <strong>Job Details</strong> page for the job.</li>
<li class="mb-2">Click the <strong>Intake</strong> button in the top-right button group. The button is highlighted in blue when intake has not yet been recorded, and shows a checkmark (Intake ✓) once complete.</li>
<li class="mb-2">
On the intake form you will see:
<ul class="mt-1">
<li>A <strong>Job Summary</strong> card showing expected part count (from line items), due date, and any special instructions.</li>
<li><strong>Actual Part Count</strong> — enter the number of pieces physically received. If this differs from the expected count, a warning appears prompting you to note the discrepancy.</li>
<li><strong>Condition Notes</strong> — describe the condition of the parts (existing scratches, rust, missing hardware, special handling requirements, etc.).</li>
<li><strong>Advance to In Preparation</strong> — toggle on to automatically move the job status to <em>In Preparation</em> at the same time. Leave off if the customer is dropping parts off early and work hasn't started yet.</li>
<li><strong>Before Photos</strong> — upload photos documenting the condition at drop-off. Photos are saved as "Before" type on the job and appear in the Photos section of Job Details.</li>
</ul>
</li>
<li class="mb-2">Click <strong>Complete Intake</strong>.</li>
</ol>
<h3 class="h6 fw-semibold mt-3 mb-2">Viewing intake records</h3>
<p>
Once an intake is recorded, the <strong>Part Intake</strong> card on the Job Details page shows
the check-in date and time, who performed the intake, the actual part count, and any condition
notes. You can update an existing intake at any time by clicking the <strong>Edit</strong> link
in that card.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
The intake form is optimised for use on a tablet at the front desk — the layout is
touch-friendly and the photo upload works directly from a tablet camera.
</div>
</div>
</section>
<section id="shop-mobile" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-phone text-primary me-2"></i>Shop Mobile
</h2>
<p>
<strong>Shop Mobile</strong> (<a href="/Jobs/ShopMobile">/Jobs/ShopMobile</a>) is a
phone and tablet-optimised view of all active jobs, designed for workers on the shop floor.
Unlike the Shop Display (which is a passive TV view) and the full desktop UI, Shop Mobile is
built for one-handed use — large touch targets, no sidebar, and instant status advancement
with a single tap.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">What you see</h3>
<p>Jobs are grouped by their current status stage and ordered by due date. Each job card shows:</p>
<ul class="mb-3">
<li>A <strong>priority colour strip</strong> on the left edge (green = Low, blue = Normal, orange = High, red = Urgent, purple = Rush)</li>
<li>Job number, customer name, and piece count</li>
<li>Assigned worker, sandblasting/masking flags, and due date</li>
<li>Line items (up to 3 shown; tap the details button for the full list)</li>
<li>Powder colours</li>
<li>Special instructions (amber callout — hard to miss)</li>
<li>An <strong>intake indicator</strong> — a green box icon means parts were checked in; an amber box icon means intake is still pending (tap it to go directly to the intake form)</li>
<li>An <strong>overdue badge</strong> when the due date has passed</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Advancing a job status</h3>
<p>
Each card has a large <strong>Advance to [Next Status]</strong> button. Tap it to move the
job to its next stage. The button shows a spinner while saving, then the page reloads with the
updated status. No login to a desktop required.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Filtering by worker</h3>
<p>
Tap any worker chip in the filter bar at the top to show only jobs assigned to that person.
Tap <strong>All</strong> to return to the full list.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Auto-refresh</h3>
<p>
The page automatically refreshes every 60 seconds so workers always see the current state
without manually reloading. The green pulsing dot in the header indicates auto-refresh is active.
</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-phone flex-shrink-0 mt-1"></i>
<div>
<strong>Tip:</strong> Add Shop Mobile to your phone's home screen using your browser's
"Add to Home Screen" option for quick one-tap access every morning.
Navigate to <a href="/Jobs/ShopMobile">/Jobs/ShopMobile</a> in your mobile browser, then use the share menu to save it.
</div>
</div>
</section>
<section id="blank-work-order" class="mb-5">
<h2 class="h5 fw-semibold mb-3">Blank Work Order</h2>
<p>
The Blank Work Order feature lets you instantly print a pre-formatted paper work order to hand to a
customer at drop-off — before a digital job record has been created. It uses your company logo,
address, and customizable terms so it looks professional right out of the box.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">How to print a blank work order</h3>
<ol>
<li>Go to <strong>Jobs</strong> in the sidebar.</li>
<li>Click the <strong><i class="bi bi-printer"></i> Blank Work Order</strong> button in the top-right toolbar (next to the Jobs Board button).</li>
<li>A PDF opens in a new browser tab — print it or save it to PDF.</li>
</ol>
<p>You can also navigate directly to <a href="/WorkOrder/Blank">/WorkOrder/Blank</a> to open the PDF at any time.</p>
<h3 class="h6 fw-semibold mt-3 mb-2">What's on the work order</h3>
<ul>
<li>Your company logo and address in the header</li>
<li>A <strong>Drop Off Date</strong> field opposite the "WORK ORDER" title</li>
<li>Client Name, Client Phone, and Due Date fields</li>
<li>12-row parts table with columns for Part Description, Color, and Quote</li>
<li>A Notes box for special instructions</li>
<li>Your customizable Terms &amp; Conditions text</li>
<li>A Customer Signature line with Date</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Customizing the work order</h3>
<p>
Go to <strong>Company Settings → PDF Templates → Work Order</strong> to customize:
</p>
<ul>
<li><strong>Accent Color</strong> — the color used for table headers, the title bar, and section labels. Defaults to dark gray.</li>
<li><strong>Terms &amp; Conditions</strong> — up to 2,000 characters of text printed in italic below the notes box. Use this for your shop's standard policies, liability disclaimer, or payment terms.</li>
</ul>
<p>Click <strong>Save</strong> to apply changes, or <strong>Preview</strong> to open the PDF instantly without saving.</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb flex-shrink-0 mt-1"></i>
<div>
<strong>Tip:</strong> Print a stack of blank work orders and keep them at your front counter. When a customer drops off parts, fill one out by hand and staple it to their receipt. Once you create the digital job, attach the signed copy as a photo for your records.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#creating-a-job">Creating a Job</a>
<a class="nav-link py-1 px-3 small text-body" href="#job-status">Job Status</a>
<a class="nav-link py-1 px-3 small text-body" href="#job-priority">Job Priority</a>
<a class="nav-link py-1 px-3 small text-body" href="#job-items">Job Items</a>
<a class="nav-link py-1 px-3 small text-body" href="#converting-from-quote">Converting from a Quote</a>
<a class="nav-link py-1 px-3 small text-body" href="#creating-an-invoice">Creating an Invoice</a>
<a class="nav-link py-1 px-3 small text-body" href="#photos-notes">Photos and Notes</a>
<a class="nav-link py-1 px-3 small text-body" href="#time-and-rework">Time Entries and Rework</a>
<a class="nav-link py-1 px-3 small text-body" href="#job-templates">Job Templates</a>
<a class="nav-link py-1 px-3 small text-body" href="#shop-display-and-board">Shop Display &amp; Priority Board</a>
<a class="nav-link py-1 px-3 small text-body" href="#part-intake">Part Intake</a>
<a class="nav-link py-1 px-3 small text-body" href="#shop-mobile">Shop Mobile</a>
<a class="nav-link py-1 px-3 small text-body" href="#blank-work-order">Blank Work Order</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,215 @@
@{
ViewData["Title"] = "Purchase Orders";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Purchase Orders</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Purchase Orders (POs) are the formal documents you create when ordering supplies from vendors.
Recording POs in the system lets you track exactly what you ordered, from whom, at what price,
and whether the goods have arrived.
</p>
<p>
The PO workflow is designed to eliminate double data entry. When you receive a PO, stock levels
update automatically for any linked inventory items. When you are ready to pay, you can convert
the received PO directly into a vendor bill in Accounts Payable — all the line items, quantities,
and prices carry over without retyping.
</p>
<p>
You can find Purchase Orders under <strong>Inventory &rsaquo; Purchase Orders</strong> in the
left sidebar.
</p>
</section>
<section id="creating-a-po" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Creating a Purchase Order
</h2>
<p>To create a new Purchase Order:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Inventory &rsaquo; Purchase Orders</strong> and click <strong>New PO</strong>.</li>
<li class="mb-2">Select the <strong>Vendor</strong> you are ordering from. The vendor's contact information and default payment terms are pulled in automatically.</li>
<li class="mb-2">Set the <strong>Order Date</strong> (defaults to today) and an optional <strong>Expected Delivery Date</strong>.</li>
<li class="mb-2">
Add line items — click <strong>Add Line</strong> for each product you are ordering:
<ul class="mt-1">
<li>Start typing an item name in the search field to look up items from your inventory. If the item exists, select it to link the PO line directly to your stock record.</li>
<li>If the item is not in your inventory yet (a new product), enter a description manually. You can create the inventory item later after receiving the goods.</li>
<li>Enter the <strong>Quantity Ordered</strong> and <strong>Unit Price</strong> for each line.</li>
</ul>
</li>
<li class="mb-2">Enter a <strong>Shipping Cost</strong> if the vendor charges for delivery. This is added to the PO total.</li>
<li class="mb-2">Add any <strong>Notes for the Vendor</strong> — these appear on the printed PO document.</li>
<li class="mb-2">Add any internal <strong>Notes</strong> for your own team (not shown to the vendor).</li>
<li class="mb-2">Click <strong>Save PO</strong>. The PO is saved as a Draft.</li>
</ol>
<p>
A PO number is generated automatically in a sequential format. You can reference this number
when communicating with the vendor.
</p>
</section>
<section id="submitting-a-po" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-send text-primary me-2"></i>Submitting a PO
</h2>
<p>
When you are ready to place the order with the vendor, open the PO and click <strong>Submit</strong>.
This changes the status from Draft to Submitted, recording that the order has been officially placed.
</p>
<p>
Submitting is an internal tracking step in the system. The system does not automatically contact
the vendor. To send the order to your vendor, use one of the following methods:
</p>
<ul class="mb-3">
<li class="mb-1">Click <strong>Download PDF</strong> on the PO Details page to generate a print-ready document, then email or fax it to your vendor.</li>
<li class="mb-1">Phone the vendor and use the PO number as the reference for your verbal order.</li>
</ul>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
A Submitted PO is locked for editing. If you need to change quantities or pricing after
submitting, cancel the PO and create a new one, or contact your vendor to confirm any
changes by phone and update your records accordingly once the goods arrive.
</div>
</div>
</section>
<section id="receiving-a-po" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-box-seam text-primary me-2"></i>Receiving a PO
</h2>
<p>
When the ordered goods arrive, open the Submitted PO and click <strong>Receive</strong>.
This records the receipt of goods and updates your inventory stock levels.
</p>
<ol class="mb-3">
<li class="mb-2">Open the submitted PO from <strong>Inventory &rsaquo; Purchase Orders</strong>.</li>
<li class="mb-2">Click <strong>Receive</strong>.</li>
<li class="mb-2">Review the received quantities. If all items have arrived as ordered, confirm and save. If only some items have arrived (a partial shipment), adjust the received quantities for each line accordingly.</li>
<li class="mb-2">Click <strong>Confirm Receipt</strong>.</li>
</ol>
<p>
For any PO lines that are linked to inventory items, the quantity on hand is increased
automatically by the received amount. The PO status changes to <strong>Received</strong> if
all items are fully received, or <strong>Partially Received</strong> if some are still
outstanding. Partially received POs remain open until the remaining items arrive.
</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
Always check the physical goods against the PO before confirming receipt. Receiving an
incorrect quantity will update your stock levels immediately. If there is a discrepancy,
contact the vendor first and adjust the received quantity to match what actually arrived.
</div>
</div>
</section>
<section id="creating-a-bill" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-file-earmark-text text-primary me-2"></i>Creating a Bill from a PO
</h2>
<p>
After a PO has been received, you can convert it into a vendor bill in Accounts Payable with
one click — no need to re-enter any of the line item details.
</p>
<ol class="mb-3">
<li class="mb-2">Open the received PO and click <strong>Create Bill</strong>.</li>
<li class="mb-2">
The system creates a new vendor bill pre-filled with:
<ul class="mt-1">
<li>All PO line items, quantities, and unit prices</li>
<li>The vendor's default expense account for each line (can be overridden)</li>
<li>The vendor's payment terms and a calculated due date</li>
</ul>
</li>
<li class="mb-2">Review the bill — confirm the due date, check that expense accounts are correct, and add any notes.</li>
<li class="mb-2">Click <strong>Save Bill</strong>. The bill is saved as a Draft in Accounts Payable.</li>
<li class="mb-2">When you have verified the bill against the vendor's paper invoice, click <strong>Mark as Open</strong> to post it to your AP ledger. See the <a asp-controller="Help" asp-action="AccountsPayable">Accounts Payable help page</a> for details.</li>
</ol>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
The PO and the bill remain linked in the system. From the bill you can navigate back to
the originating PO, and from the PO you can see the bill status. This makes it easy to
match vendor invoices to your purchase records during bookkeeping.
</div>
</div>
</section>
<section id="po-statuses" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-tag text-primary me-2"></i>PO Statuses
</h2>
<p>
Purchase Orders move through the following statuses as they progress from planning to receipt.
</p>
<div class="table-responsive">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width:30%">Status</th>
<th>What it means</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-secondary">Draft</span></td>
<td>The PO is being prepared. It has not been sent to the vendor and can be edited freely.</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark">Submitted</span></td>
<td>The order has been placed with the vendor. The PO is locked and is awaiting delivery.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Partially Received</span></td>
<td>Some items from the order have arrived but others are still outstanding. The PO remains open.</td>
</tr>
<tr>
<td><span class="badge bg-success">Received</span></td>
<td>All ordered items have been received and stock levels have been updated. Ready to create a bill.</td>
</tr>
<tr>
<td><span class="badge bg-danger">Cancelled</span></td>
<td>The order was cancelled before receipt. No stock changes are made. The PO is kept for record-keeping.</td>
</tr>
</tbody>
</table>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#creating-a-po">Creating a Purchase Order</a>
<a class="nav-link py-1 px-3 small text-body" href="#submitting-a-po">Submitting a PO</a>
<a class="nav-link py-1 px-3 small text-body" href="#receiving-a-po">Receiving a PO</a>
<a class="nav-link py-1 px-3 small text-body" href="#creating-a-bill">Creating a Bill from a PO</a>
<a class="nav-link py-1 px-3 small text-body" href="#po-statuses">PO Statuses</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,423 @@
@{
ViewData["Title"] = "Quotes";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Quotes</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Quotes let you provide customers and prospects with a formal price estimate before work begins.
The quoting engine calculates material costs, labor, equipment time, overhead, and profit margin
automatically based on the surface area and complexity you enter — no spreadsheet required.
</p>
<p>
Quotes can be created for existing customers or for <strong>prospects</strong> — people or
businesses who have not yet become customers. Prospect quotes let you capture all contact details
and pricing in one place so nothing is lost while you are waiting for a decision. If the prospect
accepts, you can convert them to a customer and the quote to a job in just a few clicks.
</p>
<p>
You can find Quotes under <strong>Operations &rsaquo; Quotes</strong> in the left sidebar.
The list is searchable by quote number or customer name, and filterable by status.
</p>
</section>
<section id="creating-a-quote" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Creating a Quote
</h2>
<p>To create a new quote:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Operations &rsaquo; Quotes</strong> and click <strong>New Quote</strong>.</li>
<li class="mb-2">
Choose whether this quote is for an existing <strong>Customer</strong> or a <strong>Prospect</strong>:
<ul class="mt-1">
<li><strong>Customer</strong> — select from your existing customer list. The customer's pricing tier discount is applied automatically.</li>
<li><strong>Prospect</strong> — enter their first name, last name, company name (optional), email, and phone. These details are stored on the quote and can be used to create a customer record later.</li>
</ul>
</li>
<li class="mb-2">Set the <strong>Quote Date</strong> (defaults to today) and the <strong>Expiry Date</strong> (defaults to the system's configured validity period).</li>
<li class="mb-2">Add a <strong>Subject</strong> or description to identify the work being quoted.</li>
<li class="mb-2">Add one or more <strong>Line Items</strong> — see the Quote Items section below for item types.</li>
<li class="mb-2">Add any <strong>Notes</strong> for the customer (these appear on the printed quote).</li>
<li class="mb-2">Add any internal <strong>Notes</strong> that are for your team only.</li>
<li class="mb-2">Click <strong>Save Quote</strong>. The quote is saved as a Draft.</li>
</ol>
<p>
The system automatically generates a unique quote number in the format <code>QT-YYMM-####</code>
(for example, <code>QT-2503-0015</code>).
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
You can save a quote as a Draft and come back to it later. Drafts are not visible to customers
and do not count as sent until you explicitly click <strong>Send Quote</strong>.
</div>
</div>
</section>
<section id="quote-items" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-list-check text-primary me-2"></i>Quote Items
</h2>
<p>
Each line item on a quote describes a distinct piece or group of parts to be coated. Items are
added using the item wizard, which walks you through selecting the type, entering details, and
choosing coatings and prep services. The total price updates in real time as you enter information.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Item Types</h3>
<div class="row g-3 mb-3">
<div class="col-md-4">
<div class="card border-primary border-opacity-25 h-100">
<div class="card-header bg-primary bg-opacity-10 fw-semibold small">
<i class="bi bi-calculator me-1"></i> Calculated
</div>
<div class="card-body small">
Enter the surface area in square feet, quantity, and complexity. The system calculates
material cost, labor, and equipment time automatically. Choose one or more coatings
and optional prep services (sandblasting, masking, cleaning). Best for standard
powder coating work where you know the dimensions.
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-secondary border-opacity-25 h-100">
<div class="card-header bg-secondary bg-opacity-10 fw-semibold small">
<i class="bi bi-pencil me-1"></i> Custom Work
</div>
<div class="card-body small">
Enter a free-text description and type a price manually. Use this for one-off work,
repairs, or services that do not fit the standard surface-area calculation model.
No automatic pricing calculation — you set the price directly.
</div>
</div>
</div>
<div class="col-md-4">
<div class="card border-success border-opacity-25 h-100">
<div class="card-header bg-success bg-opacity-10 fw-semibold small">
<i class="bi bi-camera me-1"></i> AI Photo Quote
</div>
<div class="card-body small">
Upload photos of the parts and let the AI estimate the surface area and complexity.
The AI analyses the images and returns a suggested surface area (sq ft), complexity
rating, estimated minutes, and a confidence score. You can review and override any
value before accepting the estimate. Up to two follow-up rounds of questions are
supported.
</div>
</div>
</div>
</div>
<h3 class="h6 fw-semibold mt-3 mb-2">Coatings and Prep Services</h3>
<p>
For Calculated and AI Photo items, after entering the surface area you proceed to the coatings
step. Select one or more powder coatings from your inventory. The wizard shows how much powder
will be needed per coat based on the coverage rate and your surface area. You then choose any
prep services — sandblasting, masking, and/or cleaning — that will be performed before coating.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Save to Product Catalog</h3>
<p>
After completing the prep services step, Calculated and AI Photo items display one final step:
<strong>Save to Product Catalog?</strong> This lets you add the item directly to your catalog
so it can be reused on future quotes and jobs without re-entering all the details.
</p>
<ul>
<li>The item <strong>Name</strong> is pre-filled from your description (or the AI-generated description for AI Photo items).</li>
<li>The <strong>Default Price</strong> is pre-filled with the accepted price for AI Photo items. For Calculated items, enter a fixed catalog price (the system-calculated price varies by dimensions, so a flat catalog price is set by you).</li>
<li>Choose a <strong>Category</strong> from your existing catalog categories.</li>
<li>Optionally add or edit a <strong>Description</strong> and flag whether the item typically requires sandblasting or masking.</li>
<li>Click <strong>Save to Catalog &amp; Add</strong> to save the item to the catalog and add it to the quote simultaneously.</li>
<li>Click <strong>Skip — Add to Quote Only</strong> to add the item to this quote without saving it to the catalog.</li>
</ul>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-3" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Catalog item prices are final.</strong> When a catalog item is added to a quote or job,
the price you entered is used exactly as-is — no markup, no prep service charges, and no
complexity adjustments are added on top. Make sure the price you save already includes your
labor, materials, and margin.
</div>
</div>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-bookmark-star-fill flex-shrink-0 mt-1"></i>
<div>
The catalog save happens <strong>immediately</strong> — the item is added to your catalog even
if you later abandon the quote. This is intentional: once you take the time to describe and
price a part, it's worth keeping for next time. Manage saved items at
<a href="/CatalogItems">Catalog Items</a>.
</div>
</div>
<div class="alert alert-permanent alert-warning d-flex gap-2 mt-3 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
The live pricing calculator at the bottom of the quote form updates the subtotal, discounts,
tax, and grand total every time you add or change a line item. There is no need to manually
recalculate — the total shown when you save is the total the customer will see.
</div>
</div>
</section>
<section id="quote-statuses" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-tag text-primary me-2"></i>Quote Statuses
</h2>
<p>
Quotes move through a series of statuses that reflect where they are in the approval process.
Each status is shown as a color-coded badge on the quote list and details page.
</p>
<div class="table-responsive">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr>
<th style="width:30%">Status</th>
<th>What it means</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-secondary">Draft</span></td>
<td>The quote is being prepared. It has not been sent to the customer and can be edited freely.</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark">Sent</span></td>
<td>The quote has been delivered to the customer and is awaiting their response.</td>
</tr>
<tr>
<td><span class="badge bg-success">Approved</span></td>
<td>The customer has accepted the quote and authorised the work. Ready to convert to a job.</td>
</tr>
<tr>
<td><span class="badge bg-danger">Rejected</span></td>
<td>The customer has declined the quote. Useful to track win/loss rates over time.</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Expired</span></td>
<td>The quote's validity period has passed without a customer decision. Pricing may need to be revised before resubmitting.</td>
</tr>
<tr>
<td><span class="badge bg-primary">Converted</span></td>
<td>The quote was approved and converted into a job. The quote is now linked to the resulting job record.</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="sending-a-quote" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-send text-primary me-2"></i>Sending a Quote
</h2>
<p>
Once a quote is saved as a Draft and you are happy with the pricing and details, you can mark it
as sent to the customer.
</p>
<ol class="mb-3">
<li class="mb-2">Open the quote from the Quotes list and go to its Details page.</li>
<li class="mb-2">Click <strong>Send Quote</strong>. The status changes from Draft to Sent.</li>
<li class="mb-2">If email notifications are configured for your company, the customer will automatically receive an email with the quote details.</li>
</ol>
<p>
You can also manually mark a quote as <strong>Approved</strong> or <strong>Rejected</strong> when
you hear back from the customer verbally or by phone, without going through a formal email send.
Use the status buttons on the quote Details page to do this.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
You can download a PDF of any quote to print or send via your own email client. Click the
<strong>Download PDF</strong> button on the quote Details page.
</div>
</div>
</section>
<section id="converting-to-job" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-arrow-right-circle text-primary me-2"></i>Converting to a Job
</h2>
<p>
When a quote is in the <strong>Approved</strong> status, you can convert it to a job in one click.
</p>
<ol class="mb-3">
<li class="mb-2">Open the approved quote and go to its Details page.</li>
<li class="mb-2">Click <strong>Convert to Job</strong>.</li>
<li class="mb-2">
A new job is created automatically, pre-filled with:
<ul class="mt-1">
<li>All line items from the quote (surface areas, quantities, coatings, prep services)</li>
<li>The final pricing calculated on the quote</li>
<li>The customer the quote was linked to</li>
</ul>
</li>
<li class="mb-2">Set the job's scheduled date, priority, and assigned worker, then save.</li>
</ol>
<p>
The quote status changes to <strong>Converted</strong> and a link to the new job appears on the
quote Details page. The job record also shows which quote it originated from.
</p>
</section>
<section id="prospect-conversion" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-person-check text-primary me-2"></i>Converting a Prospect to a Customer
</h2>
<p>
If a quote was created for a prospect (not yet in your customer list) and they decide to go ahead,
you can convert the prospect to a full customer record before converting the quote to a job.
</p>
<ol class="mb-3">
<li class="mb-2">Open the approved prospect quote.</li>
<li class="mb-2">Click <strong>Convert Prospect to Customer</strong>.</li>
<li class="mb-2">
The system opens a pre-filled customer creation form using the prospect's details from the
quote (name, company, email, phone). Review and complete any missing fields such as address,
customer type, or pricing tier.
</li>
<li class="mb-2">Save the new customer record.</li>
<li class="mb-2">The quote is now linked to the new customer. You can then click <strong>Convert to Job</strong> as normal.</li>
</ol>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Only <strong>Approved</strong> prospect quotes show the Convert Prospect to Customer button.
If the quote is still in Draft or Sent status, approve it first before converting.
</div>
</div>
</section>
<section id="customer-approval-portal" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-person-check text-primary me-2"></i>Customer Approval Portal
</h2>
<p>
When you send a quote by email, the customer receives a link to a self-service approval portal
at <strong>/QuoteApproval</strong>. No login is required — the link is unique to that quote.
</p>
<p>From the approval portal the customer can:</p>
<ul class="mb-3">
<li class="mb-1">View the full quote with pricing breakdown.</li>
<li class="mb-1">Click <strong>Approve</strong> to accept the quote (status changes to Approved automatically).</li>
<li class="mb-1">Click <strong>Reject</strong> with an optional reason.</li>
<li class="mb-1">Pay a deposit online (if Stripe Connect is configured).</li>
</ul>
<p>
When a customer approves or rejects via the portal, you receive a notification and the quote
status updates in real time. You can then convert an approved quote to a job without needing
to contact the customer.
</p>
<p>
Approval links expire after the number of days configured in
<strong>Settings &rsaquo; App Settings &rsaquo; Quote Approval Token Days</strong> (default: 30 days).
</p>
</section>
<section id="deposits" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-piggy-bank text-primary me-2"></i>Deposits on Quotes
</h2>
<p>
You can record a deposit against an approved quote from the Quote Details page using the
<strong>Record Deposit</strong> button in the Deposits card. This is useful when a customer
pays a deposit before you start work and before a job or invoice has been created.
</p>
<p>
Deposits recorded on a quote carry over to the linked job automatically when you convert
the quote. They are then applied as payments when an invoice is created from that job.
</p>
</section>
<section id="pricing-breakdown" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-bar-chart text-primary me-2"></i>Understanding the Pricing Breakdown
</h2>
<p>
On the Quote Details page, a full pricing breakdown section shows exactly how the grand total was
calculated. This transparency is useful when explaining pricing to customers and when reviewing
whether your rates are covering costs. The breakdown includes:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Material Costs</strong> — powder and consumables cost based on surface area and the configured cost-per-sq-ft rate.</li>
<li class="mb-1"><strong>Shop Supplies</strong> — a small percentage of material and labor costs covering miscellaneous shop consumables (tape, abrasives, etc.).</li>
<li class="mb-1"><strong>Labor Costs</strong> — base labor calculated from estimated job minutes. Sandblasting prep is charged at 1.5× the standard labor rate; masking at 0.5×. Additional coats beyond the first are charged at the configured additional coat labor percentage.</li>
<li class="mb-1"><strong>Equipment Costs</strong> — hourly rates for the curing oven, sandblaster, and coating booth, applied for the estimated time each piece of equipment is in use.</li>
<li class="mb-1"><strong>Complexity Adjustment</strong> — a percentage added based on the item's complexity rating (Simple, Moderate, Complex, or Extreme). Simple items have no adjustment; Extreme items can add 25% or more.</li>
<li class="mb-1"><strong>General Markup</strong> — your configured profit percentage applied to the cost subtotal. The exact formula depends on the <em>Pricing Mode</em> set in Company Settings: <em>Markup on Materials</em> adds the percentage on top of costs; <em>Target Margin on Total Cost</em> back-calculates price from a gross-margin target.</li>
<li class="mb-1"><strong>Rush Charge</strong> — applied automatically to jobs with Rush or Urgent priority, either as a percentage or a fixed amount depending on your settings.</li>
<li class="mb-1"><strong>Pricing Tier Discount</strong> — if the customer has a pricing tier assigned (e.g., Preferred Shop — 10% off), the discount is shown as a line item reduction. See <em>Hide Discount from Customer</em> below to control whether this line appears on the customer-facing PDF.</li>
<li class="mb-1"><strong>Tax</strong> — the configured tax rate applied to the final subtotal. Zero for tax-exempt customers.</li>
<li class="mb-1"><strong>Grand Total</strong> — the amount the customer will be invoiced.</li>
</ul>
<h3 class="h6 fw-semibold mt-4 mb-2">Per-Item Cost Breakdown</h3>
<p>
Each line item on the Quote Details page can be expanded to show a cost breakdown for that
individual item — click the row to open it. The per-item breakdown shows how material, labor,
equipment, complexity, and markup were calculated for that specific piece. This is useful for
spotting underpriced items or understanding where costs are concentrated across a multi-item quote.
</p>
<h3 class="h6 fw-semibold mt-4 mb-2">Hide Discount from Customer</h3>
<p>
When creating or editing a quote, you can check <strong>Hide Discount from Customer</strong>.
When this option is enabled:
</p>
<ul class="mb-3">
<li class="mb-1">The pricing tier discount line is <strong>not shown</strong> on the customer-facing quote PDF or on the online approval portal.</li>
<li class="mb-1">The discount is <strong>still applied</strong> to the total — the customer pays the discounted price, they just don&rsquo;t see the discount as a separate line item.</li>
<li class="mb-1">The full breakdown (including the discount) remains visible to your staff on the internal Quote Details page.</li>
</ul>
<p>
Use this when you want to honor a negotiated rate or volume discount without advertising
your tier structure to the customer.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
All rates used in the breakdown — labor, equipment, markup, shop supplies, complexity multipliers,
rush charge, and tax — are configured in <strong>Settings &rsaquo; Company Settings &rsaquo; Operating Costs</strong>.
See the <a asp-controller="Help" asp-action="Settings">Settings help page</a> for details on Pricing Mode and all rate settings.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#creating-a-quote">Creating a Quote</a>
<a class="nav-link py-1 px-3 small text-body" href="#quote-items">Quote Items</a>
<a class="nav-link py-1 px-3 small text-body" href="#quote-statuses">Quote Statuses</a>
<a class="nav-link py-1 px-3 small text-body" href="#sending-a-quote">Sending a Quote</a>
<a class="nav-link py-1 px-3 small text-body" href="#converting-to-job">Converting to a Job</a>
<a class="nav-link py-1 px-3 small text-body" href="#prospect-conversion">Converting a Prospect</a>
<a class="nav-link py-1 px-3 small text-body" href="#customer-approval-portal">Approval Portal</a>
<a class="nav-link py-1 px-3 small text-body" href="#deposits">Deposits</a>
<a class="nav-link py-1 px-3 small text-body" href="#pricing-breakdown">Pricing Breakdown</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,271 @@
@{
ViewData["Title"] = "Reports";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Reports</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
The Reports section gives you financial summaries, operational insights, and AI-powered analysis
of your business. Reports are organized on the landing page by category — Financial, Operations,
and AI-Powered. Most reports are read-only views of live data and support PDF export.
</p>
<p>
You can find Reports under <strong>Reports</strong> in the left sidebar, which opens the
<strong>Reports Landing</strong> page at <strong>/Reports/Landing</strong>.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Reports are read-only. To correct underlying data, navigate to the relevant module
(Jobs, Invoices, Inventory, etc.) and edit the record there.
</div>
</div>
</section>
<section id="financial-reports" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-currency-dollar text-primary me-2"></i>Financial Reports
</h2>
<h3 class="h6 fw-semibold mt-3 mb-2">KPI Dashboard</h3>
<p>
A high-level scorecard showing your most important metrics at a glance — open jobs, pending
quotes, outstanding invoices, and recent revenue. Good for a quick daily check-in.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Full Analytics</h3>
<p>
Detailed charts and KPI cards for the selected date range:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Total Invoiced</strong> — total value of all invoices created in the period.</li>
<li class="mb-1"><strong>Total Collected</strong> — total payments actually received.</li>
<li class="mb-1"><strong>Outstanding AR</strong> — current total of all unpaid invoices (always reflects today's balance, not filtered by date).</li>
<li class="mb-1"><strong>Overdue Balance</strong> — portion of AR where the due date has passed.</li>
<li class="mb-1"><strong>Monthly Invoiced vs. Collected chart</strong> — side-by-side bar chart by month; shows if collections are lagging behind invoicing.</li>
</ul>
<p>
The <strong>AI Financial Summary</strong> button in this view generates a plain-English narrative
of your financial performance using AI — useful for a quick briefing before a meeting. See the
<a href="#ai-reports">AI-Powered Reports</a> section below.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Profit &amp; Loss</h3>
<p>
Revenue vs. expenses over a selected period. Shows gross revenue from invoices and a breakdown
of expenses by account category. Supports PDF export for your accountant.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Balance Sheet</h3>
<p>
A snapshot of assets, liabilities, and equity as of a specific date. Assets include your
Accounts Receivable balance; liabilities include your Accounts Payable balance.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">AR Aging</h3>
<p>
Breaks down all outstanding invoices by how long they have been overdue:
<strong>Current</strong> (not yet due), <strong>130 days</strong>,
<strong>3160 days</strong>, <strong>6190 days</strong>, and <strong>90+ days</strong>.
Focus collection efforts on the 6190 and 90+ columns first.
</p>
<p>
The AR Aging page also has an <strong>AI AR Follow-Up</strong> button that drafts a
collection email for any overdue invoice — the tone automatically scales with how overdue
the invoice is (gentle reminder at 7 days, firmer at 30+).
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Sales &amp; Income</h3>
<p>
Revenue trends broken down by period (monthly or quarterly). Use this to spot seasonal
patterns in your job volume and revenue.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Revenue Trends</h3>
<p>
A charting view of monthly and quarterly revenue over time. Useful for year-over-year
comparisons and trend spotting.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Top Outstanding Customers</h3>
<p>
Ranked list of customers with the highest current outstanding balances. Use this to quickly
identify who to call when you need to improve cash flow.
</p>
</section>
<section id="operations-reports" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-briefcase text-primary me-2"></i>Operations Reports
</h2>
<h3 class="h6 fw-semibold mt-3 mb-2">Operations Report</h3>
<p>
A comprehensive view of job throughput, status distribution, and workload for the selected
period. Key metrics include:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Job counts by status</strong> — how many jobs are in each stage. A high count in one status can indicate a bottleneck.</li>
<li class="mb-1"><strong>Open, Completed, On Hold, and Overdue counts</strong> — KPI cards for the overall health of your job queue.</li>
<li class="mb-1"><strong>Job counts by priority</strong> — how many jobs are at each level (Low/Normal/High/Urgent/Rush).</li>
<li class="mb-1"><strong>Average completion time</strong> — average days from job creation to Completed status. Use as a baseline for quoting lead times.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Customer Overview</h3>
<p>
Top customers by revenue, job count, and outstanding balance. Helps you understand which
customers drive the most business and which have the largest open accounts.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Job Cycle Time Report</h3>
<p>
Shows how long jobs spend in each status on average. Use this to identify where jobs tend
to slow down — for example, if jobs spend an unusually long time in Sandblasting, that
stage may need more capacity.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Powder Usage Report</h3>
<p>
Tracks powder consumption by inventory item and by job. Useful for verifying that actual
powder usage matches estimates, identifying waste, and planning purchasing.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Inventory Snapshot</h3>
<p>Key inventory metrics including:</p>
<ul class="mb-3">
<li class="mb-1"><strong>Total inventory value</strong> — on-hand quantity × unit cost for all items.</li>
<li class="mb-1"><strong>Items below reorder point</strong> — items currently flagged as low stock.</li>
<li class="mb-1"><strong>Recent transaction summary</strong> — log of recent stock movements.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Equipment &amp; Maintenance Report</h3>
<p>Equipment health overview for maintenance supervisors:</p>
<ul class="mb-3">
<li class="mb-1"><strong>Equipment status distribution</strong> — how many machines are Operational, Needs Maintenance, Under Maintenance, etc.</li>
<li class="mb-1"><strong>Upcoming maintenance tasks</strong> — scheduled tasks due soon.</li>
<li class="mb-1"><strong>Overdue maintenance tasks</strong> — tasks past their scheduled date that are not yet complete.</li>
</ul>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Most reports support a date range filter. Set a <strong>From</strong> and <strong>To</strong>
date and click <strong>Apply</strong> to narrow the data to that period. Useful date ranges:
this month (1st to today), last month, year to date (Jan 1 to today), or full prior year.
</div>
</div>
</section>
<section id="ai-reports" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-robot text-primary me-2"></i>AI-Powered Reports
</h2>
<p>
Several reports use AI (Claude by Anthropic) to analyze your data and return insights in plain
English. These are found either on the Reports landing page or as buttons within other reports.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">AI Financial Summary</h3>
<p>
Generates a plain-English narrative of your financial performance — revenue trends, collection
rate, outstanding AR, and notable patterns. Accessible from the <strong>Full Analytics</strong>
view via the "Generate AI Summary" button. Useful for summarizing performance before a meeting
or for stakeholders who prefer prose over tables.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Cash Flow Forecast</h3>
<p>
Projects your cash position over the next 30, 60, and 90 days based on:
</p>
<ul class="mb-3">
<li class="mb-1">Open accounts receivable (invoices expected to be paid)</li>
<li class="mb-1">Open accounts payable (bills coming due)</li>
<li class="mb-1">Active job pipeline (potential future revenue)</li>
</ul>
<p>
The forecast includes an <strong>outlook badge</strong> — Strong, Moderate, Tight, or
Concerning — based on the projected net cash position at each interval.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Anomaly Detection</h3>
<p>
Scans the last 90 days of bills for unusual patterns and flags them for review:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Duplicate bills</strong> — same vendor, similar amount, close dates.</li>
<li class="mb-1"><strong>Amount spikes</strong> — a vendor bill significantly higher than their usual amounts.</li>
<li class="mb-1"><strong>Unusual vendors</strong> — vendors you have not used before or rarely use.</li>
<li class="mb-1"><strong>Account overruns</strong> — expense accounts with spending well above their typical level.</li>
</ul>
<p>Flags are sorted by severity. Review and dismiss any that are expected or already explained.</p>
<h3 class="h6 fw-semibold mt-3 mb-2">AI AR Follow-Up Emails</h3>
<p>
Drafts a collection email for overdue invoices directly from the <strong>AR Aging</strong> report.
Click the envelope icon next to any overdue invoice to generate a draft. The tone scales with
how many days overdue the invoice is — a gentle nudge at 7 days, a firmer reminder at 30+.
You can edit the draft before sending.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Powder Insights</h3>
<p>
An AI-powered analysis of your powder usage patterns, efficiency, and cost optimization,
accessible at <strong>/PowderInsights</strong> from the Equipment section of the sidebar.
Requires at least 10 jobs with powder data; predictive cost-optimization features unlock
at 150 jobs.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
AI reports require the Anthropic API key to be configured. If you see a "not configured"
message, contact your system administrator to set up the key under
<strong>Settings &rsaquo; Company Settings</strong>.
</div>
</div>
</section>
<section id="pdf-export" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-file-earmark-pdf text-primary me-2"></i>PDF Export
</h2>
<p>
Most financial reports (P&amp;L, Balance Sheet, AR Aging, and others) include a
<strong>Download PDF</strong> button. Use this to generate a print-ready version for your
accountant, a business review, or your own records.
</p>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#financial-reports">Financial Reports</a>
<a class="nav-link py-1 px-3 small text-body" href="#operations-reports">Operations Reports</a>
<a class="nav-link py-1 px-3 small text-body" href="#ai-reports">AI-Powered Reports</a>
<a class="nav-link py-1 px-3 small text-body" href="#pdf-export">PDF Export</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,599 @@
@{
ViewData["Title"] = "Settings";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Settings</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
The Settings section is where Administrators and Managers configure how the system behaves for
your company. Settings control everything from the company name that appears on your printed
documents to the pricing rates used in every quote the system generates.
</p>
<p>
Changes in Settings take effect immediately and apply to all users in your company. Because
changes are company-wide, only users with the <strong>Administrator</strong> or
<strong>Manager</strong> role can access the Settings section. Users with lower permission
levels will not see the Settings link in the navigation.
</p>
<p>
You can find Settings under <strong>Settings</strong> in the left sidebar.
</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
Take care when changing pricing rates (labor, equipment, overhead, margins) in Settings.
Existing quotes and invoices are not retroactively recalculated — only new quotes created
after the change will use the updated rates. If you need to reprice an existing quote,
open it and recalculate manually.
</div>
</div>
</section>
<section id="company-information" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-building text-primary me-2"></i>Company Information
</h2>
<p>
Set your company's basic contact information. This data appears on all customer-facing documents
— quotes, invoices, and PDFs — so it is important to keep it accurate and professional.
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Company Name</strong> — appears in the page header and on all printed documents.</li>
<li class="mb-1"><strong>Address</strong> — your shop's street address, city, state, and ZIP code. Printed on quotes and invoices.</li>
<li class="mb-1"><strong>Phone</strong> — your main business phone number.</li>
<li class="mb-1"><strong>Email</strong> — your business email address. Used as the reply-to address for notifications sent to customers.</li>
<li class="mb-1"><strong>Website</strong> — optional. Shown on printed documents if entered.</li>
<li class="mb-1"><strong>Company Logo</strong> — upload a logo image (PNG or JPG recommended). The logo appears in the top-left corner of the sidebar and at the top of all printed quotes, invoices, and PDFs.</li>
</ul>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
For the best appearance on printed documents, use a logo image with a transparent background
(PNG format) and a minimum width of 300 pixels. Very small or low-resolution logos may
appear blurry on PDF printouts.
</div>
</div>
</section>
<section id="pricing-configuration" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-sliders text-primary me-2"></i>Pricing Configuration
</h2>
<p>
Pricing Configuration defines the rates used by the quoting engine to automatically calculate
the cost of every quote. You can find these settings under <strong>Settings &rsaquo; Company Settings &rsaquo; Operating Costs</strong>.
These are your shop's default rates — individual quotes reflect these settings at the time they are created.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Labor</h3>
<ul class="mb-3">
<li class="mb-1"><strong>Standard Labor Rate ($/hr)</strong> — the hourly labor cost applied to all coating work. Sandblasting prep is calculated at 1.5× this rate; masking at 0.5× — these multipliers are built into the pricing engine and are not separately configurable.</li>
<li class="mb-1"><strong>Additional Coat Labor (%)</strong> — the percentage of the base labor cost charged for each coat beyond the first. For example, at 30%, a two-coat job charges 100% labor for the first coat and 30% for the second.</li>
<li class="mb-1"><strong>Per-Role Labor Rates</strong> — you can optionally set a different hourly rate for each shop worker role (Coater, Sandblaster, Masker, etc.). When set, the role-specific rate overrides the standard rate for that type of work. If no role rate is configured, the standard rate is used as the fallback.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Equipment Hourly Rates</h3>
<ul class="mb-3">
<li class="mb-1"><strong>Default Oven Rate ($/hr)</strong> — the cost of running your curing oven per hour. Used when no specific named oven is selected on a quote.</li>
<li class="mb-1"><strong>Sandblaster Rate ($/hr)</strong> — the cost of running the sandblasting equipment per hour.</li>
<li class="mb-1"><strong>Coating Booth Rate ($/hr)</strong> — the cost of running the spray booth per hour.</li>
<li class="mb-1"><strong>Named Ovens</strong> — if your shop has multiple ovens with different capacities or costs, you can add them individually (e.g., "Large Oven — $18/hr, 200 sq ft"). When a named oven is selected on a quote the correct rate is applied automatically.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Material &amp; Shop Supplies</h3>
<ul class="mb-3">
<li class="mb-1"><strong>Powder Coating Cost per Sq Ft ($/sq ft)</strong> — the baseline material cost per square foot of surface area, representing your average powder and consumables cost.</li>
<li class="mb-1"><strong>Shop Supplies Rate (%)</strong> — a percentage applied to material and labor costs to cover miscellaneous shop supplies (abrasives, tape, fasteners, etc.) that are not tracked per-job.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Pricing Mode, Markup, Minimums &amp; Rush Charges</h3>
<ul class="mb-3">
<li class="mb-1">
<strong>Pricing Mode</strong> — controls how the General Markup % is applied:
<ul class="mt-1">
<li><em>Markup on Materials</em> (default) — markup is added on top of costs: <code>price = cost &times; (1 + markup%)</code>. A 25% markup on $100 = $125.</li>
<li><em>Target Margin on Total Cost</em> — markup % is treated as a gross-margin target: <code>price = cost &divide; (1 &minus; margin%)</code>. A 25% margin on $100 = $133.33. Use this mode if you think in terms of gross margin rather than markup.</li>
</ul>
</li>
<li class="mb-1"><strong>General Markup (%)</strong> — your profit percentage. Its exact effect depends on the Pricing Mode selected above.</li>
<li class="mb-1"><strong>Shop Minimum Charge ($)</strong> — a floor price for any job. If the calculated total falls below this amount the minimum charge is used instead. Set to 0 to disable.</li>
<li class="mb-1"><strong>Rush Charge</strong> — an automatic surcharge applied to jobs with Rush or Urgent priority. Choose between a percentage of the quote total or a fixed dollar amount.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Part Complexity Multipliers</h3>
<p>
Each item on a quote is assigned a complexity rating (Simple, Moderate, Complex, or Extreme).
These multipliers add a percentage to the calculated item price to account for the extra handling
and prep time involved with intricate parts.
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Simple (%)</strong> — flat panels, basic shapes. Default: 0% (no adjustment).</li>
<li class="mb-1"><strong>Moderate (%)</strong> — standard brackets, moderate curves. Default: 5%.</li>
<li class="mb-1"><strong>Complex (%)</strong> — intricate assemblies, deep recesses. Default: 15%.</li>
<li class="mb-1"><strong>Extreme (%)</strong> — highly ornate, heavy prep required. Default: 25%.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Tax &amp; Oven Defaults</h3>
<ul class="mb-3">
<li class="mb-1"><strong>Default Tax Rate (%)</strong> — the sales tax percentage applied to quote and invoice totals. Set to 0 if you do not charge tax or handle it separately. Individual customers marked as Tax Exempt will always default to 0% regardless of this setting.</li>
<li class="mb-1"><strong>Default Oven Cycle (minutes)</strong> — the default cure time used when scheduling oven batches. Individual named ovens can have their own default cycle time.</li>
</ul>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
Review your powder cost per sq ft and labor rate at least quarterly. If costs increase and
you do not update these settings, new quotes will underestimate costs and erode your margin.
Existing quotes and invoices are <strong>not</strong> retroactively recalculated when rates change.
</div>
</div>
</section>
<section id="pricing-tiers" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-award text-primary me-2"></i>Pricing Tiers
</h2>
<p>
Pricing Tiers let you offer volume discounts to commercial customers who send you regular work.
You define each tier once in Settings, then assign a tier to each qualifying customer on their
customer record. The quoting engine applies the discount automatically when generating a quote
for that customer — no manual adjustment needed.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Creating a Pricing Tier</h3>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Settings &rsaquo; Pricing Tiers</strong> and click <strong>New Tier</strong>.</li>
<li class="mb-2">Enter a <strong>Tier Name</strong> (e.g., "Preferred Shop", "Volume Partner", "Wholesale").</li>
<li class="mb-2">Enter the <strong>Discount Percentage</strong> (e.g., 10 for a 10% discount).</li>
<li class="mb-2">Add an optional <strong>Description</strong> explaining the criteria for this tier.</li>
<li class="mb-2">Click <strong>Save Tier</strong>.</li>
</ol>
<h3 class="h6 fw-semibold mt-3 mb-2">Assigning a Tier to a Customer</h3>
<p>
Open the customer record you want to assign the tier to, click <strong>Edit</strong>, and select
the pricing tier from the <strong>Pricing Tier</strong> dropdown. Save the customer record. From
that point on, any new quote created for that customer will automatically show the tier discount
in the pricing breakdown.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Pricing tiers only apply to <strong>Commercial</strong> customers. Non-commercial (individual)
customers are always priced at standard rates. If you need to offer a one-off discount to
a non-commercial customer, use a Custom Work item with a manually adjusted price on that
specific quote.
</div>
</div>
</section>
<section id="chart-of-accounts" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-journal-text text-primary me-2"></i>Chart of Accounts
</h2>
<p>
The Chart of Accounts is the master list of all accounting categories used in the system for
tracking income, expenses, and liabilities. Every bill line item is assigned to an account from
this list; every invoice generates an entry in Accounts Receivable; every payment records a
credit to the relevant bank account.
</p>
<p>
Typical accounts for a powder coating shop include:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Accounts Receivable</strong> — money customers owe you (created automatically from invoices).</li>
<li class="mb-1"><strong>Accounts Payable</strong> — money you owe vendors (created automatically from bills).</li>
<li class="mb-1"><strong>Cost of Goods Sold</strong> — direct material costs: powder, primer, consumables used in jobs.</li>
<li class="mb-1"><strong>Shop Supplies</strong> — indirect shop materials not tied to a specific job.</li>
<li class="mb-1"><strong>Equipment Maintenance</strong> — service and repair costs for shop machinery.</li>
<li class="mb-1"><strong>Utilities</strong> — gas, electricity, and water.</li>
<li class="mb-1"><strong>Rent / Occupancy</strong> — monthly rent or lease payments for the shop premises.</li>
<li class="mb-1"><strong>Operating Expenses</strong> — general overhead not covered by other categories.</li>
<li class="mb-1"><strong>Revenue / Sales Income</strong> — income from completed jobs (created automatically from paid invoices).</li>
</ul>
<p>
The chart of accounts is typically configured once during initial setup. You can add new accounts
at any time if your accounting needs expand.
</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Ask your accountant</strong> to review and approve your chart of accounts before
you start entering bills and invoices in production. Changing account names or categories
after transactions have been posted can complicate bookkeeping and tax reporting.
Do not delete accounts that have transactions recorded against them.
</div>
</div>
</section>
<section id="notifications" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-bell text-primary me-2"></i>Notification Settings
</h2>
<p>
The system has two notification channels: the <strong>in-app notification bell</strong> for
real-time activity alerts inside the application, and <strong>email/SMS notifications</strong>
for outbound customer and team communications.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">In-App Notification Bell</h3>
<p>
The bell icon (<i class="bi bi-bell-fill"></i>) in the top-right header appears for all logged-in
users. A badge shows the count of unread notifications. Click it to open the dropdown showing your
20 most recent notifications — both read and unread.
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Unread</strong> notifications have a purple left border, a light indigo background, and a blue dot.</li>
<li class="mb-1"><strong>Read</strong> notifications are dimmed with no border.</li>
<li class="mb-1">Click any notification to open a detail modal. If there is a linked record, click <strong>View</strong> to navigate to it.</li>
<li class="mb-1">Use <strong>Mark all read</strong> to mark everything as read at once.</li>
<li class="mb-1">Click <strong>View all notifications</strong> at the bottom of the dropdown to see your full notification history.</li>
</ul>
<p>The bell fires automatically for <strong>external customer actions</strong> only:</p>
<ul class="mb-3">
<li class="mb-1">Customer <strong>approves</strong> a quote online</li>
<li class="mb-1">Customer <strong>declines</strong> a quote online</li>
<li class="mb-1">Customer <strong>pays an invoice</strong> online via Stripe</li>
<li class="mb-1">Customer <strong>pays a deposit</strong> online via Stripe</li>
<li class="mb-1"><strong>Platform announcement</strong> sent by the Powder Coating Logix team</li>
</ul>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-3" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Staff-recorded payments and deposits do <strong>not</strong> trigger bell notifications — those
are internal actions the staff member is already performing and does not need to be notified about.
</div>
</div>
<h3 class="h6 fw-semibold mt-3 mb-2">Notification History</h3>
<p>
The <a href="/InAppNotifications">Notification History</a> page shows a full paginated list of all
in-app notifications. Unread rows are highlighted. Click any row to open the detail modal, which
also marks the notification as read. Email and SMS notification history is available separately at
<a href="/NotificationLogs">Notification Logs</a>.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Platform Announcements</h3>
<p>
The Powder Coating Logix platform team can send announcements to your company. These are delivered
directly to your notification bell — not as page banners. Announcements may cover scheduled
maintenance, new features, or policy updates. They appear as <strong>Announcement</strong> type
items in your bell dropdown and can be cleared with "Mark all read."
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Email Sender Identity</h3>
<p>
Set the <strong>From Email Address</strong> and <strong>From Display Name</strong> used on all
outgoing emails. If left blank, the system-wide SendGrid sender address is used. Using a
domain-verified address (e.g., <code>billing@yourshop.com</code>) greatly reduces the chance of
your emails landing in customers' spam folders.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Notify On</h3>
<p>
Each toggle controls whether that event type sends a customer-facing or internal notification email:
</p>
<ul class="mb-3">
<li class="mb-1"><strong>New Job</strong> — emails your team when a new job is created.</li>
<li class="mb-1"><strong>New Quote</strong> — emails your team when a new quote is created.</li>
<li class="mb-1"><strong>Job Status Change</strong> — notifies the customer when a job's status changes.</li>
<li class="mb-1"><strong>Quote Approval</strong> — notifies the customer when a quote is approved.</li>
<li class="mb-1"><strong>Payment Received</strong> — sends the customer a payment confirmation email when a payment is recorded against their invoice.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Alert Thresholds</h3>
<p>
These values control how many days <em>before</em> an event the system highlights it as upcoming
in the UI (for example, flagging a quote as expiring soon in the quotes list).
</p>
<ul class="mb-3">
<li class="mb-1"><strong>Quote Expiry Warning (days before)</strong> — quotes expiring within this many days are flagged in the quotes list.</li>
<li class="mb-1"><strong>Due Date Warning (days before)</strong> — invoices coming due within this many days are highlighted.</li>
<li class="mb-1"><strong>Maintenance Alert (days ahead)</strong> — upcoming maintenance tasks scheduled within this many days are highlighted.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Automated Payment Reminders</h3>
<p>
The payment reminder system automatically emails customers when their invoices become overdue.
You control whether this feature is active and exactly how many days past due each reminder fires.
</p>
<ul class="mb-3">
<li class="mb-2">
<strong>Enable Payment Reminders</strong> — master on/off toggle. When off, no automated
reminder emails are sent regardless of the day settings below.
</li>
<li class="mb-2">
<strong>Reminder Days</strong> — a comma-separated list of day milestones (days past the invoice due date)
at which a reminder email is sent. For example, <code>7,14,30</code> sends one reminder at
7 days overdue, another at 14 days, and a final one at 30 days. You can use any positive
whole numbers (e.g., <code>3,10,21,45</code>).
</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">How Payment Reminders Work</h3>
<ol class="mb-3">
<li class="mb-2">Every morning the system checks all invoices that have a due date in the past and are in <strong>Sent</strong>, <strong>Partially Paid</strong>, or <strong>Overdue</strong> status.</li>
<li class="mb-2">For each invoice, it calculates how many days past due it is and checks whether that number matches one of your configured reminder day thresholds.</li>
<li class="mb-2">If a match is found and a reminder has <em>not already been sent today</em> for that invoice and that milestone, the reminder email is sent to the customer.</li>
<li class="mb-2">Customers who have opted out of email notifications are never contacted.</li>
<li class="mb-2">Each reminder sent is recorded in the notification log, visible via <strong>Settings &rsaquo; Notification Templates &amp; Logs</strong>.</li>
</ol>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
Payment reminders are sent once per threshold per invoice — if you have <code>7,14,30</code>
configured, a single invoice will receive at most three reminder emails over the course of its
collection cycle, one at each milestone. An invoice that gets paid between milestones will not
receive any further reminders (its status changes to Paid and it is excluded from future checks).
</div>
</div>
</section>
<section id="named-ovens" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-fire text-primary me-2"></i>Named Ovens
</h2>
<p>
If your shop has more than one curing oven, or if you want to assign specific costs and
capacities to your oven for the Oven Scheduler, configure each oven individually under
<strong>Settings &rsaquo; Company Settings &rsaquo; Named Ovens</strong>.
</p>
<p>For each named oven you can set:</p>
<ul class="mb-3">
<li class="mb-1"><strong>Oven Name</strong> — e.g., "Main Oven", "Small Parts Oven".</li>
<li class="mb-1"><strong>Operating Cost ($/hr)</strong> — the hourly cost to run this specific oven.</li>
<li class="mb-1"><strong>Max Load Capacity (sq ft)</strong> — the maximum total surface area that fits in one batch. The Oven Scheduler uses this to show remaining capacity as you add jobs.</li>
<li class="mb-1"><strong>Default Cycle Time (minutes)</strong> — the default cure duration for this oven, used when scheduling batches.</li>
</ul>
<p>
When a named oven is selected on a quote or job, its specific cost rate is used instead of
the default oven rate. The Oven Scheduler at <strong>/OvenScheduler</strong> uses named ovens
to group and track job batches.
</p>
</section>
<section id="data-lookups" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-list-ul text-primary me-2"></i>Data Lookups
</h2>
<p>
The <strong>Data Lookups</strong> tab in Company Settings lets you customize the dropdown
options that appear throughout the application — job statuses, job priorities, quote statuses,
appointment types, and inventory categories. You can rename labels, change colours, reorder
items, and add new ones to match your shop's terminology.
</p>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-3" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Status codes drive workflow logic</strong> — the underlying code value (e.g.
<code>IN_PROGRESS</code>, <code>COMPLETED</code>) is what the system uses internally.
You can safely rename the display label, but do not change the code of a built-in
status unless you understand the impact on automation and reporting.
</div>
</div>
<h3 class="h6 fw-semibold mt-3 mb-2">Adding a New Lookup Item</h3>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Settings &rsaquo; Company Settings &rsaquo; Data Lookups</strong>.</li>
<li class="mb-2">Select the sub-tab for the lookup type (e.g., Job Statuses, Job Priorities).</li>
<li class="mb-2">Click <strong>Add</strong> to open the form.</li>
<li class="mb-2">Type a <strong>Display Name</strong> — the Code field auto-fills as you type
(e.g., "In Progress" → <code>IN_PROGRESS</code>). You can override it if needed.</li>
<li class="mb-2">Choose a color and fill in any additional fields.</li>
<li class="mb-2">Click <strong>Save</strong>.</li>
</ol>
<h3 class="h6 fw-semibold mt-3 mb-2">About the Code Field</h3>
<p>
Each lookup item has a <strong>Code</strong> — a short uppercase identifier used internally
(e.g., <code>QUALITY_CHECK</code>, <code>URGENT</code>). When adding a new item:
</p>
<ul class="mb-3">
<li class="mb-1">The Code auto-derives from the Display Name as you type — spaces become underscores, everything is uppercased.</li>
<li class="mb-1">You can edit the Code directly; it will stay uppercase and only allow letters, numbers, and underscores.</li>
<li class="mb-1">Once saved, the Code cannot be changed — it is locked to prevent breaking existing records that reference it.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Inventory Categories — Is Coating Flag</h3>
<p>
The <strong>Inventory Categories</strong> sub-tab includes an important flag: <strong>Is Coating</strong>.
Only inventory items whose category has this flag enabled will appear in the powder color dropdown
when building a quote or job. If your powder colors are not showing up in the quote wizard,
go to Data Lookups &rsaquo; Inventory Categories, find the category that holds your powders,
and enable <strong>Is Coating</strong>.
</p>
</section>
<section id="ai-profile" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-robot text-primary me-2"></i>AI Profile
</h2>
<p>
The <strong>AI Profile</strong> tab in Company Settings lets you describe your shop's
specialties, typical work, and pricing preferences in plain text. This context is automatically
included in the system prompt sent to AI for photo quoting — resulting in more accurate and
relevant estimates.
</p>
<p>Examples of useful AI Profile content:</p>
<ul class="mb-3">
<li class="mb-1">"We specialize in automotive parts and wheels. Most items are steel or aluminum."</li>
<li class="mb-1">"Our minimum charge is $75. We charge a 20% premium for intricate wrought iron."</li>
<li class="mb-1">"We rarely do sandblasting in-house — assume parts arrive pre-blasted."</li>
</ul>
<p>
The AI Profile is optional but recommended. The more specific you are, the better the AI
quotes will match your actual pricing. Update it whenever your shop's focus or pricing
strategy changes.
</p>
</section>
<section id="user-management" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-people text-primary me-2"></i>User Management
</h2>
<p>
Manage who has access to your company's account under <strong>Settings &rsaquo; Users</strong>
(or navigate to <a href="/CompanyUsers">/CompanyUsers</a>).
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Adding a User</h3>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Settings &rsaquo; Users</strong> and click <strong>New User</strong>.</li>
<li class="mb-2">Enter the user's name, email address, and select their role.</li>
<li class="mb-2">The system sends an invitation email. The user follows the link to set their password.</li>
</ol>
<h3 class="h6 fw-semibold mt-3 mb-2">Roles</h3>
<div class="table-responsive mb-3">
<table class="table table-sm table-bordered mb-0">
<thead class="table-light">
<tr><th style="width:25%">Role</th><th>Access level</th></tr>
</thead>
<tbody>
<tr><td><span class="badge bg-danger">CompanyAdmin</span></td><td>Full company access including settings, users, and billing.</td></tr>
<tr><td><span class="badge bg-warning text-dark">Manager</span></td><td>Jobs, quotes, invoices, customers, inventory, reports — no settings or user management.</td></tr>
<tr><td><span class="badge bg-primary">Worker</span></td><td>Create and edit jobs and quotes; no settings, billing, or user management.</td></tr>
<tr><td><span class="badge bg-secondary">Viewer</span></td><td>Read-only access to most data.</td></tr>
</tbody>
</table>
</div>
<h3 class="h6 fw-semibold mt-3 mb-2">Resetting a Password</h3>
<p>
Select a user from the list and click <strong>Reset Password</strong>. The user receives
an email with a link to set a new password.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">Deactivating a User</h3>
<p>
Use the active/inactive toggle on the user list or the edit form to deactivate a user.
Deactivated users cannot log in but their records and activity history are preserved.
</p>
</section>
<section id="data-export" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-download text-primary me-2"></i>Download Your Data
</h2>
<p>
Company Administrators can export a complete copy of their company's data at any time from
<a href="/AccountDataExport">Settings &rsaquo; Download Your Data</a> (or navigate directly to
<code>/AccountDataExport</code>). This feature is available even when a subscription has
expired — your data is never locked away.
</p>
<h3 class="h6 fw-semibold mt-3 mb-2">What Can Be Exported</h3>
<p>Choose any combination of the following data types:</p>
<ul class="mb-3">
<li class="mb-1"><strong>Customers</strong> — all customer records including contact info, type, and credit settings.</li>
<li class="mb-1"><strong>Jobs</strong> — all job records with status, priority, assigned worker, and dates.</li>
<li class="mb-1"><strong>Quotes</strong> — all quote records with status and pricing.</li>
<li class="mb-1"><strong>Invoices</strong> — all invoice records with amounts paid and status.</li>
<li class="mb-1"><strong>Inventory</strong> — all inventory items with quantities and costs.</li>
<li class="mb-1"><strong>Equipment</strong> — all equipment records and statuses.</li>
<li class="mb-1"><strong>Vendors</strong> — all vendor/supplier records.</li>
<li class="mb-1"><strong>Shop Workers</strong> — all shop worker records.</li>
<li class="mb-1"><strong>Users / Logins</strong> — all user accounts and their roles.</li>
</ul>
<h3 class="h6 fw-semibold mt-3 mb-2">Export Formats</h3>
<ul class="mb-3">
<li class="mb-1"><strong>Excel (.xlsx)</strong> — all selected data types in a single workbook, one tab per data type. Best for viewing in Excel or Google Sheets.</li>
<li class="mb-1"><strong>CSV (.zip)</strong> — one CSV file per selected data type, bundled into a single ZIP archive. Best for importing into other software.</li>
</ul>
<p>
The export is generated on-demand and delivered directly to your browser. Nothing is stored
on the server — each export is a fresh snapshot of your current data.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
If your subscription has expired and you see the "Subscription Expired" screen, look for the
<strong>Download Your Data</strong> button on that page to access your export without needing
to renew first. Only Company Administrators have access to the data export.
</div>
</div>
</section>
<section id="default-settings" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-toggles text-primary me-2"></i>Default Settings
</h2>
<p>
Default Settings configure system-wide values that are applied automatically whenever a new
record is created. These save time on data entry and ensure consistency across your documents.
You can always override defaults on individual records.
</p>
<ul class="mb-3">
<li class="mb-2">
<strong>Default Quote Validity Period (days)</strong> — the number of days after creation before
a quote expires. For example, a value of 30 means all new quotes expire 30 days after their
quote date. Expired quotes are flagged in the quote list and customers cannot act on them without
you creating a revised quote. Adjust this based on how stable your pricing is — shops with
volatile powder costs may want a shorter validity period (e.g., 14 days).
</li>
<li class="mb-2">
<strong>Default Payment Terms</strong> — the payment terms applied to new customer records
and new invoices (e.g., "Net 30", "Net 15", "Due on Receipt"). This determines when invoices
become due and affects the AR Aging report. The default can be overridden on each customer
record and on individual invoices.
</li>
<li class="mb-2">
<strong>Currency</strong> — the currency symbol and formatting used throughout the system for
all monetary values (e.g., USD, CAD, AUD, GBP). This is a display setting only and does not
perform any currency conversion. Set this once during initial setup to match your local currency.
</li>
</ul>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
Default settings apply only to new records created after the setting is changed. Existing
customers, quotes, and invoices retain whatever payment terms and expiry dates were set
at the time they were created.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#company-information">Company Information</a>
<a class="nav-link py-1 px-3 small text-body" href="#pricing-configuration">Pricing Configuration</a>
<a class="nav-link py-1 px-3 small text-body" href="#pricing-tiers">Pricing Tiers</a>
<a class="nav-link py-1 px-3 small text-body" href="#chart-of-accounts">Chart of Accounts</a>
<a class="nav-link py-1 px-3 small text-body" href="#notifications">Notification Settings</a>
<a class="nav-link py-1 px-3 small text-body" href="#named-ovens">Named Ovens</a>
<a class="nav-link py-1 px-3 small text-body" href="#data-lookups">Data Lookups</a>
<a class="nav-link py-1 px-3 small text-body" href="#ai-profile">AI Profile</a>
<a class="nav-link py-1 px-3 small text-body" href="#user-management">User Management</a>
<a class="nav-link py-1 px-3 small text-body" href="#data-export">Download Your Data</a>
<a class="nav-link py-1 px-3 small text-body" href="#default-settings">Default Settings</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,226 @@
@{
ViewData["Title"] = "Shop Workers";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Shop Workers</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Shop Workers are the people who do the hands-on work in your facility — sandblasters, coaters,
maskers, oven operators, and supervisors. Adding your workers to the system lets you assign them
to jobs and maintenance tasks, giving you a clear picture of who is working on what at any time.
</p>
<p>
Shop Workers are separate from system user accounts. A worker does not need to log into the
system — they are simply a record that can be assigned to work. If a worker also needs to log
in and update job statuses themselves, an Administrator can create a linked user account for
them with the <em>Shop Floor</em> role.
</p>
<p>
Find Shop Workers under <strong>Operations &rsaquo; Shop Workers</strong> in the sidebar.
</p>
</section>
<section id="adding-a-worker" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-person-plus text-primary me-2"></i>Adding a Worker
</h2>
<p>To add a new shop worker:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Operations &rsaquo; Shop Workers</strong> and click <strong>New Worker</strong>.</li>
<li class="mb-2">
Fill in the worker's details:
<ul class="mt-1">
<li><strong>Name</strong> — the worker's full name as it should appear on job assignments.</li>
<li><strong>Role</strong> — select the role that best describes their primary function (see below).</li>
<li><strong>Phone</strong> — optional, useful for supervisors to have on file.</li>
<li><strong>Email</strong> — optional, used if the worker also has a system login.</li>
<li><strong>Notes</strong> — any relevant information, such as certifications, shift preferences, or specialties.</li>
</ul>
</li>
<li class="mb-2">Ensure <strong>Active</strong> is checked (it is on by default).</li>
<li class="mb-2">Click <strong>Save Worker</strong>.</li>
</ol>
<p>
Once saved, the worker will appear in the assignment dropdowns on the Job Create and Edit forms.
</p>
</section>
<section id="worker-roles" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-tags text-primary me-2"></i>Worker Roles
</h2>
<p>
Each worker is assigned one of the following roles. The role is a label — it helps you pick the
right person for a job but does not restrict what a worker can be assigned to.
</p>
<div class="table-responsive">
<table class="table table-bordered align-middle">
<thead class="table-light">
<tr>
<th style="width:25%">Role</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="badge bg-secondary">General Labor</span></td>
<td>
Versatile workers who assist across multiple areas of the shop — loading and unloading,
racking parts, clean-up, and general support tasks. Not specialized in a single process.
</td>
</tr>
<tr>
<td><span class="badge bg-warning text-dark">Sandblaster</span></td>
<td>
Operates the sandblasting or media-blasting equipment to prepare metal surfaces for
coating. Responsible for achieving the correct surface profile and ensuring all rust,
paint, and contamination is removed.
</td>
</tr>
<tr>
<td><span class="badge bg-primary">Coater</span></td>
<td>
Applies powder coating using an electrostatic spray gun. Responsible for even coverage,
correct mil thickness, and minimizing overspray and waste. Often the most skilled
technical role on the floor.
</td>
</tr>
<tr>
<td><span class="badge bg-info text-dark">Masker</span></td>
<td>
Applies masking tape, plugs, and caps to protect threads, bearing surfaces, and areas
that must not be coated. Attention to detail is critical — missed masking means rework.
</td>
</tr>
<tr>
<td><span class="badge bg-success">Quality Control</span></td>
<td>
Inspects finished parts for adhesion, color consistency, coverage, and surface defects
before the job is marked as complete. May also handle pre-coat inspection after
sandblasting.
</td>
</tr>
<tr>
<td><span class="badge bg-danger">Oven Operator</span></td>
<td>
Loads parts into the curing oven, sets correct temperatures and cure times for the
powder being used, monitors the cure cycle, and unloads parts safely after cooling.
</td>
</tr>
<tr>
<td><span class="badge bg-dark">Supervisor</span></td>
<td>
Oversees day-to-day shop floor operations, assigns tasks to other workers, ensures
jobs are progressing on schedule, and handles escalations. May also handle customer
communication for production updates.
</td>
</tr>
<tr>
<td><span class="badge bg-secondary">Maintenance</span></td>
<td>
Responsible for keeping equipment running — performing scheduled preventive maintenance,
troubleshooting breakdowns, and coordinating with external service technicians when
needed.
</td>
</tr>
</tbody>
</table>
</div>
</section>
<section id="assigning-to-jobs" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-briefcase text-primary me-2"></i>Assigning Workers to Jobs
</h2>
<p>
Each job can have one worker assigned to it as the primary responsible person. This is the
worker who owns the job from start to finish — typically a coater or supervisor.
</p>
<p>To assign a worker when creating or editing a job:</p>
<ol class="mb-3">
<li class="mb-1">Open the job's Create or Edit form.</li>
<li class="mb-1">Scroll down to the <strong>Assignment</strong> section.</li>
<li class="mb-1">Select a worker from the <strong>Assigned Worker</strong> dropdown. Only active workers are listed.</li>
<li class="mb-1">Save the job.</li>
</ol>
<p>
The assigned worker's name appears on the job list view, on the job detail page, and in any
reports filtered by worker.
</p>
<p>
Workers can also be assigned to <strong>maintenance tasks</strong> on equipment. See the
<a asp-controller="Help" asp-action="Equipment" class="text-decoration-none">Equipment &amp; Maintenance</a>
help page for details.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
If a worker you want to assign does not appear in the dropdown, check that their record is
marked as <strong>Active</strong>. Inactive workers are hidden from assignment lists.
</div>
</div>
</section>
<section id="deactivating-a-worker" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-person-dash text-primary me-2"></i>Deactivating a Worker
</h2>
<p>
When a worker leaves the shop or is no longer available for assignment, deactivate their record
rather than deleting it. Deactivating preserves the history of all jobs they were assigned to,
while removing them from the active assignment dropdowns so they cannot be accidentally selected
for new work.
</p>
<p>To deactivate a worker:</p>
<ol class="mb-3">
<li class="mb-1">Open the worker's Details or Edit page.</li>
<li class="mb-1">Uncheck the <strong>Active</strong> checkbox.</li>
<li class="mb-1">Click <strong>Save</strong>.</li>
</ol>
<p>
Alternatively, use the <strong>Delete</strong> button on the Details page to perform a soft
delete, which has the same effect.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
If a worker currently has open jobs assigned to them, reassign those jobs first before
deactivating the worker — so the jobs remain clearly owned and nothing falls through the cracks.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#adding-a-worker">Adding a Worker</a>
<a class="nav-link py-1 px-3 small text-body" href="#worker-roles">Worker Roles</a>
<a class="nav-link py-1 px-3 small text-body" href="#assigning-to-jobs">Assigning to Jobs</a>
<a class="nav-link py-1 px-3 small text-body" href="#deactivating-a-worker">Deactivating a Worker</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,232 @@
@{
ViewData["Title"] = "Your Profile";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Your Profile</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Your profile page is where you manage your personal account settings — the information that
identifies you in the system, your login credentials, your profile photo, and how the
application looks on your screen.
</p>
<p>
To open your profile, click your avatar or name in the top-right corner of any page and select
<strong>My Profile</strong> from the dropdown menu. You can also navigate directly to
<strong>/Profile</strong>.
</p>
<p>
Profile changes only affect your own account. To change another user's details, an
Administrator must do so from the User Management section.
</p>
</section>
<section id="updating-profile" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-pencil-square text-primary me-2"></i>Updating Your Profile
</h2>
<p>
The <strong>Profile</strong> tab on your profile page lets you update your contact information.
This is the name and email address other users see when your account is mentioned in the
system (for example, in audit logs and job assignments).
</p>
<p>To update your profile:</p>
<ol class="mb-3">
<li class="mb-1">Go to your profile page.</li>
<li class="mb-1">Click the <strong>Profile</strong> tab (it may be open by default).</li>
<li class="mb-1">
Update any of the following fields:
<ul class="mt-1">
<li><strong>First Name</strong> and <strong>Last Name</strong> — your display name across the system.</li>
<li><strong>Email Address</strong> — used for login and system notifications. Must be a valid email format and unique in the system.</li>
<li><strong>Phone Number</strong> — optional; your direct contact number.</li>
<li><strong>Job Title</strong> — optional; displayed on your profile card.</li>
</ul>
</li>
<li class="mb-1">Click <strong>Save Changes</strong>.</li>
</ol>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
<strong>Important:</strong> If you change your email address, you will need to use the new
address to log in next time. Make sure you type it correctly before saving.
</div>
</div>
</section>
<section id="changing-password" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-key text-primary me-2"></i>Changing Your Password
</h2>
<p>
You can change your password at any time from the <strong>Security</strong> tab on your profile page.
It is good practice to use a strong, unique password that you do not use on other websites.
</p>
<p>To change your password:</p>
<ol class="mb-3">
<li class="mb-1">Go to your profile page and click the <strong>Security</strong> tab.</li>
<li class="mb-1">Enter your <strong>Current Password</strong> to confirm it is you.</li>
<li class="mb-1">Enter your <strong>New Password</strong>.</li>
<li class="mb-1">Enter the new password again in the <strong>Confirm New Password</strong> field.</li>
<li class="mb-1">Click <strong>Change Password</strong>.</li>
</ol>
<h5 class="fw-semibold mt-4 mb-2">Password Requirements</h5>
<p>Your new password must meet all of the following requirements:</p>
<ul class="list-unstyled mb-3">
<li class="mb-1"><i class="bi bi-check-circle-fill text-success me-2"></i>At least <strong>8 characters</strong> long</li>
<li class="mb-1"><i class="bi bi-check-circle-fill text-success me-2"></i>At least one <strong>uppercase letter</strong> (AZ)</li>
<li class="mb-1"><i class="bi bi-check-circle-fill text-success me-2"></i>At least one <strong>lowercase letter</strong> (az)</li>
<li class="mb-1"><i class="bi bi-check-circle-fill text-success me-2"></i>At least one <strong>digit</strong> (09)</li>
</ul>
<p>
Example of a strong password: <code>ShopFloor2025!</code> — long, mixed case, has a number,
and easy for you to remember but hard to guess.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
If you have forgotten your current password and cannot log in, use the
<strong>Forgot your password?</strong> link on the login page, or ask an Administrator to
reset it for you from User Management.
</div>
</div>
</section>
<section id="profile-photo" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-camera text-primary me-2"></i>Profile Photo
</h2>
<p>
Your profile photo appears in the top navigation bar, on your profile page, and anywhere
your account is displayed in the system. Adding a photo makes it easier for your colleagues
to identify who is responsible for a job or record.
</p>
<h5 class="fw-semibold mt-3 mb-2">Uploading a Photo</h5>
<ol class="mb-3">
<li class="mb-1">Go to your profile page and click the <strong>Photo</strong> tab.</li>
<li class="mb-1">Click <strong>Choose Photo</strong> or drag and drop an image file onto the upload area.</li>
<li class="mb-1">
Accepted formats: <strong>JPG, JPEG, PNG, GIF</strong>. Maximum file size: <strong>10 MB</strong>.
</li>
<li class="mb-1">Once the image is selected, click <strong>Upload Photo</strong>.</li>
<li class="mb-1">The new photo appears immediately in the navigation bar.</li>
</ol>
<h5 class="fw-semibold mt-3 mb-2">Removing Your Photo</h5>
<p>
To remove your current photo and go back to the default avatar, click the
<strong>Remove Photo</strong> button on the Photo tab and confirm.
</p>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
For best results, use a square or near-square image cropped to your face. A photo that
is roughly 200&times;200 pixels or larger will look sharp at all display sizes.
</div>
</div>
</section>
<section id="two-factor-auth" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-shield-lock text-primary me-2"></i>Two-Factor Authentication
</h2>
<p>
Two-factor authentication (2FA) adds an extra layer of security to your account. When enabled,
you must provide a one-time code from an authenticator app (such as Google Authenticator or
Microsoft Authenticator) in addition to your password when logging in.
</p>
<h5 class="fw-semibold mt-3 mb-2">Setting Up 2FA</h5>
<ol class="mb-3">
<li class="mb-1">Go to <a href="/TwoFactorSetup">/TwoFactorSetup</a> or open it from the user menu (top-right) → <strong>Two-Factor Setup</strong>.</li>
<li class="mb-1">Install an authenticator app on your phone if you do not have one already.</li>
<li class="mb-1">Scan the QR code shown on the setup page with your authenticator app.</li>
<li class="mb-1">Enter the 6-digit code from the app to confirm setup.</li>
<li class="mb-1">Save your <strong>recovery codes</strong> in a safe place — you will need them if you lose access to your phone.</li>
</ol>
<div class="alert alert-permanent alert-warning d-flex gap-2 mb-0" role="alert">
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i>
<div>
Store your recovery codes somewhere safe and offline. If you lose your phone and do not
have recovery codes, your administrator will need to reset 2FA on your account.
</div>
</div>
</section>
<section id="appearance" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-palette text-primary me-2"></i>Appearance
</h2>
<p>
The <strong>Appearance</strong> tab lets you customize how the application looks on your screen.
Your choices are saved to your account and follow you across devices when you log in.
</p>
<h5 class="fw-semibold mt-3 mb-2">Theme — Light or Dark Mode</h5>
<p>
Choose between <strong>Light</strong> mode (white backgrounds, dark text) and
<strong>Dark</strong> mode (dark backgrounds, light text).
</p>
<ul class="mb-3">
<li><strong>Light</strong> — easier to read in bright environments like a well-lit office.</li>
<li><strong>Dark</strong> — easier on the eyes in low-light conditions, such as a dimly lit shop floor or late-night work.</li>
</ul>
<p>
To change the theme, open the Appearance tab, select your preferred option, and click
<strong>Save Preferences</strong>. The page updates instantly.
</p>
<h5 class="fw-semibold mt-3 mb-2">Sidebar Color</h5>
<p>
You can also choose the color scheme for the left navigation sidebar. A range of color
options is available — from a clean white sidebar to darker branded colors. Pick whichever
suits your taste or matches your shop's brand.
</p>
<p>
To change the sidebar color, select a color swatch on the Appearance tab and click
<strong>Save Preferences</strong>.
</p>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
Appearance settings are personal and do not affect how the application looks for other
users. Each person on your team can choose the theme and color they prefer.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#updating-profile">Updating Your Profile</a>
<a class="nav-link py-1 px-3 small text-body" href="#changing-password">Changing Your Password</a>
<a class="nav-link py-1 px-3 small text-body" href="#profile-photo">Profile Photo</a>
<a class="nav-link py-1 px-3 small text-body" href="#two-factor-auth">Two-Factor Auth</a>
<a class="nav-link py-1 px-3 small text-body" href="#appearance">Appearance</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,195 @@
@{
ViewData["Title"] = "Vendors";
}
<div class="d-flex align-items-center gap-2 mb-3">
<a asp-controller="Help" asp-action="Index" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-left"></i></a>
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0">
<li class="breadcrumb-item"><a asp-controller="Help" asp-action="Index">Help</a></li>
<li class="breadcrumb-item active">Vendors</li>
</ol>
</nav>
</div>
<div class="row g-4">
<div class="col-lg-9">
<section id="overview" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-info-circle text-primary me-2"></i>Overview
</h2>
<p>
Vendors are the companies you buy from — powder suppliers, primer manufacturers, consumables
distributors, equipment service providers, and anyone else who sends you a bill. Maintaining
accurate vendor records lets you track what you owe, reorder stock quickly, and keep purchase
history organized.
</p>
<p>
You can find Vendors under <strong>Inventory &rsaquo; Vendors</strong> in the left sidebar.
Each vendor can be linked to the specific inventory items they supply, so when stock runs low
you always know exactly who to call.
</p>
</section>
<section id="adding-a-vendor" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-plus-circle text-primary me-2"></i>Adding a Vendor
</h2>
<p>To add a new vendor:</p>
<ol class="mb-3">
<li class="mb-2">Go to <strong>Inventory &rsaquo; Vendors</strong> and click <strong>New Vendor</strong>.</li>
<li class="mb-2">
Fill in the vendor details:
<ul class="mt-1">
<li><strong>Vendor Name</strong> — the company name as it appears on their invoices.</li>
<li><strong>Contact Name</strong> — your sales rep or accounts contact.</li>
<li><strong>Email &amp; Phone</strong> — for placing orders and following up on deliveries.</li>
<li><strong>Address</strong> — the vendor's billing address.</li>
<li><strong>Website</strong> — optional, handy for quick product lookups.</li>
<li><strong>Account Number</strong> — your account number with this vendor, if applicable.</li>
</ul>
</li>
<li class="mb-2">Set the <strong>Payment Terms</strong> (see below).</li>
<li class="mb-2">Optionally fill in the <strong>Default Expense Account</strong> (see below).</li>
<li class="mb-2">Check <strong>Preferred Vendor</strong> if this is your primary supplier for any category.</li>
<li class="mb-2">Add any internal <strong>Notes</strong> your team should know.</li>
<li class="mb-2">Click <strong>Save Vendor</strong>.</li>
</ol>
</section>
<section id="default-expense-account" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-receipt text-primary me-2"></i>Default Expense Account
</h2>
<p>
The <strong>Default Expense Account</strong> field records which accounting category purchases from
this vendor typically fall under — for example, <em>Cost of Goods Sold</em>, <em>Shop Supplies</em>,
or <em>Equipment Maintenance</em>.
</p>
<p>
When a purchase order is created for this vendor, the system pre-fills the expense account with this
default value, saving your team from having to look it up each time. This is especially useful if
you export financial data or sync with an accounting package.
</p>
<p>
If your shop does not use account codes, you can leave this field blank. Ask your bookkeeper or
accountant for the right code to use if you are unsure.
</p>
</section>
<section id="payment-terms" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-calendar-check text-primary me-2"></i>Payment Terms
</h2>
<p>
Payment terms describe how long you have to pay a vendor invoice after you receive it. Common
examples include:
</p>
<ul class="mb-3">
<li><strong>Net 15</strong> — payment due within 15 days of the invoice date.</li>
<li><strong>Net 30</strong> — payment due within 30 days (the most common).</li>
<li><strong>Net 60</strong> — payment due within 60 days.</li>
<li><strong>Due on Receipt</strong> — pay immediately on delivery.</li>
<li><strong>2/10 Net 30</strong> — 2% discount if paid within 10 days, otherwise full amount due in 30.</li>
</ul>
<p>
When you enter terms here, they are automatically used as the default on any bills generated from
purchase orders for this vendor. This gives Accounts Payable a clear, consistent due date without
manual entry each time.
</p>
</section>
<section id="preferred-vendor" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-star text-primary me-2"></i>Preferred Vendor
</h2>
<p>
Marking a vendor as <strong>Preferred</strong> flags them as your go-to supplier in a given category.
On the vendor list, preferred vendors are highlighted with a star badge so they stand out at a glance.
</p>
<p>
When multiple vendors supply the same type of inventory item (e.g., you have two powder suppliers),
the preferred vendor appears first in dropdown lists when you are creating a purchase order or
restocking an inventory item.
</p>
<p>
You can mark more than one vendor as preferred — it is a flag, not an exclusive designation. Use
it however makes sense for your workflow.
</p>
</section>
<section id="vendor-details" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-card-text text-primary me-2"></i>Vendor Details Page
</h2>
<p>
Open a vendor's Details page by clicking their name in the vendor list. Here you will find:
</p>
<ul>
<li><strong>Contact information</strong> — all the details you entered, in one place.</li>
<li>
<strong>Inventory Items tab</strong> — a list of every inventory item linked to this vendor.
This tells you at a glance what you buy from them. Click any item to open it.
</li>
<li>
<strong>Purchase History tab</strong> — a log of all purchase orders and transactions recorded
against this vendor, with dates and amounts.
</li>
<li>
<strong>Notes</strong> — any notes you or your colleagues have saved.
</li>
</ul>
<div class="alert alert-permanent alert-info d-flex gap-2 mb-0" role="alert">
<i class="bi bi-lightbulb-fill flex-shrink-0 mt-1"></i>
<div>
To link an inventory item to a vendor, open the <strong>Inventory Item</strong> record and set the
<em>Vendor</em> field there. The link then appears automatically on the Vendor Details page.
</div>
</div>
</section>
<section id="deactivating-a-vendor" class="mb-5">
<h2 class="h4 fw-bold border-bottom pb-2 mb-3">
<i class="bi bi-truck text-primary me-2" style="text-decoration:line-through"></i>Deactivating a Vendor
</h2>
<p>
If you stop working with a vendor, deactivate their record instead of deleting it. This keeps all
linked purchase history and inventory records intact while removing the vendor from active dropdown
lists and search results.
</p>
<p>To deactivate a vendor:</p>
<ol class="mb-3">
<li class="mb-1">Open the vendor's Details page.</li>
<li class="mb-1">Click the <strong>Delete</strong> (or Deactivate) button.</li>
<li class="mb-1">Confirm the action in the dialog.</li>
</ol>
<div class="alert alert-permanent alert-secondary d-flex gap-2 mb-0" role="alert">
<i class="bi bi-info-circle flex-shrink-0 mt-1"></i>
<div>
Like customers, vendor deactivation is a soft delete. All historical data is preserved.
Administrators can see and restore deactivated vendors if needed.
</div>
</div>
</section>
</div>
<div class="col-lg-3 d-none d-lg-block">
@{ await Html.RenderPartialAsync("_HelpNav"); }
<div class="card border-0 shadow-sm sticky-top" style="top:80px">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase" style="letter-spacing:.05em; font-size:.7rem;">On this page</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-1 px-3 small text-body" href="#overview">Overview</a>
<a class="nav-link py-1 px-3 small text-body" href="#adding-a-vendor">Adding a Vendor</a>
<a class="nav-link py-1 px-3 small text-body" href="#default-expense-account">Default Expense Account</a>
<a class="nav-link py-1 px-3 small text-body" href="#payment-terms">Payment Terms</a>
<a class="nav-link py-1 px-3 small text-body" href="#preferred-vendor">Preferred Vendor</a>
<a class="nav-link py-1 px-3 small text-body" href="#vendor-details">Vendor Details Page</a>
<a class="nav-link py-1 px-3 small text-body" href="#deactivating-a-vendor">Deactivating a Vendor</a>
</nav>
</div>
</div>
</div>
</div>
@@ -0,0 +1,95 @@
@{
var currentAction = ViewContext.RouteData.Values["action"]?.ToString();
}
<div class="card border-0 shadow-sm mb-4">
<div class="card-header bg-transparent fw-semibold small text-muted text-uppercase letter-spacing-1">
<i class="bi bi-book me-1"></i> Help Topics
</div>
<div class="card-body p-0">
<nav class="nav flex-column">
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Index" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Index">
<i class="bi bi-house-door"></i> Help Home
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "GettingStarted" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="GettingStarted">
<i class="bi bi-rocket-takeoff"></i> Getting Started
</a>
<div class="px-3 pt-2 pb-1">
<span class="text-muted text-uppercase" style="font-size:.65rem; letter-spacing:.07em; font-weight:600;">Operations</span>
</div>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Jobs" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Jobs">
<i class="bi bi-briefcase"></i> Jobs
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Quotes" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Quotes">
<i class="bi bi-file-earmark-text"></i> Quotes
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Invoices" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Invoices">
<i class="bi bi-receipt"></i> Invoices
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Customers" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Customers">
<i class="bi bi-people"></i> Customers
</a>
<div class="px-3 pt-2 pb-1">
<span class="text-muted text-uppercase" style="font-size:.65rem; letter-spacing:.07em; font-weight:600;">Inventory &amp; Purchasing</span>
</div>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Inventory" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Inventory">
<i class="bi bi-box-seam"></i> Inventory
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Vendors" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Vendors">
<i class="bi bi-truck"></i> Vendors
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "PurchaseOrders" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="PurchaseOrders">
<i class="bi bi-cart3"></i> Purchase Orders
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "AccountsPayable" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="AccountsPayable">
<i class="bi bi-bank"></i> Accounts Payable
</a>
<div class="px-3 pt-2 pb-1">
<span class="text-muted text-uppercase" style="font-size:.65rem; letter-spacing:.07em; font-weight:600;">Shop Management</span>
</div>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "ShopWorkers" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="ShopWorkers">
<i class="bi bi-person-badge"></i> Shop Workers
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Equipment" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Equipment">
<i class="bi bi-tools"></i> Equipment &amp; Maintenance
</a>
<div class="px-3 pt-2 pb-1">
<span class="text-muted text-uppercase" style="font-size:.65rem; letter-spacing:.07em; font-weight:600;">Reports &amp; Admin</span>
</div>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Reports" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Reports">
<i class="bi bi-bar-chart"></i> Reports
</a>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "Settings" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="Settings">
<i class="bi bi-gear"></i> Settings
</a>
<div class="px-3 pt-2 pb-1">
<span class="text-muted text-uppercase" style="font-size:.65rem; letter-spacing:.07em; font-weight:600;">Account</span>
</div>
<a class="nav-link py-2 px-3 d-flex align-items-center gap-2 @(currentAction == "UserProfile" ? "active fw-semibold text-primary" : "text-body")"
asp-controller="Help" asp-action="UserProfile">
<i class="bi bi-person-circle"></i> Your Profile
</a>
</nav>
</div>
</div>