Updated A LOT
This commit is contained in:
994
src/components/UserManual.vue
Normal file
994
src/components/UserManual.vue
Normal 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 & 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 & 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 & 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 & 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 & 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 & 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 theme’s 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 you’re 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 system’s “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 & 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 it’s 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 & 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 & 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 & 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 book’s net book value at the disposal date, so the figure reflects that book’s
|
||||
method and conventions. Disposals also feed the disposal and gain/loss reports.
|
||||
</v-alert>
|
||||
|
||||
<h3>Impairments & 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 asset’s 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 & 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
|
||||
asset’s <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 isn’t available,
|
||||
manual code entry works everywhere.
|
||||
</v-alert>
|
||||
</section>
|
||||
|
||||
<!-- BOOKS / DEPRECIATION -->
|
||||
<section v-show="isShown('books')" class="manual-section">
|
||||
<h2>Books, depreciation & 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 book’s 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 jurisdiction’s 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 book’s 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 asset’s Books tab.</li>
|
||||
<li>Delete a book that isn’t a primary or maintenance book and isn’t 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
|
||||
period’s depreciation expense rolled to GL accounts, with per-asset detail and a summary. You can export the ledger.
|
||||
</p>
|
||||
|
||||
<h3>Depreciation methods & critical fields</h3>
|
||||
<p>
|
||||
Each book’s 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 asset’s Details tab (e.g. <strong>New York Liberty Zone</strong>) and the
|
||||
engine automatically applies the zone’s §168 special allowance (30% for NY Liberty) to the <strong>federal book</strong> when the
|
||||
asset’s placed-in-service date falls within the zone’s 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 jurisdiction’s caps for reference. The actual §179 and bonus amounts applied to a given
|
||||
asset are the values you enter on that asset’s <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 asset’s Books tab, the engine
|
||||
matches your choice by its <code>code</code> and computes depreciation using that entry’s 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 book’s “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 book’s 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 year’s 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 & 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 plan’s 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 asset’s 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 asset’s <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 1–5★ <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 asset’s 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 & 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 & 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 form’s <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 & 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 alert’s <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 incident’s 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 & 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 & roles</h3>
|
||||
<ul>
|
||||
<li>Create and edit users — name, email, team, role, status, and password.</li>
|
||||
<li>The list paginates and is filterable. A user’s 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 can’t be deleted until they’re 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 & 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 —
|
||||
it’s 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
|
||||
category’s 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 form’s <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 it’s 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 asset’s 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 form’s <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 & 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 & permissions</h2>
|
||||
<p>
|
||||
Every user has one role, and a role is a set of <strong>capabilities</strong> (granular permissions such as “Create & edit
|
||||
assets” or “Manage integrations”). Capabilities decide which screens appear and which actions are allowed. Roles are managed
|
||||
in <strong>Admin → Users & 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 & 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 & 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 can’t 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 & 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 can’t be restricted.</li>
|
||||
<li><strong>Delete</strong> a custom role once no users are assigned to it. Built-in roles can’t be deleted.</li>
|
||||
<li>Assign a role to a user in the user’s 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 isn’t there, your role likely doesn’t 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>
|
||||
Reference in New Issue
Block a user