Repairs & Service
Repairs & Service is a three-part service desk: Job Cards track each device from intake to pickup, the Repair Price List gives staff standard quotes without calling a manager, and Spare Parts tracks the parts inventory used to fix devices — all wired together (parts picked on a job card are priced straight from the Spare Parts catalog and its stock is drawn down automatically).
Overview
A repair Job Card records the customer, the device (type, brand, model, IMEI/IMEI2, serial number), an intake condition checklist and up to 3 damage photos, the reported issue and diagnosis, labour/parts cost, any advance paid, the assigned technician, and an estimated ready date.
Jobs move through a fixed pipeline — Received → Diagnosing → In Repair → Waiting for Parts → Ready → Delivered — with Cancelled available as a side-branch; the card's "→ Next status" button always advances exactly one step.
The moment a job reaches Ready, the page automatically opens a WhatsApp "come collect your device" message if the customer has a phone on file — no need to remember to notify them separately.
Every job card also gets a public tracking link (a random token, e.g. /repair/<token>) that customers can open with no login to see their repair's current stage, mirroring the same status pipeline shown to staff.
The Repair Price List tab is a standard price book (device type, brand, repair type, labour, parts min–max, estimated total) that any staff member can consult to quote a repair on the spot.
The Spare Parts tab tracks parts in stock (name, code, device/brand fit, compatible models, quantity, low-stock threshold, purchase/selling price, supplier) — parts added to a job card via its built-in catalog search pull their price from here and reduce this stock automatically.
Before You Start
- Requires the
billingfeature at the Advanced plan tier or above; all three tabs (Job Cards, Repair Price List, Spare Parts) share this same gate. - To use the parts catalog picker on a job card (rather than typing parts in as free text), the parts must already exist in Spare Parts.
- Sending WhatsApp updates or copying the customer tracking link requires the customer's phone number to be on the job card.
Step-by-Step Guide
1 Job Cards — intake a new repair
The main day-to-day screen for logging a device drop-off.
- Click New Job Card.
- Fill in Customer Name * and Phone, then the device details: Device Type, Brand, Model Number, IMEI 1, IMEI 2 (for dual-SIM), Serial Number.
- Tap through the Condition at Intake checklist (Powers on, Screen cracked, Body scratches/dents, Water damage signs, Battery swollen, SIM/memory card inside, Pattern or PIN noted) so there is a record agreed at drop-off, and note any Accessories Received (charger, cover, box, bill…).
- Enter the Reported Issue * (required) and, if already known, a Diagnosis / Findings note.
- Add Parts Used either by searching the Spare Parts catalog (shows price and current stock per match, and lets you adjust quantity per line) or, if no catalog parts are added, by typing them as free text.
- Enter Labour, Parts (auto-filled and locked to the catalog-part total once catalog parts are added) and any Advance Paid — the running Total and Balance are shown live.
- Set Assigned To (technician) and an Est. Ready Date, add any Notes, optionally attach up to 3 Damage Photos (auto-compressed) and capture a Customer Signature on the built-in signature pad.
- Optionally expand Log OEM Warranty Claim to record a manufacturer warranty Claim No., Claim Date and Status (Submitted/Pending/Approved/Rejected/Completed).
- Click Create Job.
2 Job Cards — move a job through the pipeline and notify the customer
- Click the → [Next status] button on a job card to advance it one step (Received → Diagnosing → In Repair → Waiting for Parts → Ready → Delivered).
- When a job reaches Ready and has a phone number on file, a WhatsApp "ready for pickup" message is opened automatically, including the customer's public tracking link if one has been generated.
- At any other stage, click the WhatsApp icon on the job to manually send a status-update message instead of waiting for the automatic Ready notification.
- Click the link icon to copy the customer's public tracking URL to your clipboard (a tracking token is generated on first use for older jobs that do not have one yet) — share it by SMS, email or any channel you like.
- Use Print Job Card for a drop-off/pickup slip (with signature and photos if captured), and Print Tax Invoice (only shown once there is a cost) for a GST-aware invoice splitting labour and parts with CGST/SGST when the shop is on GST.
3 Job Cards — search, filter and manage workload
- Use the search box to find a job by customer name, job number, device type or IMEI.
- Click a status chip (All, Received, Diagnosing, In Repair, Waiting for Parts, Ready, Delivered, Cancelled) to filter the list to that stage.
- Use the Technician workload chips (auto-generated from jobs currently open) to filter to a specific technician's open jobs and see how many each has at a glance.
- Click the history icon on a job with an IMEI or serial number to open Device Repair History — every previous job logged against that same IMEI/serial, so repeat issues are visible before you start work.
- Delete a job card (trash icon) only if it is still Received or Cancelled — jobs further along the pipeline cannot be deleted, only progressed or cancelled.
4 Repair Price List — quote a repair instantly
- Switch to the Repair Price List tab (also reachable at /repairs/price-list).
- Click Add Price, choose a Device Type and optional Brand ("Any" if it applies to all brands), name the Repair Type (e.g. "Screen Replacement"), and enter Labour, Parts Min and Parts Max costs, plus any Notes.
- Use the search box and device-type chips to find an existing price when a customer asks "how much to fix X" — the Est. Total column already adds labour to the parts range so you can quote a range on the spot.
- Edit or delete a price entry with the pencil/trash icons on its row.
5 Spare Parts — manage the parts inventory used for repairs
- Switch to the Spare Parts tab (also reachable at /repairs/spare-parts).
- Click Add Part, enter the Part Name (required) and optional Part Code/SKU, Device Type, Brand, Compatible Models, Quantity in Stock, Low Stock Alert At threshold, Purchase Price, Selling Price and Supplier.
- Watch the amber banner that appears whenever one or more parts have dropped to or below their Low Stock Alert At threshold, and the ⚠ Low tag on the affected row.
- These same parts appear in the search-as-you-type picker on a Job Card's Parts Used field — selecting one there prices the job automatically from this catalog's Selling Price.
- Edit or delete a part with the pencil/trash icons on its row.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Customer Name * / Phone | Required customer identity for the job; phone enables WhatsApp status updates and addressing the tracking link. |
Device Type / Brand / Model Number / IMEI 1 / IMEI 2 / Serial Number | Device identification; IMEI/serial are also what Device Repair History searches on to find prior jobs for the same physical device. |
Condition at Intake checklist | Toggleable tags (Powers on, Screen cracked, Body scratches/dents, Water damage signs, Battery swollen, SIM/memory card inside, Pattern or PIN noted) recorded at drop-off to avoid disputes at pickup. |
Accessories Received | Free-text note of what came in with the device (charger, cover, box, bill…). |
Reported Issue * / Diagnosis | What the customer says is wrong (required) versus what the technician actually found on inspection. |
Parts Used (catalog picker) | Type-ahead search over Spare Parts showing price and current stock per match; adding one prices it from that part's Selling Price and lets you adjust quantity; falls back to a free-text field if no catalog parts are selected. |
Labour / Parts / Advance Paid | Cost fields (all in the shop's currency); Parts auto-fills from catalog part selections. Total and Balance (Total − Advance) are computed live. |
Assigned To / Est. Ready Date | Technician name (drives the Technician workload filter chips) and the promised ready-by date shown on the job list and printed slip. |
Damage Photos | Up to 3 photos, auto-compressed client-side to a small JPEG before upload; shown on the printed Job Card slip. |
Customer Signature | Captured via an on-screen signature pad and printed on the Job Card slip as proof of intake conditions agreed. |
OEM Warranty Claim (Claim No. / Date / Status) | Optional log of a manufacturer warranty claim tied to this job — status options are Submitted, Pending, Approved, Rejected, Completed. |
Status pipeline chip / → Next status button | Received → Diagnosing → In Repair → Waiting for Parts → Ready → Delivered (Cancelled is a side-branch); the button always advances exactly one step and is hidden once Delivered or Cancelled. |
Technician workload chips | Auto-counted from jobs not yet Delivered/Cancelled, grouped by Assigned To; click a chip to filter the list to that technician. |
WhatsApp icon | Sends a status-update message (or the automatic "ready for pickup" message when a job reaches Ready); includes the public tracking link if one has been generated. |
Link icon (copy tracking link) | Copies the customer-facing public tracker URL (/repair/:token); generates a token on first use for jobs created before the tracker existed. |
History icon | Opens Device Repair History — every other job logged against the same IMEI or serial number, excluding the current one. |
Print Job Card | Prints a compact drop-off/pickup slip with device, issue, cost breakdown, signature, damage photos and the tracking link if available. |
Print Tax Invoice | Only shown once totalCost > 0; prints a GST-aware invoice (CGST/SGST split at 18% inclusive when the shop is on GST) or a plain invoice otherwise. |
Delete icon | Only available while a job is still Received or Cancelled; permanently removes the job card. |
Repair Price List — Device Type / Brand / Repair Type / Labour / Parts Min–Max | A standard quote entry; the Est. Total column shows Labour + Parts Min through Labour + Parts Max as a quick quote range. |
Spare Parts — Quantity in Stock / Low Stock Alert At | Current stock and the threshold below which the ⚠ Low tag and the page-level low-stock banner appear. |
Spare Parts — Purchase Price / Selling Price / Supplier | Cost basis, the price charged to customers (also what a Job Card's catalog picker bills), and where to reorder the part. |
Tips & Best Practices
- Always complete the Condition at Intake checklist at drop-off — it is printed on the Job Card slip and prevents "it wasn't scratched when I brought it in" disputes at pickup.
- Add parts through the Spare Parts catalog picker rather than typing them freehand whenever possible — it keeps parts stock accurate and pricing consistent across jobs.
- Keep the Repair Price List up to date for your most common jobs (screen replacement, battery, charging port) so any staff member can quote a customer without calling a manager.
- Share the tracking link (link icon) instead of asking customers to call for updates — it shows the same live status the staff Job Card list shows, with no login needed.
Troubleshooting & FAQ
Repairs & Service is missing from my sidebar.
I can't delete a job card.
The WhatsApp button did not open a message.
Parts cost keeps resetting when I edit it manually.
A part shows a Low stock warning — where do I fix that?
🧑💻 Developer Notes
Source component(s):
frontend-app/packages/pos-react-lib/src/pages/repairs/RepairPage.jsx (Job Cards — default export, mounted at /repairs and /repairs/price-list is a separate component)frontend-app/packages/pos-react-lib/src/pages/repairs/RepairPricePage.jsx (Repair Price List — mounted at /repairs/price-list)frontend-app/packages/pos-react-lib/src/pages/repairs/SparePartsPage.jsx (Spare Parts — mounted at /repairs/spare-parts)frontend-app/packages/pos-react-lib/src/pages/repairs/RepairTrackerPage.jsx (public, unauthenticated tracker at /repair/:token — not part of the sidebar)frontend-app/packages/pos-react-lib/src/components/SignaturePad (customer signature capture)
Backend endpoints used:
GET /repairs, POST /repairs, PUT /repairs/:id, DELETE /repairs/:id (job cards)POST /repairs/:id/tracking-token (mint a public tracker token for older jobs)GET /repairs?search= (used by Device Repair History, searching by IMEI/serial)GET /repairs/prices, POST /repairs/prices, PUT /repairs/prices/:id, DELETE /repairs/prices/:id (Repair Price List)GET /repairs/spare-parts, POST /repairs/spare-parts, PUT /repairs/spare-parts/:id, DELETE /repairs/spare-parts/:id (Spare Parts)GET /catalog/repair/:token (public, no auth — used by RepairTrackerPage)GET /settings (store name/address/GSTIN used on the printed Job Card and Tax Invoice)
Related tables (db-core repositories):
ElectronicsRepairElectronicsRepairPriceElectronicsSparePart
Feature flag key: billing (requires advanced plan tier or above)
All three tabs are registered generically in every variant's App.js (/repairs, /repairs/price-list, /repairs/spare-parts) behind the single repairs nav key with children repairs-jobs/repairs-prices/repairs-parts in navItems.jsx, all sharing the same featureKey: billing + minTier: advanced gate. Damage photos are compressed client-side on a <canvas> to a max 480px JPEG at 65% quality before being stored as a JSON array of data-URIs on the job row. The printed Tax Invoice treats entered Labour/Parts amounts as GST-inclusive and back-calculates the 18% CGST/SGST split (SAC 998719 for labour, 996111 for parts) only when the shop's tax system is GST. Job status advancement and the automatic "ready" WhatsApp notification both mint a tracking token on demand via ensureToken() if the job predates the public tracker feature.