Updated A LOT

This commit is contained in:
2026-06-05 04:15:24 -05:00
parent 8335f1af1b
commit 4072695432
92 changed files with 16139 additions and 570 deletions

View File

@@ -0,0 +1,994 @@
<template>
<v-dialog :model-value="modelValue" max-width="1180" scrollable @update:model-value="$emit('update:modelValue', $event)">
<v-card class="user-manual-print" height="90vh">
<v-toolbar color="primary" density="comfortable" class="px-2">
<v-icon icon="mdi-book-open-page-variant" class="ml-2 mr-2" />
<v-toolbar-title class="font-weight-bold">MixedAssets User Guide</v-toolbar-title>
<v-spacer />
<v-btn variant="text" prepend-icon="mdi-printer" class="d-print-none" @click="print">Print / Save PDF</v-btn>
<v-btn icon="mdi-close" variant="text" class="d-print-none" @click="$emit('update:modelValue', false)" />
</v-toolbar>
<div class="manual-body">
<!-- Section navigation -->
<nav class="user-manual-nav">
<v-text-field
v-model="search"
density="compact"
hide-details
clearable
variant="solo-filled"
flat
placeholder="Search topics"
prepend-inner-icon="mdi-magnify"
class="ma-2"
/>
<v-list density="compact" nav class="pa-1">
<v-list-item
v-for="section in filteredSections"
:key="section.id"
:active="active === section.id"
:prepend-icon="section.icon"
:title="section.title"
rounded="sm"
@click="select(section.id)"
/>
<v-list-item v-if="!filteredSections.length" class="quiet text-body-2">No topics match {{ search }}.</v-list-item>
</v-list>
</nav>
<!-- Content -->
<div ref="content" class="manual-content user-manual-content">
<div class="manual-doc-title d-none d-print-block">
<h1>MixedAssets User Guide</h1>
<p class="quiet">Fixed-asset management, depreciation, maintenance &amp; integrations</p>
</div>
<!-- GETTING STARTED -->
<section v-show="isShown('overview')" class="manual-section">
<h2>Getting started</h2>
<p>
MixedAssets is an integrated system for tracking physical assets through their full lifecycle
acquisition, depreciation across multiple accounting books, preventative maintenance, disposal alongside
a parts inventory, a contacts/CRM directory, an alerting engine, and connectors to email, webhooks, and ServiceNow.
</p>
<p>Most day-to-day work follows one of these flows:</p>
<ul>
<li><strong>Record an asset</strong> set its books &amp; depreciation attach warranties, files, photos, and maintenance plans.</li>
<li><strong>Maintain it</strong> complete preventative-maintenance services, log tasks and notes, draw down spare parts.</li>
<li><strong>Account for it</strong> review the general ledger per book, run reports, and record disposals or impairments when it leaves service.</li>
</ul>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
You can reopen this guide at any time from the <strong>?</strong> icon in the top bar. Use the topic list on the
left, or the search box, to jump to a subject. The <strong>Print / Save PDF</strong> button produces a complete printable manual.
</v-alert>
<h3>Signing in</h3>
<p>
Sign in with your email and password. Your <em>role</em> determines which screens and actions are available
(see <a href="#" @click.prevent="select('roles')">Roles &amp; permissions</a>). If a screen is missing from your
left-hand menu, your role does not grant access to it.
</p>
</section>
<!-- INTERFACE -->
<section v-show="isShown('navigation')" class="manual-section">
<h2>Interface &amp; navigation</h2>
<h3>The left navigation rail</h3>
<p>
The rail on the left lists every screen your role can access. Some items expand to reveal sub-items:
<strong>Assets</strong> contains <strong>Scan</strong>, <strong>Assignments</strong>, and <strong>Templates</strong>; <strong>Maintenance</strong>
contains <strong>Parts inventory</strong>; and <strong>Financial</strong> contains <strong>Books</strong> and <strong>Tax rules</strong>.
<strong>Admin</strong> expands to <strong>Users &amp; Teams</strong>, <strong>Application Configuration</strong>, and <strong>Integrations</strong>.
Collapse the rail to icons using the chevron at the top of the rail
(or the menu button in the top bar) to give content more room; your choice is remembered on this device.
</p>
<h3>The top bar</h3>
<ul>
<li>Shows the current screen title and a short description.</li>
<li>Screen-specific actions (such as <strong>New asset</strong>) appear on the right.</li>
<li>The <strong>?</strong> icon opens this user guide.</li>
<li>Your avatar opens the profile menu for theme selection and sign-out.</li>
</ul>
<h3>Themes &amp; appearance</h3>
<p>
Open the profile menu (your avatar, top-right) to personalize the interface. All choices are saved to your account and
follow you between devices:
</p>
<ul>
<li><strong>Theme</strong> several dark options (Dark, Ocean, Slate, High contrast) and light options (Light, Sepia).</li>
<li><strong>Text size</strong> Small, Normal, Large, or Extra large; this scales the whole interface for easier reading.</li>
<li><strong>Accent colour</strong> pick a preset swatch or enter any custom hex value; choose default to return to the themes colour. Button text automatically switches to black or white for legibility.</li>
<li><strong>High-contrast boost</strong> strengthens borders, text, and link underlines on top of whichever theme youre using.</li>
</ul>
<h3>Accessibility</h3>
<p>MixedAssets is built to work with assistive technology:</p>
<ul>
<li>Press <strong>Tab</strong> to reveal a Skip to main content link, and to move through controls with a clear keyboard focus outline.</li>
<li>Images and photos carry descriptive text for screen readers, and icon-only buttons have spoken labels.</li>
<li>The text-size and high-contrast options above support low-vision use, and the app honours your systems reduce motion setting.</li>
</ul>
<h3>Tables</h3>
<p>Most lists use a consistent table with the same controls everywhere:</p>
<ul>
<li><strong>Filter box</strong> type to narrow the rows.</li>
<li><strong>Sortable columns</strong> click a header to sort; click again to reverse, a third time to clear.</li>
<li><strong>Rows per page</strong> and pagination at the bottom; choose <em>All</em> to show everything.</li>
<li>Headers stay visible (sticky) while you scroll long lists.</li>
</ul>
</section>
<!-- DASHBOARD -->
<section v-show="isShown('dashboard')" class="manual-section">
<h2>Dashboard</h2>
<p>
The Dashboard is your portfolio at a glance. It summarizes the number of assets, total cost, how many are in
service versus disposed, and a chart of value by category, with a supporting breakdown table beneath it.
It also surfaces recent activity and upcoming work so you can see what needs attention without opening each screen.
</p>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
The Dashboard is read-only it is a reporting surface. Make changes from the relevant screen (Assets, Maintenance, etc.)
and the Dashboard updates automatically.
</v-alert>
</section>
<!-- ASSETS -->
<section v-show="isShown('assets')" class="manual-section">
<h2>Assets creating &amp; managing</h2>
<p>
The <strong>Asset register</strong> lists every asset. Use the filter and status selector to find records, select
rows for bulk actions, and open any asset to edit it in the <em>asset workbench</em> (the panel that slides in from the right).
</p>
<h3>Creating an asset</h3>
<ol>
<li>Click <strong>New asset</strong> in the top bar.</li>
<li>Optionally pick a <strong>Template</strong> to pre-fill category, life, method, GL accounts, and custom fields.</li>
<li>Fill in the <strong>Details</strong>: description, category, acquisition cost, acquired / in-service dates, useful life, location, custodian, serial number, and so on.</li>
<li>Click <strong>Save asset</strong>. The workbench stays open on the new record so you can immediately add books, files, photos, warranties, and maintenance.</li>
</ol>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
An Asset ID is generated automatically if you leave it blank. You can also type your own identifier.
</v-alert>
<h3>The asset workbench tabs</h3>
<table class="manual-table">
<thead><tr><th>Tab</th><th>What its for</th></tr></thead>
<tbody>
<tr><td><strong>Details</strong></td><td>Core asset data, GL accounts, condition, and the barcode label (print a single label here).</td></tr>
<tr><td><strong>Books</strong></td><td>Per-book depreciation settings each book can carry its own cost, method, life, §179, bonus, and convention. See <a href="#" @click.prevent="select('books')">Books, depreciation &amp; tax</a>.</td></tr>
<tr><td><strong>Files</strong></td><td>Attach invoices, manuals, and insurance records. Files are stored with the asset and can be downloaded later.</td></tr>
<tr><td><strong>Photos</strong></td><td>Identification photos what the asset looks like, where it is, nameplates and serial labels. Each photo can have a caption. On a phone, <strong>Add photos</strong> opens the camera.</td></tr>
<tr><td><strong>Warranties</strong></td><td>Provider, coverage window, limits, and details. Expiring warranties raise alerts.</td></tr>
<tr><td><strong>Tasks</strong></td><td>Ad-hoc to-dos (inspection, calibration, renewal). Overdue tasks raise alerts. Tick a task to complete it.</td></tr>
<tr><td><strong>Notes</strong></td><td>A running, timestamped log of comments about the asset.</td></tr>
<tr><td><strong>Disposal</strong></td><td>Record a sale/retirement and impairments see <a href="#" @click.prevent="select('lifecycle')">Asset lifecycle</a>.</td></tr>
<tr><td><strong>Lease</strong></td><td>Capture lease terms and view the amortization schedule see <a href="#" @click.prevent="select('lifecycle')">Asset lifecycle</a>.</td></tr>
<tr><td><strong>PM</strong></td><td>Attach preventative-maintenance plans and complete services see <a href="#" @click.prevent="select('pm')">Preventative maintenance</a>.</td></tr>
</tbody>
</table>
<h3>Editing &amp; bulk changes</h3>
<ul>
<li>Open any row to edit it, then <strong>Save asset</strong>.</li>
<li>Select multiple rows and use <strong>mass edit</strong> to change status, location, or department across all of them at once.</li>
<li><strong>Import</strong> a spreadsheet to create/update many assets, and <strong>export</strong> the register to a file.</li>
</ul>
<h3>Status values</h3>
<p>
Assets move through statuses such as <em>in service</em>, <em>CIP</em> (construction in progress), <em>reserved</em>,
<em>checked out</em>, <em>disposed</em>, and <em>retired</em>. Status drives filtering, the Dashboard counts, and which
records appear in reports.
</p>
</section>
<!-- LIFECYCLE -->
<section v-show="isShown('lifecycle')" class="manual-section">
<h2>Asset lifecycle disposal, leases &amp; impairment</h2>
<h3>Disposing of an asset</h3>
<p>Open the asset, go to the <strong>Disposal</strong> tab, and:</p>
<ol>
<li>Choose the <strong>book</strong> the disposal is calculated against, the <strong>disposal type</strong> (sale, exchange, abandonment, like-kind, involuntary conversion), and the date.</li>
<li>Enter the sale price and any selling expense. For a partial disposal, tick <strong>Partial</strong> and enter the cost basis being removed.</li>
<li>Click <strong>Calculate gain/loss</strong> to preview accumulated depreciation, net book value, proceeds, and the resulting gain or loss.</li>
<li>Click <strong>Record disposal</strong> to finalize. The asset is marked disposed and the entry appears in the disposal history (you can reverse it from there if needed).</li>
</ol>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
Gain/loss is computed from the selected books net book value at the disposal date, so the figure reflects that books
method and conventions. Disposals also feed the disposal and gain/loss reports.
</v-alert>
<h3>Impairments &amp; adjustments</h3>
<p>
Below the disposal form, record an <strong>impairment</strong>, write-down, write-up, or revaluation against a specific
book with an amount, date, and reason. These adjust the assets carrying value and appear in the adjustments report.
</p>
<h3>Leases</h3>
<p>
On the <strong>Lease</strong> tab, capture the lessor, total contract value, start/end dates, discount rate, and payment
frequency. Select a saved lease to view its <strong>amortization schedule</strong> present value (right-of-use asset),
periodic payment, and the period-by-period split of interest, principal, and remaining liability. Leases nearing their
end date raise alerts.
</p>
</section>
<!-- BARCODES -->
<section v-show="isShown('barcodes')" class="manual-section">
<h2>Barcodes &amp; scanning</h2>
<h3>Printing labels</h3>
<p>
Every asset can carry a barcode value (it falls back to the Asset ID if left blank). Print a single label from the
assets <strong>Details</strong> tab, or select multiple assets in the register and print a <strong>label sheet</strong> for batch tagging.
</p>
<h3>The Scan screen</h3>
<p>
Use <strong>Scan</strong> to find an asset in the field: point your device camera at a barcode (or type the code), and the
matching asset opens so you can update its status, location, department, custodian, and condition, or add a quick note on the spot.
</p>
<v-alert type="warning" variant="tonal" density="comfortable" class="manual-callout">
Camera scanning requires a secure (HTTPS) connection or running on the local machine. Where the camera isnt available,
manual code entry works everywhere.
</v-alert>
</section>
<!-- BOOKS / DEPRECIATION -->
<section v-show="isShown('books')" class="manual-section">
<h2>Books, depreciation &amp; tax</h2>
<p>
A <strong>book</strong> is a parallel set of depreciation figures for example GAAP (financial statements), Federal tax,
State, AMT, ACE, and your own user-defined books. The same physical asset is depreciated independently in each book, so you
can satisfy financial reporting and several tax regimes from one record.
</p>
<h3>How the financial modules relate to asset tracking</h3>
<ul>
<li><strong>Books screen</strong> defines the <em>registry</em> of books available across the whole system: which are enabled, each books default method and convention, and which tax rule set it uses.</li>
<li><strong>Asset Books tab</strong> every enabled book appears here for each asset, where you can override cost, life, method, §179, bonus, and convention <em>per book, per asset</em>.</li>
<li><strong>Tax rule sets</strong> supply the catalog of depreciation methods and the statutory limits (e.g. §179 caps, bonus %) that a book draws on. Assigning a rule set to a book is what makes that book follow a given jurisdictions rules.</li>
<li><strong>Depreciation engine</strong> calculates each book using its assigned rule set; the results drive the general ledger, reports, and disposal gain/loss.</li>
</ul>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
In short: <em>Tax rule set assigned to a Book applied per Asset produces depreciation rolls up to the GL and reports.</em>
</v-alert>
<h3>Configuring books</h3>
<p>On the <strong>Books</strong> screen you can:</p>
<ul>
<li>Enable/disable books, set each books default method and convention, and assign its tax rule set.</li>
<li><strong>Create a user-defined book</strong> (e.g. IFRS or an internal management book) with the <strong>New book</strong> button. Newly enabled books automatically appear on every assets Books tab.</li>
<li>Delete a book that isnt a primary or maintenance book and isnt in use.</li>
</ul>
<h3>The general ledger view</h3>
<p>
Select a book to view its <strong>GL ledger</strong> in debit/credit format asset cost, accumulated depreciation, and the
periods depreciation expense rolled to GL accounts, with per-asset detail and a summary. You can export the ledger.
</p>
<h3>Depreciation methods &amp; critical fields</h3>
<p>
Each books depreciation is computed from the depreciation-critical fields: property type, placed-in-service date,
acquisition value, depreciation method, estimated life, salvage value, Section 168 (bonus) allowance %, Section 179, and
business-use %. Supported 200% declining-balance methods include <strong>MF200</strong> (MACRS formula),
<strong>MT200</strong> (MACRS tables), and <strong>MI200</strong> (MACRS, Indian-reservation) which ignore salvage and
recover the full basis and <strong>DB200</strong>, <strong>DH200</strong> (half-year), and <strong>DD200</strong> (full-year),
which honor salvage (depreciating only down to it). All switch to straight-line when that yields a larger deduction.
</p>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
When you change a depreciation-critical field on an asset that already has depreciation, a prompt asks <strong>when to apply</strong>
the change: <em>Placed-in-service date</em> (rebuild the whole schedule) or <em>Current period going forward</em> (keep depreciation
already recorded).
</v-alert>
<h3>Special depreciation zones</h3>
<p>
Assign a <strong>Special depreciation zone</strong> on the assets Details tab (e.g. <strong>New York Liberty Zone</strong>) and the
engine automatically applies the zones §168 special allowance (30% for NY Liberty) to the <strong>federal book</strong> when the
assets placed-in-service date falls within the zones window. The form shows a note confirming the allowance, the date window,
and any leasehold-improvement life. Zones are managed in <strong>Admin Application Configuration Depreciation zones</strong>
(create your own, set the allowance %, date window, and notes).
</p>
<h3>The PM (maintenance) book</h3>
<p>
A dedicated <strong>PM book</strong> tracks actual maintenance <em>spend</em> per asset rather than depreciation. Its ledger
aggregates the cost captured when preventative-maintenance services are completed (see <a href="#" @click.prevent="select('pm')">Preventative maintenance</a>).
</p>
<h3>Reports</h3>
<p>
The <strong>Reports</strong> screen is catalog-driven: choose a report, set parameters (book, year, etc.), and view a table
with totals and an optional chart. Reports cover depreciation schedules and expense, net book value, roll-forwards,
acquisitions, disposals and gain/loss, adjustments, journal entries, several tax forms, and maintenance/PM and alert
reports. You can save report configurations to rerun later and export results to PDF, Excel, or CSV. To print an individual
PM plan, run the PM plan report and export it.
</p>
</section>
<!-- TAX RULES -->
<section v-show="isShown('taxrules')" class="manual-section">
<h2>Tax rule sets</h2>
<p>
A <strong>tax rule set</strong> defines the depreciation methods and statutory limits for a jurisdiction
(for example US federal, or a particular state). A book consults its assigned rule set to compute depreciation.
</p>
<h3>The Tax rules editor</h3>
<p>The screen has two parts: <strong>identity fields</strong> on the left (Name, Jurisdiction, Version, Effective date, Source note, Active) and a <strong>JSON editor</strong> holding the rule body. The toolbar offers:</p>
<ul>
<li><strong>New</strong> / <strong>Upload JSON</strong> start a fresh set or load one from a file.</li>
<li><strong>Format</strong> validate and tidy (pretty-print) the JSON. <em>Save is disabled while the JSON is invalid.</em></li>
<li><strong>Regenerate method catalog</strong> auto-fill the full set of standard depreciation methods, so you rarely have to type the <code>methods</code> list by hand.</li>
<li><strong>Export</strong> download the set as a JSON file.</li>
<li><strong>Activate</strong> make this version the one in effect for its jurisdiction (this deactivates other versions for the same jurisdiction).</li>
<li><strong>Save</strong> / <strong>Delete</strong>.</li>
</ul>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
The fastest way to build a set: click <strong>New</strong>, fill the identity fields, click <strong>Regenerate method catalog</strong> to populate the standard methods, adjust the <code>limits</code> for your jurisdiction, then <strong>Format</strong>, <strong>Save</strong>, and <strong>Activate</strong>. Finally, assign it to a book on <strong>Financial Books</strong>.
</v-alert>
<h3>A quick JSON primer</h3>
<p>The rule body is written in JSON. A few rules cover almost everything you need:</p>
<ul>
<li>The whole document is an <strong>object</strong> wrapped in curly braces.</li>
<li>Inside, you list <strong>"key": value</strong> pairs, separated by commas.</li>
<li>Keys and text values are wrapped in <strong>double quotes</strong> <code>"like this"</code>.</li>
<li>Numbers (<code>60</code>, <code>0.15</code>) and <code>true</code> / <code>false</code> / <code>null</code> are written <strong>without</strong> quotes.</li>
<li>A <strong>list</strong> uses square brackets, with items separated by commas. Objects and lists can nest inside each other.</li>
<li>Do <strong>not</strong> put a comma after the last item in an object or list a trailing comma is the most common mistake. Use <strong>Format</strong> to catch errors.</li>
</ul>
<h3>Top-level fields</h3>
<table class="manual-table">
<thead><tr><th>Field</th><th>Type</th><th>Purpose</th></tr></thead>
<tbody>
<tr><td>schema</td><td>text</td><td>Optional tag identifying the file format.</td></tr>
<tr><td>jurisdiction</td><td>text</td><td>The jurisdiction this set governs (e.g. <code>US-FED</code>, <code>US-CA</code>). Also set by the identity field.</td></tr>
<tr><td>name</td><td>text</td><td>Display name for the rule set.</td></tr>
<tr><td>version</td><td>text</td><td>Version label; must be unique within a jurisdiction.</td></tr>
<tr><td>effectiveDate</td><td>date text</td><td>When the rules take effect, as <code>"YYYY-MM-DD"</code>.</td></tr>
<tr><td>sourceNote</td><td>text</td><td>Free-form note about the source or authority.</td></tr>
<tr><td>books</td><td>list of text</td><td>Reference list of the books this set is intended for.</td></tr>
<tr><td>conventions</td><td>list of text</td><td>Conventions in use (reference): <code>half_year</code>, <code>mid_quarter</code>, <code>mid_month</code>, <code>full_month</code>, <code>none</code>.</td></tr>
<tr><td>limits</td><td>object</td><td>Statutory reference limits §179, bonus, de-minimis (see below).</td></tr>
<tr><td>assetLives</td><td>list of objects</td><td>Reference list of class lives, each <code>{ code, label, months }</code>.</td></tr>
<tr><td>methods</td><td>list of objects</td><td><strong>The calculation catalog the engine actually uses</strong> (see below).</td></tr>
</tbody>
</table>
<p class="quiet">Name, jurisdiction, version, effective date, source note, and active status are also editable in the identity fields beside the editor; keeping them in the JSON too is fine.</p>
<h4>The <code>limits</code> object</h4>
<ul>
<li><strong>section179</strong>: <code>deductionLimit</code> (number), <code>phaseOutBegins</code> (number), <code>cannotCreateLoss</code> (true/false).</li>
<li><strong>bonusDepreciation</strong>: <code>qualifiedPropertyPercent</code> (e.g. <code>100</code>), <code>effectivePlacedInServiceAfter</code> (date text).</li>
<li><strong>deMinimisSafeHarbor</strong>: <code>defaultThreshold</code> (number), <code>auditedFinancialStatementThreshold</code> (number).</li>
</ul>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
These limits <em>document</em> the jurisdictions caps for reference. The actual §179 and bonus amounts applied to a given
asset are the values you enter on that assets <strong>Books</strong> tab.
</v-alert>
<h3>Inside <code>methods</code> the calculation catalog</h3>
<p>
Each entry in <code>methods</code> is one depreciation method. When you pick a method on an assets Books tab, the engine
matches your choice by its <code>code</code> and computes depreciation using that entrys settings.
</p>
<table class="manual-table">
<thead><tr><th>Field</th><th>Type</th><th>Purpose</th></tr></thead>
<tbody>
<tr><td>code</td><td>text</td><td>Unique identifier; this is what a books method selection points to.</td></tr>
<tr><td>family</td><td>text</td><td>Grouping shown in the picker e.g. <code>MACRS</code>, <code>ACRS</code>, <code>GAAP</code>, <code>Manual</code>, <code>Lease</code>.</td></tr>
<tr><td>label</td><td>text</td><td>Human-readable name shown in pickers and reports.</td></tr>
<tr><td>formula</td><td>text</td><td>How depreciation is calculated (see values below).</td></tr>
<tr><td>lifeMonths</td><td>number</td><td>Recovery period in months (e.g. <code>60</code> = 5 years).</td></tr>
<tr><td>defaultConvention</td><td>text</td><td>First/last-year convention this method applies (overrides the books convention).</td></tr>
<tr><td>rateMultiplier</td><td>number</td><td>Declining-balance rate: <code>2</code> = 200%, <code>1.5</code> = 150%.</td></tr>
<tr><td>switchToStraightLine</td><td>true/false</td><td>For declining balance, switch to straight-line once it yields a larger deduction (typical for MACRS).</td></tr>
<tr><td>rates</td><td>list of numbers</td><td>For the <code>rate_table</code> formula: the per-year fractions of basis (should total 1.0).</td></tr>
<tr><td>fallbackFormula</td><td>text</td><td>Used when a rate table is empty (e.g. <code>straight_line</code>).</td></tr>
<tr><td>system</td><td>text</td><td>Optional label such as <code>GDS</code>, <code>ADS</code>, or <code>ACRS</code>.</td></tr>
</tbody>
</table>
<h4>Accepted <code>formula</code> values</h4>
<table class="manual-table">
<thead><tr><th>Value</th><th>Behavior</th></tr></thead>
<tbody>
<tr><td><code>straight_line</code></td><td>Even amount over the life. Used as the fallback for any unrecognized formula.</td></tr>
<tr><td><code>declining_balance</code></td><td>Accelerated, using <code>rateMultiplier</code>.</td></tr>
<tr><td><code>macrs_declining_balance</code></td><td>Declining balance that switches to straight-line (the standard MACRS behavior).</td></tr>
<tr><td><code>sum_of_years_digits</code></td><td>Accelerated sum-of-years-digits.</td></tr>
<tr><td><code>rate_table</code></td><td>Applies the per-year fractions in <code>rates</code>.</td></tr>
<tr><td><code>acrs_alternate_straight_line</code></td><td>ACRS alternate (modified) straight-line.</td></tr>
<tr><td><code>manual</code></td><td>You enter each years amount on the asset (no automatic calculation).</td></tr>
</tbody>
</table>
<h3>Sample rule set</h3>
<p>A compact example showing the three most common method styles straight-line, declining balance, and a rate table:</p>
<pre class="manual-code">{{ sampleRuleSet }}</pre>
<v-alert type="warning" variant="tonal" density="comfortable" class="manual-callout">
Rule sets ship as starter templates. Always confirm current tax law, rates, and elections before relying on a set for a filing.
</v-alert>
<p>To put a set to work, open <strong>Financial Books</strong> and assign it to a book.</p>
</section>
<!-- TEMPLATES -->
<section v-show="isShown('templates')" class="manual-section">
<h2>Templates</h2>
<p>
Templates speed up asset entry and standardize data. A template defines default values (category, useful life,
depreciation method, GL accounts, business-use %, etc.) and a set of <strong>custom fields</strong> (text, number, date, or
checkbox) that should be captured for that kind of asset.
</p>
<h3>Creating a template</h3>
<ol>
<li>Open <strong>Templates</strong> and give the template a name and description.</li>
<li>Set the default values new assets should start with.</li>
<li>Add custom fields, marking any that are required.</li>
<li>Save. The template is now selectable from the <strong>Template</strong> picker when creating an asset.</li>
</ol>
<p>Choosing a template on a new asset fills the defaults and adds its custom fields to the Details tab.</p>
<h3>Editing &amp; deleting templates</h3>
<p>
The templates list (right) is searchable and paginated, and shows how many fields each template has and how many
assets currently use it. Use the <strong>pencil</strong> to load a template back into the editor and save your changes,
or the <strong>trash</strong> to delete it.
</p>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
Deleting a template is safe for your data: assets that used it <strong>keep all their values</strong> and are simply
unlinked from the template. The only other effect is that the template is no longer offered when creating new assets.
The confirmation dialog tells you how many assets are affected before you proceed.
</v-alert>
</section>
<!-- PM -->
<section v-show="isShown('pm')" class="manual-section">
<h2>Preventative maintenance</h2>
<p>
The <strong>Maintenance</strong> screen manages reusable <strong>PM plans</strong> standard procedures performed on a
schedule which you then attach to specific assets and complete over time.
</p>
<h3>Creating a PM plan</h3>
<ol>
<li>On <strong>Maintenance</strong>, click <strong>New plan</strong>.</li>
<li>Name the plan and set its <strong>frequency</strong> (every N days, weeks, months, quarters, bi-yearly, or years).</li>
<li>Add ordered <strong>steps</strong> (the checklist a technician follows), each with an optional time estimate the plans total estimated time totals automatically.</li>
<li>Add <strong>components / parts</strong> (part number, description, supplier, cost) to capture expected materials and cost.</li>
<li>Add <strong>guidance photos</strong> (diagrams, part locations, before/after) with captions these are shown to the technician while completing the service.</li>
<li>Save the plan.</li>
</ol>
<h3>Attaching a plan to an asset</h3>
<p>
Open the asset, go to the <strong>PM</strong> tab, choose a plan, and set the interval, first-due date, and an end date
(it pre-fills to the assets depreciation end). The schedule now tracks the next due date and raises alerts as it approaches or passes.
</p>
<h3>Completing (closing) a service</h3>
<ol>
<li>On the assets <strong>PM</strong> tab, click <strong>Complete</strong> on an active schedule.</li>
<li>The form records who is closing it (you), shows any <strong>guidance photos</strong>, and lets you tick off each step.</li>
<li>Give 15 <strong>condition ratings</strong>: Safety (is it safe?), Physical condition, and Operating condition.</li>
<li>Add <strong>completion notes</strong> and <strong>photos</strong> of the work, confirm the parts cost, and capture a <strong>signature</strong> (required).</li>
<li>Click <strong>Mark complete</strong>. The next-due date rolls forward automatically (the schedule closes if it has passed its end date), and the cost is recorded to the PM book.</li>
</ol>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
Completed forms with signature, ratings, notes, and photos are viewable from both the assets PM tab and the
<strong>Completed PM forms</strong> list on the Maintenance screen.
</v-alert>
</section>
<!-- PARTS -->
<section v-show="isShown('parts')" class="manual-section">
<h2>Parts inventory</h2>
<p>
<strong>Parts inventory</strong> (under Maintenance) is a standalone stockroom for maintenance parts and supplies. It is
deliberately separate from the asset register parts are consumables, not depreciating assets.
</p>
<h3>Adding a part</h3>
<ol>
<li>Open <strong>Maintenance Parts inventory</strong> and click <strong>New part</strong>.</li>
<li>Enter the part number, name, category, unit of measure, unit cost, and a reorder point (used for low-stock flagging).</li>
<li>Add identification details measurements, manufacturer part number, barcode, and photos.</li>
<li>Pick a <strong>supplier</strong> from your Contacts (vendors, service providers, or contractors).</li>
<li>Save, then add stock locations and movements.</li>
</ol>
<h3>Stock, locations &amp; reservations</h3>
<ul>
<li>Store a part in one or more <strong>locations</strong> (chosen from your Work Location contacts), each with an <strong>aisle</strong> and <strong>bin</strong>.</li>
<li>Each location tracks quantity on hand and how much is <strong>reserved</strong>; available = on hand reserved.</li>
<li>Record <strong>movements</strong>: receive (add stock), issue (consume), adjust (set an absolute count), reserve, and unreserve. Every movement is logged with history.</li>
<li>Parts at or below their reorder point are flagged <strong>low stock</strong>; use the low-stock filter to see what to reorder.</li>
</ul>
</section>
<!-- CONTACTS -->
<section v-show="isShown('contacts')" class="manual-section">
<h2>Contacts &amp; CRM</h2>
<p>
<strong>Contacts</strong> is a directory of the people and organizations you work with: <em>employees, vendors, service
providers, contractors, work locations,</em> and <em>other</em>. The form adapts to the type you choose.
</p>
<h3>Managing contacts</h3>
<ul>
<li>Use the type selector and filter box to find records; create a contact with <strong>New contact</strong>.</li>
<li>Capture name/organization, international-friendly address and phone, and email.</li>
<li><strong>Type-specific fields</strong>: employee ID/department/manager/start date; contractor tax ID or business license; vendor and service-provider star rating and credit term.</li>
<li>Keep a per-contact <strong>notes log</strong> for running history.</li>
</ul>
<h3>How contacts connect to the rest of the app</h3>
<ul>
<li><strong>Work location</strong> contacts populate the <strong>Location</strong> dropdown on the asset form and are the locations where parts stock is held.</li>
<li><strong>Vendor / service-provider / contractor</strong> contacts populate the asset forms <strong>Vendor</strong> dropdown and are selectable as the <strong>supplier</strong> on parts.</li>
<li>Employee records can be brought in automatically from Workday when that connector is configured (see <a href="#" @click.prevent="select('admin')">Administration</a>).</li>
</ul>
</section>
<!-- ASSIGNMENTS -->
<section v-show="isShown('assignments')" class="manual-section">
<h2>Assignments (custody)</h2>
<p>
<strong>Assignments</strong> tracks who has custody of which asset. Assign an asset to an employee, department, or location,
and the full custody history is retained so you always know where an asset is and who is responsible for it.
</p>
<ul>
<li>The employee list is filterable and paginated.</li>
<li>Assign an asset, then <strong>release</strong> it (with a reason) when custody changes both events are kept in the traceability history.</li>
<li>Employees can be added here directly, or synced from Workday.</li>
</ul>
</section>
<!-- ALERTS -->
<section v-show="isShown('alerts')" class="manual-section">
<h2>Alerts &amp; reminders</h2>
<p>
The <strong>Alerts</strong> screen surfaces everything that needs attention: overdue and upcoming tasks, preventative
maintenance due/overdue, and warranties or leases about to expire. Each alert has a <strong>severity</strong> <em>critical</em>
(overdue/expired, or within seven days) or <em>warning</em>.
</p>
<h3>Working alerts</h3>
<ul>
<li><strong>Run scan</strong> recalculates the current alerts from your data.</li>
<li><strong>Acknowledge</strong> an alert to mark it in-progress; <strong>Dismiss</strong> one to stop it reappearing.</li>
<li>Filter by status and type, and use the summary tiles for a quick count of open and critical items.</li>
</ul>
<h3>Delivery channels</h3>
<p>Beyond the on-screen list, alerts can be pushed outward (all configured in <a href="#" @click.prevent="select('admin')">Administration</a>):</p>
<ul>
<li><strong>Email digest</strong> when email is enabled and a mail server is configured, new alerts are emailed to the recipient list. You can also trigger <strong>Email digest now</strong> from the Alerts screen.</li>
<li><strong>Webhook</strong> each new alert can be posted to an external URL as a JSON object, optionally signed for authenticity. Useful for chat tools or custom automation.</li>
<li><strong>ServiceNow incident</strong> raise a ticket from any alert (see below).</li>
</ul>
<h3>Forwarding an alert to ServiceNow</h3>
<p>
When the ServiceNow connection is configured, each open alert shows a <strong>ServiceNow</strong> action. Click it to create
an incident; the alerts <strong>Ticket</strong> column then shows the incident number as a link straight into ServiceNow.
Re-clicking returns the existing ticket rather than creating a duplicate. With <em>auto-create</em> enabled, the system raises
an incident automatically for each new <em>critical</em> alert. Alert severity maps to the incidents impact/urgency.
See <a href="#" @click.prevent="select('servicenow')">ServiceNow integration</a> for setup.
</p>
</section>
<!-- SERVICENOW -->
<section v-show="isShown('servicenow')" class="manual-section">
<h2>ServiceNow integration</h2>
<p>
MixedAssets connects to ServiceNow in two directions, both configured in <strong>Administration ServiceNow integration</strong>:
pushing <strong>incidents</strong> out, and pulling <strong>asset data</strong> in from the CMDB.
</p>
<h3>Connecting</h3>
<ol>
<li>Enter your ServiceNow <strong>instance URL</strong> (e.g. <em>https://yourcompany.service-now.com</em>) and the username/password of an integration user.</li>
<li>Click <strong>Test connection</strong> to confirm the credentials work.</li>
<li>Save. The stored password is never displayed back; leave it blank to keep the existing value, or use <strong>Clear password</strong> to remove it.</li>
</ol>
<h3>Pushing incidents (tickets)</h3>
<ul>
<li>Turn on <strong>Allow submitting alerts as incidents</strong> to enable ticket creation.</li>
<li>Optionally turn on <strong>Auto-create incidents for new critical alerts</strong> so critical items raise tickets automatically.</li>
<li>Set the incident table (usually <em>incident</em>) and, if you wish, a default assignment group and caller.</li>
<li>Tickets are then raised from the <strong>Alerts</strong> screen, with the incident number linked back to ServiceNow.</li>
</ul>
<h3>Pulling assets from the CMDB</h3>
<p>This populates your asset register from ServiceNow configuration items (CIs):</p>
<ol>
<li>Set the <strong>CMDB CI table</strong> (for example <em>cmdb_ci_hardware</em>) and, optionally, a filter to limit which CIs are pulled and a maximum number per sync.</li>
<li>Review the <strong>field mapping</strong> which CI fields populate which asset fields. Sensible hardware defaults are provided; adjust as needed.</li>
<li>Click <strong>Sync CMDB now</strong>. The last sync time and a result summary are shown.</li>
</ol>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
Re-syncing is safe: existing assets are matched (by their ServiceNow identifier, then serial number, then asset tag) and
<em>updated in place</em> rather than duplicated. CMDB-sourced assets receive default depreciation books like any other asset,
which you can then refine on the Books tab.
</v-alert>
</section>
<!-- ADMIN -->
<section v-show="isShown('admin')" class="manual-section">
<h2>Administration</h2>
<p>
<strong>Admin</strong> (admin role) is where the application is configured. It is split into three sub-screens in the
navigation rail: <strong>Users &amp; Teams</strong>, <strong>Application Configuration</strong> (application settings, asset classes, depreciation zones, asset ID templates, asset categories,
asset departments, PM categories, parts categories, maintenance defaults, tax rule sets), and <strong>Integrations</strong> (email, webhook, ServiceNow, Workday). Each is described below.
</p>
<h3>Users &amp; roles</h3>
<ul>
<li>Create and edit users name, email, team, role, status, and password.</li>
<li>The list paginates and is filterable. A users role controls what they can see and do.</li>
</ul>
<h3>Teams</h3>
<p>Group users into teams. Select a team to edit or delete it (a team in use by members cant be deleted until theyre reassigned).</p>
<h3>Roles</h3>
<p>Create and edit roles and the capabilities they grant including custom roles. See <a href="#" @click.prevent="select('roles')">Roles &amp; permissions</a>.</p>
<h3>Application settings</h3>
<p>Server name, allowed cross-origin domains, and the database driver/path (read-only) used by this deployment.</p>
<h3>Asset ID templates</h3>
<p>
Define naming patterns that auto-assign asset tags. Put <strong>#</strong> characters where the running number goes
its zero-padded to that width and increments automatically. For example <code>DT-######</code> produces DT-000001,
DT-000002, and <code>T-A#####</code> produces T-A00001. Each template has a next number you can set (e.g. to
continue an existing sequence), and a live preview of the next tag.
</p>
<p>
Assign a template to a category in <strong>Asset categories</strong> (below). Then, when someone creates an asset and
picks that category, the <strong>Asset ID is filled in automatically</strong> from the template they can still type
their own ID to override it. Categories with no template use the default <code>MA-#####</code> sequence. Deleting a
template never renames existing assets; it just unassigns the affected categories.
</p>
<h3>Asset classes</h3>
<p>
A managed catalog of IRS asset classes (class number, GDS/ADS recovery periods), pre-loaded from the IRS tables
commonly-used assets, manufacturing industry, and business activity. <strong>Create, edit, and delete</strong> entries here;
filter by source or search by description/class number. These power the Look up IRS asset class search when you set a
categorys class number. Deleting a class never changes assets or categories it only removes it from the lookup.
</p>
<h3>Asset categories</h3>
<p>
Create, rename, and delete the categories offered in the asset forms <strong>Category</strong> dropdown so users
choose from a controlled list instead of typing free text. The list is searchable and paginated and shows how many
assets use each category, plus the <strong>ID template</strong> assigned to it (chosen when you create or edit a category).
</p>
<ul>
<li><strong>Renaming</strong> a category automatically updates every asset that uses it, so its also the way to merge two categories (rename one to match the other).</li>
<li><strong>Deleting</strong> a category leaves existing assets values untouched; the category simply stops appearing in the dropdown. The confirmation tells you how many assets are affected first.</li>
<li><strong>Asset class number</strong> an optional number on the category that is <strong>shared by every asset in it</strong>. New assets inherit it automatically, and changing it cascades to all existing assets in the category. It appears (read-only) on each assets Details tab. Use the built-in <strong>Look up IRS asset class</strong> search to pick from the IRS tables <em>commonly-used assets</em>, <em>manufacturing industry</em>, and <em>business activity</em>; each result is tagged Common, Manufacturing, or Business and shows its GDS/ADS recovery periods. You can also type a custom number.</li>
</ul>
<h3>Asset departments</h3>
<p>
Works exactly like Asset categories, but for the asset forms <strong>Department</strong> dropdown create, rename
(cascades to assets, and merges by renaming to match), and delete (assets keep their value; it just leaves the dropdown).
</p>
<h3>PM categories</h3>
<p>
The same management, but for the <strong>Category</strong> dropdown on preventative-maintenance plans and kept
<strong>separate from asset categories</strong>. Renaming cascades to PM plans; deleting leaves existing plans values
and removes the option from the dropdown.
</p>
<h3>Parts categories</h3>
<p>
The same management again, for the <strong>Category</strong> dropdown on parts inventory separate from asset and PM
categories, and pre-loaded with a starter set (Electrical, Plumbing, Structural Component, Electronic Component, Fire
Safety, Mechanical Safety, Other). Renaming cascades to parts; deleting leaves existing parts values.
</p>
<h3>Email &amp; alerts (SMTP)</h3>
<ul>
<li>Turn email alerts on/off, set how many days ahead to warn, and the recipient list.</li>
<li>Configure the mail server (host, port, security, username, from-address). The password is write-only blank keeps the stored value.</li>
<li>Use <strong>Send test</strong> to verify delivery.</li>
</ul>
<h3>Alert webhook</h3>
<p>
Enable webhook delivery and set the destination URL to have each new alert posted as a JSON object. An optional signing
secret adds a verification signature to each request. <strong>Send test event</strong> confirms the endpoint works, and a sample
payload is shown for whoever builds the receiving side.
</p>
<h3>ServiceNow integration</h3>
<p>Connection, incident push, and CMDB pull settings covered in detail under <a href="#" @click.prevent="select('servicenow')">ServiceNow integration</a>.</p>
<h3>Maintenance (PM) defaults</h3>
<p>Set the default maintenance frequency for newly attached plans and how many days ahead PM-due alerts should appear.</p>
<h3>Workday connector</h3>
<ul>
<li>Configure the connection to your Workday tenant to sync employees, departments, and locations.</li>
<li>Run a manual <strong>Sync workers</strong>, or enable <strong>automatic scheduled sync</strong> and set the interval in hours.</li>
<li>Synced employees populate both the assignments employee list and the Contacts directory (with manager and start-date enrichment).</li>
</ul>
<h3>Tax rule sets</h3>
<p>A quick reference list of the rule sets in the system; manage them fully on the <a href="#" @click.prevent="select('taxrules')">Tax rules</a> screen.</p>
</section>
<!-- ROLES -->
<section v-show="isShown('roles')" class="manual-section">
<h2>Roles &amp; permissions</h2>
<p>
Every user has one role, and a role is a set of <strong>capabilities</strong> (granular permissions such as Create &amp; edit
assets or Manage integrations). Capabilities decide which screens appear and which actions are allowed. Roles are managed
in <strong>Admin Users &amp; Teams Roles</strong>, where you can edit the built-in roles or create your own.
</p>
<h3>Built-in roles</h3>
<table class="manual-table">
<thead><tr><th>Role</th><th>Typical use &amp; access</th></tr></thead>
<tbody>
<tr><td><strong>Administrator</strong></td><td>Full access (every capability), including users, roles, settings, and integrations. Always retains all capabilities.</td></tr>
<tr><td><strong>Finance</strong></td><td>Assets, books, reports, tax rules, maintenance, parts, contacts, assignments, alerts everything except system administration.</td></tr>
<tr><td><strong>Operations</strong></td><td>Day-to-day asset, maintenance, parts, contacts, scanning, assignments, and alert work. No financial or system configuration.</td></tr>
<tr><td><strong>PM Admin</strong></td><td>Owns preventative maintenance: create/edit PM plans &amp; defaults, complete services, manage parts, and work alerts.</td></tr>
<tr><td><strong>PM User</strong></td><td>Completes preventative maintenance and views assets, parts, and alerts but cant change PM plans.</td></tr>
<tr><td><strong>Viewer</strong></td><td>Read-only access to dashboards, assets, maintenance, and reports.</td></tr>
</tbody>
</table>
<h3>Custom roles (role editor)</h3>
<p>In <strong>Admin Users &amp; Teams</strong>, the <strong>Roles</strong> panel lets you tailor access:</p>
<ul>
<li><strong>New role</strong> name it, then tick the capabilities it should grant (grouped by area: Assets, Maintenance, Finance, etc.).</li>
<li><strong>Edit</strong> any role to change its name, description, or capabilities. Changes take effect the next time affected users sign in. The Administrator role cant be restricted.</li>
<li><strong>Delete</strong> a custom role once no users are assigned to it. Built-in roles cant be deleted.</li>
<li>Assign a role to a user in the users edit dialog; the role list there always reflects your current roles.</li>
</ul>
<v-alert type="info" variant="tonal" density="comfortable" class="manual-callout">
If you expect a screen or button that isnt there, your role likely doesnt include the capability for it an administrator
can grant it on the Roles panel or move you to a different role.
</v-alert>
</section>
<div class="manual-footer quiet">MixedAssets User Guide · select a topic on the left, or use Print / Save PDF for the full manual.</div>
</div>
</div>
</v-card>
</v-dialog>
</template>
<script>
export default {
props: {
modelValue: { type: Boolean, default: false }
},
emits: ['update:modelValue'],
data() {
return {
active: 'overview',
search: '',
printing: false,
sampleRuleSet: [
'{',
' "schema": "mixedassets.taxRuleSet.v1",',
' "jurisdiction": "US-CA",',
' "name": "California depreciation",',
' "version": "2026.1",',
' "effectiveDate": "2026-01-01",',
' "sourceNote": "Confirm against current state law before filing.",',
' "books": ["GAAP", "STATE"],',
' "conventions": ["half_year", "mid_quarter", "mid_month", "none"],',
' "limits": {',
' "section179": {',
' "deductionLimit": 25000,',
' "phaseOutBegins": 200000,',
' "cannotCreateLoss": true',
' },',
' "bonusDepreciation": {',
' "qualifiedPropertyPercent": 0',
' }',
' },',
' "assetLives": [',
' { "code": "5Y", "label": "5-year property", "months": 60 },',
' { "code": "7Y", "label": "7-year property", "months": 84 }',
' ],',
' "methods": [',
' {',
' "code": "straight_line",',
' "family": "GAAP",',
' "label": "Straight-line",',
' "formula": "straight_line",',
' "lifeMonths": 60,',
' "defaultConvention": "half_year"',
' },',
' {',
' "code": "state_200db_5",',
' "family": "MACRS",',
' "label": "200% declining balance, 5-year",',
' "formula": "macrs_declining_balance",',
' "lifeMonths": 60,',
' "rateMultiplier": 2,',
' "switchToStraightLine": true,',
' "defaultConvention": "half_year"',
' },',
' {',
' "code": "acrs_5yr_table",',
' "family": "ACRS",',
' "label": "ACRS 5-year (statutory rates)",',
' "formula": "rate_table",',
' "lifeMonths": 60,',
' "rates": [0.15, 0.22, 0.21, 0.21, 0.21]',
' }',
' ]',
'}'
].join('\n'),
sections: [
{ id: 'overview', title: 'Getting started', icon: 'mdi-rocket-launch-outline', keywords: 'intro begin login sign in welcome' },
{ id: 'navigation', title: 'Interface & navigation', icon: 'mdi-view-dashboard-outline', keywords: 'menu rail theme dark light table sort filter top bar' },
{ id: 'dashboard', title: 'Dashboard', icon: 'mdi-chart-box-outline', keywords: 'home summary chart category value' },
{ id: 'assets', title: 'Assets — creating & managing', icon: 'mdi-archive-search-outline', keywords: 'asset register create edit import export mass edit workbench files notes tasks warranty' },
{ id: 'lifecycle', title: 'Asset lifecycle', icon: 'mdi-cash-remove', keywords: 'dispose disposal sale retire gain loss lease amortization impairment adjustment write down' },
{ id: 'barcodes', title: 'Barcodes & scanning', icon: 'mdi-barcode-scan', keywords: 'barcode label print scan camera tag' },
{ id: 'books', title: 'Books, depreciation & tax', icon: 'mdi-book-open-variant', keywords: 'book gaap federal depreciation general ledger gl method convention 179 bonus reports' },
{ id: 'taxrules', title: 'Tax rule sets', icon: 'mdi-scale-balance', keywords: 'tax rules jurisdiction method limits activate version' },
{ id: 'templates', title: 'Templates', icon: 'mdi-form-select', keywords: 'template defaults custom fields data entry' },
{ id: 'pm', title: 'Preventative maintenance', icon: 'mdi-wrench-clock', keywords: 'pm maintenance plan steps complete close signature ratings guidance photos schedule' },
{ id: 'parts', title: 'Parts inventory', icon: 'mdi-package-variant-closed', keywords: 'parts stock aisle bin reserve reorder supplier inventory' },
{ id: 'contacts', title: 'Contacts & CRM', icon: 'mdi-card-account-details-outline', keywords: 'contacts crm vendor employee contractor work location supplier notes' },
{ id: 'assignments', title: 'Assignments (custody)', icon: 'mdi-account-switch-outline', keywords: 'assignment custody employee release traceability' },
{ id: 'alerts', title: 'Alerts & reminders', icon: 'mdi-bell-alert-outline', keywords: 'alerts reminders severity scan acknowledge dismiss email digest webhook servicenow' },
{ id: 'servicenow', title: 'ServiceNow integration', icon: 'mdi-cloud-sync-outline', keywords: 'servicenow incident ticket cmdb import sync connection' },
{ id: 'admin', title: 'Administration', icon: 'mdi-cog-outline', keywords: 'admin users roles teams settings smtp email webhook workday configuration' },
{ id: 'roles', title: 'Roles & permissions', icon: 'mdi-shield-account-outline', keywords: 'roles permissions admin finance operations viewer access' }
]
};
},
computed: {
filteredSections() {
const needle = String(this.search || '').trim().toLowerCase();
if (!needle) return this.sections;
return this.sections.filter((s) =>
s.title.toLowerCase().includes(needle) || s.keywords.includes(needle) || s.keywords.split(' ').some((k) => k.startsWith(needle))
);
}
},
watch: {
modelValue(open) {
if (open) {
this.search = '';
this.printing = false;
}
}
},
methods: {
isShown(id) {
return this.printing || this.active === id;
},
select(id) {
this.active = id;
this.$nextTick(() => {
if (this.$refs.content) this.$refs.content.scrollTop = 0;
});
},
print() {
this.printing = true;
this.$nextTick(() => {
window.print();
this.printing = false;
});
}
}
};
</script>
<style scoped>
.manual-body {
display: flex;
flex: 1 1 auto;
min-height: 0;
overflow: hidden;
}
.user-manual-nav {
flex: 0 0 264px;
border-right: 1px solid rgba(var(--v-theme-on-surface), 0.12);
overflow-y: auto;
background: rgba(var(--v-theme-on-surface), 0.02);
}
.manual-content {
flex: 1 1 auto;
overflow-y: auto;
padding: 28px 36px;
}
.manual-section {
max-width: 820px;
}
.manual-section h2 {
font-size: 1.5rem;
font-weight: 700;
margin: 0 0 14px;
padding-bottom: 8px;
border-bottom: 2px solid rgba(var(--v-theme-primary), 0.4);
}
.manual-section h3 {
font-size: 1.08rem;
font-weight: 700;
margin: 22px 0 8px;
}
.manual-section p {
line-height: 1.6;
margin: 0 0 12px;
}
.manual-section ul,
.manual-section ol {
line-height: 1.6;
margin: 0 0 12px;
padding-left: 22px;
}
.manual-section li {
margin-bottom: 6px;
}
.manual-section a {
color: rgb(var(--v-theme-primary));
cursor: pointer;
}
.manual-callout {
margin: 14px 0 18px;
}
.manual-table {
width: 100%;
border-collapse: collapse;
margin: 6px 0 16px;
font-size: 0.92rem;
}
.manual-table th,
.manual-table td {
text-align: left;
vertical-align: top;
padding: 8px 12px;
border-bottom: 1px solid rgba(var(--v-theme-on-surface), 0.12);
}
.manual-table th {
font-weight: 700;
background: rgba(var(--v-theme-on-surface), 0.04);
}
.manual-section :deep(code),
.manual-section code {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 0.85em;
padding: 1px 5px;
border-radius: 4px;
background: rgba(var(--v-theme-on-surface), 0.08);
}
.manual-code {
margin: 6px 0 16px;
padding: 14px 16px;
border-radius: 8px;
background: rgba(var(--v-theme-on-surface), 0.06);
border: 1px solid rgba(var(--v-theme-on-surface), 0.12);
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 0.82rem;
line-height: 1.5;
white-space: pre;
overflow-x: auto;
}
.manual-doc-title h1 {
font-size: 1.8rem;
font-weight: 800;
margin-bottom: 4px;
}
.manual-footer {
margin-top: 32px;
padding-top: 14px;
border-top: 1px solid rgba(var(--v-theme-on-surface), 0.12);
font-size: 0.85rem;
}
</style>