05 — Reporting & Insights

What reports the system ships, what business questions each one answers, who uses them, and how to read them.

How reports work

The system ships with six fixed business reports. Each one is a filterable list page with an Excel/PDF export. They aren't user-customizable in the way a BI tool would be — they're hand-built, optimized queries that answer specific operational questions.

flowchart LR
  subgraph "What's tracked"
    A[Assets +<br/>history tables]
    AU[Audit results<br/>+ review actions]
    XF[Transfers<br/>+ lines]
    CO[Check-outs]
    WO[Work orders]
  end
  subgraph "Reports"
    R1[Asset<br/>Inventory]
    R2[Audit<br/>Results]
    R3[Audit<br/>History]
    R4[Maintenance<br/>History]
    R5[Transfer<br/>History]
    R6[Checkout<br/>Activity]
  end
  subgraph "Output"
    UI[Filtered table on screen]
    XLSX[Excel download]
    PDF[PDF download]
  end
  A --> R1
  AU --> R2
  AU --> R3
  WO --> R4
  XF --> R5
  CO --> R6
  R1 --> UI
  R1 --> XLSX
  R1 --> PDF
  R2 --> UI
  R2 --> XLSX
  R2 --> PDF
  R3 --> UI
  R3 --> XLSX
  R3 --> PDF
  R4 --> UI
  R4 --> XLSX
  R4 --> PDF
  R5 --> UI
  R5 --> XLSX
  R5 --> PDF
  R6 --> UI
  R6 --> XLSX
  R6 --> PDF

The reports hub (/reports)

A landing page with one tile per report. Each tile only shows if the user has the matching read permission, so a Branch Manager with only report.asset-inventory.read sees one tile, while an analyst with everything sees all six.

Tiles are clickable and lead to the per-report page.

Granular permissions

Reports use three permission keys per report:

  • report.{name}.read — view the on-screen table
  • report.{name}.export-excel — download the Excel
  • report.{name}.export-pdf — download the PDF

This three-way split is intentional. Common arrangements:

  • Operations team — read all reports, no exports (they look but don't copy)
  • Compliance team — read + PDF export only (PDFs are the official archive)
  • Analyst team — everything including Excel (they need pivot-table-able rows)
  • Read-only auditors / executives — only the reports relevant to their scope

Set up these patterns by creating custom roles bundling the right per-report permissions.

Anatomy of a report page

Every report follows the same shape:

flowchart TB
  T[Title bar:<br/>report name + Export buttons]
  F[Filters panel:<br/>main filters in a row +<br/>collapsible Advanced section]
  TBL[Data table:<br/>paginated, sortable]
  T --> F
  F --> TBL
  • Top bar — report name on the left, Export to Excel + Export to PDF buttons on the right (each gated by its respective permission)
  • Filters — the most-used filters in a top row, plus a collapsible "Advanced filters" panel for the rest. A small badge shows how many advanced filters are active.
  • Table — paginated server-side. Sortable columns. "Showing 1-20 of 4,316".

Filters apply to both the on-screen table and the export. Click "Export Excel" with Status = Active and Organization = HQ selected → you get an Excel of only those rows.


1. Asset Inventory (/reports/asset-inventory)

Question it answers

Where is everything right now? — A snapshot of every asset in the system with its current location, organization, classification, status, and custodian.

Who uses it

Role Use case
Operations manager Daily — "what laptops do we have?"
Compliance officer Quarterly — full inventory list for finance / insurance reconciliation
Auditor Pre-audit — get the universe of assets to audit
Insurance / accounting Annual — total asset count and replacement value (when price is captured)

Filters

  • Search — code or name
  • Organization — hierarchical picker, optional Include-descendants
  • Location — same
  • Classification — same
  • Status — Active / InMaintenance / Missing / OutOfService / Disposed / Reserved / OnLoan / etc.
  • Critical only — show only assets flagged critical
  • Include descendants — toggle that affects org/loc/class filters at once

Columns

Column What it shows
Code The asset's printed code
Name Bilingual asset name
Organization code + name Current org assignment
Location code + name Current location
Classification code + name Category
Status The current asset status
Custodian Who currently holds it (if checked out)
Critical Yes / No
Last seen The last time an audit touched the asset

Typical scenarios

  • "How many laptops in Building A?" — Filter by Classification = Laptops, Location = Building A (with Include-descendants on). The page shows the count + the list.
  • "Insurance refresh" — Export to Excel with no filters. Send to insurance; they get every asset's location and classification.
  • "Pre-audit reality check" — Export the assets in the planned scope to Excel. Manually sample-check 10. Then run the audit; compare results.

2. Audit Results (/reports/audit-results)

Question it answers

What did the latest audits find? — Result-level summary across all submitted audits, with discrepancy counts and review status.

Who uses it

Role Use case
Audit Reviewer Daily — see their queue of pending reviews
Audit Planner Weekly — track progress of in-flight audits
Compliance lead Monthly — KPI report on audit completion
Department head Quarterly — find out what was discrepant in their org

Filters

  • Search (code, plan name, auditor name)
  • Plan picker
  • Asset picker
  • Outcome (Found / NotFound / LocationMismatch / OrganizationMismatch / Extra)
  • Review status (PendingReview / InReview / UnderClarification / Approved / Rejected)
  • Submitted date range

Columns

Column What it shows
Plan The plan name + code
Assignment The assignment code
Auditor Who submitted
Result The result code
Submitted at Timestamp
Asset code + name The audited asset
Outcome Auditor's call
Method Qr / Manual
Expected location vs Observed Side-by-side compare for mismatches
Expected organization vs Observed Same
Condition Auditor's 1-5 rating (if recorded)
Review status Approved / Rejected / Modified / Pending
Reviewer Who decided
Reviewed at Timestamp
Photos Count
Notes Auditor's free-text

Typical scenarios

  • "Show me all NotFound items from last month, not yet reviewed" — Filter outcome = NotFound, review status = PendingReview/InReview, submitted = last 30 days. Reviewer's daily queue.
  • "Audit accuracy check" — Filter outcome = Found, identification method = Manual. The high-volume of manually-typed "found" items is suspicious (auditor might be batching without scanning). Flag for the reviewer.
  • "Quarterly compliance report" — Filter by submitted date range = last quarter. Export to PDF. Counts of approved corrections per outcome.

3. Audit History (/reports/audit-history)

Question it answers

Asset-by-asset audit trail across time — every line ever submitted for a given asset (or set of assets), oldest to newest. Useful for tracking how an asset's status drifted over multiple audits.

Who uses it

Role Use case
Investigator Researching a single asset's audit history when something's gone wrong
Audit Planner "Has this asset been audited recently?"
Compliance officer "Show me every audit that touched this serial-numbered laptop"
Department head Analyzing audit patterns within their org

Filters

  • Search (asset name, code)
  • Asset picker — common starting point: pick one asset and see its audit history
  • Plan picker
  • Outcome
  • Review status

Columns

Column What it shows
Asset code + name Which asset
Plan code + name Which audit plan
Assignment code Which assignment
Auditor Who scanned
Assignment status Submitted / InReview / Completed
Submitted at Timestamp
Outcome Auditor's call
Method Qr / Manual
Condition 1-5 stars
Photos Count
Review status Approved / Rejected / Modified / Pending
Notes Auditor's free-text

Typical scenarios

  • "This laptop keeps getting marked LocationMismatch" — Filter by asset; see four audits over six months, all marking it in a different room than expected. Conclusion: the official record is wrong, fix it once. (Alternatively: the asset is actually nomadic and the "expected" location should be its true home.)
  • "Show me audit drift across the building" — Don't filter by asset; filter by Location and Outcome = LocationMismatch. Count how many assets in the building have a mismatch. High count → systematic record problem.
  • "All audits in Q1" — Filter by submitted date range; export to Excel for analysis.

The Audit History report differs from Audit Results in granularity. Audit Results answers "what happened in this submission?" — every line of every result. Audit History is the same data but pivoted around the asset, useful when you want to see one asset's audit lineage rather than an audit's coverage.


4. Maintenance History (/reports/maintenance-history)

Question it answers

What's been worked on, when, by whom, at what cost — every work order, completed or in-flight.

Who uses it

Role Use case
Maintenance manager Weekly — workload + backlog
Finance / accounting Monthly — cost rollup per cost center
Operations director Quarterly — maintenance trends per asset class
Vendor manager Vendor-spend analysis

Filters

  • Search (code, summary, asset)
  • Asset picker
  • Vendor picker
  • Type (Preventive / Corrective / Inspection / Calibration / Other)
  • Priority (Low / Normal / High / Critical)
  • Status (Open / Assigned / InProgress / OnHold / Completed / Cancelled)
  • Completed date range

Columns

Column What it shows
Code WO code
Asset code + name What was worked on
Type Preventive / Corrective / etc.
Priority Tag
Status Open / InProgress / Completed / Cancelled
Summary Short description
Assigned user If a person is assigned
Vendor If a vendor is assigned
Scheduled start / end Plan window
Actual start / end Real start / end
Downtime hours How long the asset was unavailable
Labor cost / Parts cost / Total cost Captured at completion
Currency Per-WO
Resolution notes Free-text

Typical scenarios

  • "Vendor spend last quarter" — Filter by vendor + completed date range. Sum the Total cost column in Excel.
  • "Recurring failures" — Filter by Type = Corrective, Priority = High/Critical, group by asset in Excel pivot. Assets with multiple high-priority correctives are candidates for replacement.
  • "Mean time to repair" — Export to Excel. Compute (ActualEnd - ActualStart) per WO. Aggregate by asset class.
  • "Backlog snapshot" — Filter by Status in (Open, Assigned, InProgress, OnHold). Count by priority. Spike in High-priority Open WOs → resourcing issue.

5. Transfer History (/reports/transfer-history)

Question it answers

Movement of assets between organizations or locations — every transfer, every line, with the actual movement detail.

Who uses it

Role Use case
Logistics manager Daily — what's in flight, what completed
Cost center accountant Monthly — assets transferring out of their books
Compliance Reconcile movements with physical-presence audits
Department head "Where did this team's equipment go?"

Filters

  • Search (transfer code, reason, asset)
  • Asset picker
  • From/To organization
  • From/To location
  • Status (Draft / Submitted / Approved / InTransit / Completed / Rejected / Cancelled)
  • Requested date range

Columns

Column What it shows
Transfer code Code
Status Tag
Asset code + name The line's asset
From organization name Departure org
To organization name Arrival org
From location name Departure location
To location name Arrival location
Requested by Originator
Requested at Timestamp
Approved by + at Decision audit
Completed by + at Receipt audit
Expected completion date If set
Line received at When this specific asset arrived
Line received status Ok / Damaged / Missing
Line notes Per-line free-text

Note: this report is line-level, not transfer-level. A transfer with 5 assets shows 5 rows.

Typical scenarios

  • "Cross-org transfers last quarter" — Filter by date range, From organization ≠ To organization. Useful for inter-departmental cost reconciliation.
  • "Damaged-arrival rate" — Filter line received status = Damaged, completed date range. Count by source/destination. High rates point to packaging/shipping problems.
  • "Pending transfers older than 5 days" — Filter status = Submitted, requested date < 5 days ago. Approver backlog.
  • "Specific asset's location history" — Filter by asset. Every transfer it was on, with timestamps. Pairs nicely with Audit History for the same asset.

6. Checkout Activity (/reports/checkout-activity)

Question it answers

Who's holding what; what's overdue — current and historical check-out activity with overdue tracking.

Who uses it

Role Use case
Help desk / IT ops Daily — what's out, what's overdue
HR / off-boarding Per-departure — assets to retrieve from a leaving employee
Asset manager Weekly — overdue cleanup
Compliance Quarterly — long-tail of stale loans

Filters

  • Search (code, custodian, asset)
  • Asset picker
  • Custodian picker
  • Status (Active / Returned / Overdue / Lost / Cancelled)
  • Overdue only toggle
  • Checked-out date range

Columns

Column What it shows
Code Check-out code
Asset code + name What was issued
Custodian name Who has it (or had it)
Checked out by Issuer
Checked out at Timestamp
Expected return at Due date
Status Active / Returned / Overdue / etc.
Days overdue Computed: (today - expected) for active items past their due date
Days out Total days held (returned items: end - start; active: today - start)
Purpose Free-text from issue time
Checked in by Returner (if returned)
Checked in at Return timestamp
Return condition rating 1-5
Return notes Free-text on return

Typical scenarios

  • "Daily overdue chase list" — Filter overdue only = true, status = Active. List goes to the help-desk team to chase.
  • "Off-boarding checklist for departing employee" — Filter by custodian = the leaver. Every active row needs to come back before their last day.
  • "Long-running loans" — Filter status = Active, days out > 180. Stale loans where the asset effectively lives with that user permanently — consider re-classifying as a permanent assignment.
  • "Damage trends on return" — Export to Excel, status = Returned, group by ReturnConditionRating. Decline in average condition over time → asset is degrading.

Report best practices

Schedule a recurring "control" report

Pick the report most relevant to your role. Run it on the same day each week / month. File it. Over time you build a longitudinal view that's more valuable than any single snapshot.

Suggested:

Role Cadence Report
Audit Planner Weekly Audit Results, filtered to last 7 days
Maintenance manager Weekly Maintenance History, filtered to in-flight WOs
Help desk lead Daily Checkout Activity, overdue only
CFO Monthly Maintenance History, completed last month, sum of total cost
Compliance Quarterly Asset Inventory + Audit History, full year-to-date

Save filtered queries via your browser

The current implementation doesn't have saved-views for reports — every visit means re-applying the filters. As a workaround, bookmark the report URL with the filters in the query string. The frontend reflects every filter into the URL, so a bookmark for "Maintenance History, status = Completed, completed last month" is just a URL.

Excel for analysis, PDF for archive

  • Excel → for further analysis (pivots, charts, summing, joining with external data). Each row is one record; columns are typed (numbers stay numbers).
  • PDF → for sharing with stakeholders who don't need to compute anything. Stable format, looks like a document. Works as a compliance archive.

When a report doesn't have what you need

The six reports are fixed — you can't add new columns or define a new report through the UI. If you need something specific:

  1. Filter heavily to get close. Check whether existing filters can isolate what you want.
  2. Export to Excel and pivot. Most "different question" needs are answered by reorganizing the same rows.
  3. Direct database query. Admins with DB access can write SQL against the same tables the reports use.

What reports do not exist

To set expectations:

  • No financial / cost-center P&L report. The system tracks WO costs but doesn't roll them up by org or cost center.
  • No depreciation schedule. ExpectedUsefulLifeMonths is captured per asset but no built-in straight-line / declining-balance depreciation report.
  • No SLA / response-time report on maintenance. You can compute it from raw maintenance history columns, but there's no dedicated dashboard.
  • No user-activity report beyond the audit log + login audit.
  • No real-time dashboards (besides the user's personal Dashboard tiles). The reports are pull-based, on demand.
  • No scheduled email of reports. A report-schedule entity exists in the database for future use, but the UI doesn't expose it. Currently, anyone wanting a recurring report runs it manually.

If any of the above are critical for your deployment, they're feasible additions — but they're not in the box today.

Where to go next

To learn… See
Bilingual rendering of reports 06 — Localization & RTL
The user roles that typically run each report 01 — User Roles
The processes that produce the data each report shows 03 — Business Processes