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 tablereport.{name}.export-excel— download the Excelreport.{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:
- Filter heavily to get close. Check whether existing filters can isolate what you want.
- Export to Excel and pivot. Most "different question" needs are answered by reorganizing the same rows.
- 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.
ExpectedUsefulLifeMonthsis 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 |