★ Superadmin — you are managing {{ S.plant.name }}
Open Work Orders
{{kpis.open}}
{{kpis.openPM}} preventive · {{kpis.openCM}} corrective
Overdue PM
{{kpis.overdue}}
{{kpis.dueSoon}} due within 7 days
Low / Out of Stock
{{kpis.low.length}}
{{kpis.outStock}} out of stock
Completed (month)
{{kpis.completedMo}}
{{kpis.downtimeMo.toFixed(1)}} h downtime
Maint. Cost (month)
{{fmtMoney(kpis.costMo)}}
parts + labor
Inventory Value
{{fmtMoney(kpis.invValue)}}
{{S.db.inventory.length}} spare items
Recent Work Orders
| WO # | Type | Asset | Title | Status | Due |
|---|---|---|---|---|---|
| {{w.woNo}} | {{w.type==='Preventive'?'PM':'CM'}} | {{assetName(w.assetId)}} | {{w.title}} | {{w.status}} | {{dueLabel(w).t}}{{dueLabel(w).t}} |
No work orders yet.
Low Stock Alerts
| Part | Avail | Min |
|---|---|---|
| {{i.name}} {{i.partNo}} |
{{i.qtyAvailable}} | {{i.minLevel}} |
All spares above minimum. 👍
| WO # | Type | Priority | Asset | Title | Assigned | Status | Due | Cost | |
|---|---|---|---|---|---|---|---|---|---|
| {{w.woNo}} | {{w.type==='Preventive'?'PM':'CM'}} | {{w.priority||'—'}} | {{assetName(w.assetId)}} | {{w.title}} | {{w.assignedTo||'—'}} | {{w.status}} | {{dueLabel(w).t}}{{dueLabel(w).t}} | {{fmtMoney(woTotalCost(w))}} |
No work orders match.
Tick Done ✓ when a task is completed — it records a completed entry and moves the next-due date forward.
| Done ✓ | Asset | Task | Frequency | Assigned | Last Done | Next Due | Status | |
|---|---|---|---|---|---|---|---|---|
| {{assetName(s.assetId)}} | {{s.task}} | every {{s.frequencyDays}}d | {{s.assignedTo||'—'}} | {{s.lastDone||'—'}}today | {{s.nextDue}} | {{pmStatus(s).t}} |
No PM schedules yet — add one, or bulk-upload from Excel under Backup / Data.
| Code | Name | Category | Location | Criticality | Status | Parts | Added by | |
|---|---|---|---|---|---|---|---|---|
| {{a.code}} | {{a.name}} | {{a.category||'—'}} | {{a.location||'—'}} | {{a.criticality||'—'}} | {{a.status||'—'}} | {{(a.parts||[]).length||''}} | {{a.createdBy||'—'}} |
No assets yet.
| Part No. | Name | Category | Location | Available | Used | Min | Stock | Unit Cost | Value | Added by | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{i.partNo}} | {{i.name}} | {{i.category||'—'}} | {{i.location||'—'}} | {{i.qtyAvailable}} | {{consumedQty(i.id)}} | {{i.minLevel}} | {{fmtMoney(i.unitCost)}} | {{fmtMoney((Number(i.qtyAvailable)||0)*(Number(i.unitCost)||0))}} | {{i.createdBy||'—'}} |
No spares match.
On-time Compliance
{{pmReport.pct}}%
{{pmReport.onTime}} of {{pmReport.activeCount}} active on schedule
Overdue Tasks
{{pmReport.overdue.length}}
need attention now
Due in 7 days
{{pmReport.dueSoon.length}}
coming up
Completed (30 days)
{{pmReport.completed30}}
tasks ticked done ✓
Overdue PM Tasks
| Task | Asset | Assigned | Due | Overdue |
|---|---|---|---|---|
| {{s.task}} | {{assetName(s.assetId)}} | {{s.assignedTo||'—'}} | {{s.nextDue}} | {{-s.days}}d |
No overdue PM tasks — fully on schedule. 👍
Compliance by Technician
| Technician | Tasks | Overdue | On-time |
|---|---|---|---|
| {{a.name}} | {{a.total}} | {{a.overdue||''}} | {{a.pct}}% |
No active PM schedules yet.
Work Orders & Cost
Total WOs
{{S.db.workOrders.length}}
{{report.completed.length}} completed
PM vs CM
{{report.ratio}}%
{{report.pm}} PM · {{report.cm}} CM
Total Cost
{{fmtMoney(report.totalCost)}}
parts {{fmtMoney(report.partsCost)}}
Total Downtime
{{report.downtime.toFixed(1)}} h
completed jobs
Cost & Downtime by Asset
| Asset | Jobs | Downtime | Cost |
|---|---|---|---|
| {{k==='none'?'(unassigned)':assetName(k)}} | {{v.jobs}} | {{v.downtime.toFixed(1)}}h | {{fmtMoney(v.cost)}} |
No completed work orders.
Top Consumed Spares
| Part | Used | Avail | Cost of use |
|---|---|---|---|
| {{c.i.name}} {{c.i.partNo}} | {{c.used}} | {{c.i.qtyAvailable}} | {{fmtMoney(c.used*(Number(c.i.unitCost)||0))}} |
No spares consumed yet.
Maintenance Log (completed)
| Date | WO # | Type | Asset | Title | Tech | Downtime | Cost |
|---|---|---|---|---|---|---|---|
| {{w.completedDate||'—'}} | {{w.woNo}} | {{w.type==='Preventive'?'PM':'CM'}} | {{assetName(w.assetId)}} | {{w.title}} | {{w.assignedTo||'—'}} | {{(Number(w.downtimeHours)||0).toFixed(1)}}h | {{fmtMoney(woTotalCost(w))}} |
No completed maintenance yet.
| When | User | Action | Details |
|---|---|---|---|
| {{fmtTs(a.ts)}} | {{a.username}} | {{a.action}} | {{a.detail}} |
No activity recorded yet.
Admin: full control — delete data, manage users, view the audit log.
User: upload, download/export, create & edit — but cannot delete data or manage users.
User: upload, download/export, create & edit — but cannot delete data or manage users.
| Name | Username | Role | Created | |
|---|---|---|---|---|
| {{u.name||'—'}}you | {{u.username}} | {{u.role}} | {{u.createdAt?fmtTs(u.createdAt):'—'}} |
You are working in {{S.plant.name}}. New plants need their own admin set up at first sign-in. Use Sign out / switch plant to change.
| Plant | Location | Created | |
|---|---|---|---|
| {{p.name}}current | {{p.location||'—'}} | {{p.createdAt?fmtTs(p.createdAt):'—'}} |
Note: the plant list refreshes on sign-in. After adding a plant here, sign out to see it in the dropdown.
Bulk Upload via Excel / CSV
Download a template, fill it in Excel, then upload the saved .xlsx (or .csv). Rows are matched by code / part number — existing entries are updated, new ones added.
⚙ Machinery
Code, Name, Category, Location, Criticality, Status, Manufacturer, Model, Serial, Install Date.
📦 Spares
Part No, Name, Category, Location, Qty Available, Min Level, Unit Cost, Unit, Supplier.
🔧 Machine Parts
Machine Code, Part No, Qty, Interval (days), Notes. Add machinery & spares first.
🗓 PM Schedules
Machine Code, Task, Frequency (days), Assigned To, Last Done, Next Due, Active. Matched by machine + task.
Export
Download this plant's data as a JSON backup.
Restore admin only
Replace this plant's data from a backup.
Reset admin only
Delete all maintenance data (users kept).
Stored now
{{S.db.assets.length}} assets · {{S.db.workOrders.length}} work orders · {{S.db.pmSchedules.length}} PM · {{S.db.inventory.length}} spares