Table of Contents
- How to use this workbook
- Lab 1 — System orientation Foundation
- Lab 2 — Build the customer master Foundation
- Lab 3 — Asset registry & QR codes Foundation
- Lab 4 — Contracts & SLA tiers Intermediate
- Lab 5 — SR → WO lifecycle Intermediate
- Lab 6 — Inventory & van stock Intermediate
- Lab 7 — Preventive maintenance Intermediate
- Lab 8 — Invoicing & payments Advanced
- Lab 9 — Dashboards & reports Advanced
- Lab 10 — End-to-end scenario Advanced
- Final assessment
- Answer key (trainers)
How to use this workbook
This workbook accompanies the MasGen CMMS User Manual. Each lab introduces a real-world scenario, walks you through the steps, and ends with self-check questions. Save your work after every step so a trainer can review your progress.
Before you start
- You have a working login and at least the SuperAdmin role (or a role with full module access).
- The API and FE are both running locally (
dotnet runin each). - Both solutions build with 0 errors. Confirm with your trainer if uncertain.
- Have a notebook or text file open to record SR numbers, WO numbers, and any error messages — these are part of the exercise.
Skill levels
Anyone can do these. Login, navigate, create customers and assets.
Requires Foundation completion. Contracts, work orders, inventory, PPM.
Requires the full system to be set up and the previous labs completed. Invoicing, dashboards, full end-to-end scenarios.
Conventions used in this workbook
DO — Action
An action you perform on screen.
SEE — Outcome
The expected result you should observe.
NOTE — Record
A value (code, number) to write down.
Q — Self-check
A question to test your understanding.
Lab 1 — System orientation
FoundationGet oriented with the layout, navigation, and basic UM concepts.
1.1 Login & explore
- Open the FE URL. Log in as SuperAdmin.
- Confirm you see the left sidebar with multiple module groups (User Management, Customer Management, Contract Management, Service Request & Work Order, etc.).
- Q1.1 How many main menu groups can you count in the sidebar?
- Q1.2 Click on Asset Management. How many submenus does it have?
- Q1.3 Open Service Categories (under Service & Work Order). What pre-seeded categories appear in the list?
1.2 Header bar interaction
- On any page (e.g. Customers), click the small expand/compress icon at the top-right of the title bar.
- The header collapses to a slim sticky bar. Click again to restore.
1.3 Collapsible panels
- Click the chevron in the header of any form panel (e.g. Add Customer).
- The panel collapses. Click again to expand.
1.4 Create a new role for the lab user
- Open User Management → Role Management — Add. (You should not actually save anything if you are training — this is a read-only exploration.)
- Note down the existing roles you see in the dropdown.
Self-check
- Q1.4 Which submenu would you click to view the system audit trail?
- Q1.5 Where is the breadcrumb shown on a typical module page?
Lab 2 — Build the customer master
FoundationOnboard a small customer base of 3 customers with sites and contacts.
2.1 Create three customers
- Open Customer Management → Customers. Create three customers, leaving the Customer Code blank each time.
| # | Name | Type | CRN/TRN | Phone | Category | |
|---|---|---|---|---|---|---|
| 1 | Greenfield Hospital | Corporate | CRN-100001 | 050-1234567 | ops@greenfield.example | Premium |
| 2 | Anjali Sharma | Individual | (empty) | 050-2345678 | anjali.sharma@example.com | Standard |
| 3 | Royal Tower FM | Corporate | CRN-100002 | 050-3456789 | facilities@royaltower.example | Premium |
- Record the auto-generated Customer Codes for each of the three.
- Q2.1 Did the system warn you about a duplicate at any point? If yes, on which row?
2.2 Add sites to Greenfield Hospital
- Open Customer Management → Customer Sites. For Greenfield, add two sites:
- Main Building — Sheikh Zayed Rd, Dubai.
- Annex — Same street, building B.
- Both rows appear in the right-hand list.
2.3 Add contacts
- Open Customer Management → Customer Contacts. Add for Greenfield:
- Dr. Neha Iyer — phone
050-9000001— emailneha.iyer@greenfield.example— IsPrimary = true - Mr. Rashid Khan — phone
050-9000002— emailrashid.khan@greenfield.example— IsPrimary = false
- Dr. Neha Iyer — phone
2.4 View Customer 360
- Open Customer Management → Customers. Click 360 on the Greenfield row.
- The Customer 360 page shows: Header (name, type, CRN, contact info), SiteCount = 2, ContactCount = 2, with site list and contact list filled in.
Self-check
- Q2.2 What is the format of an auto-generated Customer Code?
- Q2.3 Why does the "duplicate-check" warn but not block?
- Q2.4 Where does the system store the customer's organisational identification (CRN/TRN)?
Lab 3 — Asset registry & QR codes
FoundationBuild an asset hierarchy and register assets, including QR generation.
3.1 Build the location tree for Greenfield Hospital
- Open Asset Management → Asset Hierarchy. Add nodes in this order — child nodes select their parent in the dropdown.
Site: Greenfield Main
└── Building: Tower A
├── Floor: Ground
│ └── Room: Reception
└── Floor: First
├── Room: Operating Theatre 1
└── Room: Pharmacy
- Q3.1 What happens if you try to save a node without filling Type?
3.2 Register three assets
- Open Asset Management → Assets. For each row, leave Asset Code blank.
| # | Customer | Description | Make | Model | Serial No | Install Date | Warranty Expiry |
|---|---|---|---|---|---|---|---|
| 1 | Greenfield Hospital | AC Unit | Carrier | 38KVR | SN-A-0001 | 2024-06-01 | 2027-06-01 |
| 2 | Greenfield Hospital | Cardiac Monitor | Philips | IntelliVue MX450 | SN-B-2002 | 2025-01-15 | 2028-01-15 |
| 3 | Royal Tower FM | Lift Drive | Otis | Gen2 Premier | SN-C-3003 | 2023-03-01 | 2026-03-01 |
- Record the three Asset Codes.
3.3 Generate QR codes
- Click Gen QR on each asset row. After generation, the QR column displays the encoded payload (e.g.
/assets/bycode/AST-2026-00001). - Refresh the page — the QR field is persisted, not transient.
3.4 Log a condition rating
- Open Asset Management → Asset Condition Log. For the Cardiac Monitor: Rating = 4 (Good); Notes = "Initial inspection — within tolerance, calibrated last week." → Save.
- Add a second log entry one minute later with rating 3 and a note "Slight drift on saturation reading observed."
- Two rows appear in the list — log is append-only.
Self-check
- Q3.2 What URL does the QR code embed?
- Q3.3 Can you ever overwrite a previous condition log entry? Why or why not?
- Q3.4 If you tried to register a 4th asset for Royal Tower FM with the same serial number
SN-C-3003, what should happen?
Lab 4 — Contracts & SLA tiers
IntermediateSet up an AMC contract for Greenfield Hospital with full SLA coverage.
4.1 Create the contract
- Open Contract Management → Contracts. Create:
- Customer: Greenfield Hospital
- Type: AMC
- Start Date: 2026-01-01 · End Date: 2026-12-31
- Value: 50000 · Billing Frequency: Quarterly
- Status: Active (change from Draft)
- Record the Contract Code.
4.2 Add four SLA tiers
- Open Contract Management → SLA Tiers. Add four rows for the contract:
| Priority | Response Hrs | Resolution Hrs |
|---|---|---|
| Critical | 1 | 4 |
| High | 4 | 24 |
| Medium | 8 | 72 |
| Low | 24 | 168 |
4.3 Link covered assets
- Open Contract Management → Contract Assets. Link the AC Unit and Cardiac Monitor (the two Greenfield assets you created in Lab 3) to this contract.
4.4 Inspect Expiry Alerts
- Open Contract Management → Expiry Alerts. Set the dropdown to 90 days.
- If today is May 2026 and the contract ends 2026-12-31, the contract should not appear (still > 90 days).
- Change the dropdown to 365 days.
- The contract now appears with the expiry date and remaining days.
Self-check
- Q4.1 What is the difference between Draft and Active contract status, in practical terms?
- Q4.2 Why must you define SLA tiers per contract rather than once globally?
- Q4.3 What happens when an SR is raised against the Cardiac Monitor — which contract does the system pick? Try to predict before doing Lab 5.
Lab 5 — Service request to work order lifecycle
IntermediateTake an SR through every state up to invoice-ready completion.
5.1 Pre-requisite: a technician
- Open Field Scheduling → Technicians. Create:
- User Id: pick any existing UM user or leave blank.
- Employee Code:
TECH-001. - Skills: "HVAC, Electrical".
- Zone Coverage: "Dubai-North".
- Record the Technician Id.
5.2 Raise an SR
- Open Service Request & Work Order → Service Requests. Raise:
- Customer: Greenfield Hospital.
- Priority: High.
- Category: Breakdown.
- Fault Code:
F-COOL(Cooling underperformance). - Description: "AC unit on first floor not cooling — alarm at 03:30."
- Record the SR Number.
- The success message shows
Coverage: Covered— confirming the system picked up your active AMC contract.
5.3 Convert to Work Order
- Open Service Request & Work Order → Work Orders. In the Convert SR to Work Order panel: pick your SR; assign Technician; Scheduled Date/Time = today + 2 hours; Problem blank; click Convert.
- Record the WO Number.
- The SR's status changes to In Progress; the new WO appears in the WO list with status Assigned.
5.4 Walk the state machine
- On the WO row, click Status. Try transitions in this order:
- New → Assigned (already done).
- Assigned → In Progress (allowed). Note: "Technician arrived on site."
- In Progress → On Hold (allowed). Note: "Awaiting spare from warehouse."
- On Hold → In Progress (allowed).
- Try In Progress → Closed. Rejected — Closed is only valid from Completed.
- Q5.1 What status code does the system return for an illegal transition?
5.5 Complete the WO
- Click Complete on the row: Technician = your Technician Id; Clock In = today, 2 hours ago; Clock Out = now; Labor Hours = 2; Travel Hours = 0.5; Customer Signature = "Dr. Neha Iyer — accepted 2026-05-07" (≥ 10 chars). Click Complete.
- Status moves to Completed. A new row appears in
WorkOrderLabour. The signature is stored.
5.6 Verify history
- Open Service Request & Work Order → WO History.
- You should see at least 5 rows for your WO: created/assigned, In Progress, On Hold, In Progress, Completed.
5.7 View the dispatch board
- Open Service Request & Work Order → Dispatch Board. Set From = today, To = today + 7 days. Click Refresh.
- Your WO appears (status = Completed, colour = green) on today's row.
Self-check
- Q5.2 How many history rows did your WO end up with?
- Q5.3 What field in the WO record stores the customer's acceptance proof?
- Q5.4 Try completing a WO without a customer signature. What's the error?
Lab 6 — Inventory & van stock
IntermediateSet up a warehouse, parts catalogue, perform stock-in/out, and load van stock.
6.1 Create the master warehouse
- Open Inventory → Warehouses. Create: Code =
MW-01, Name = "Main Warehouse", Location = "Al Quoz Industrial Area, Dubai".
6.2 Catalogue 3 parts
- Open Inventory → Parts. Add:
| Code | Description | Unit | Cost Price | Reorder Level |
|---|---|---|---|---|
P-FLT-01 | AC Filter (medium) | EA | 15.00 | 20 |
P-CAP-01 | Capacitor 35µF | EA | 25.00 | 10 |
P-OIL-01 | Compressor Oil 1L | L | 18.00 | 5 |
6.3 Stock-in initial deliveries
- Open Inventory → Stock Ledger. Add three In transactions:
P-FLT-01,MW-01, In, Qty=50, Reference=GRN-001.P-CAP-01,MW-01, In, Qty=15, Reference=GRN-001.P-OIL-01,MW-01, In, Qty=10, Reference=GRN-001.
6.4 View Stock Balance
- Open Inventory → Stock Balance.
- Three rows. Filter=50, Capacitor=15, Oil=10. The BelowReorder flag is 0 for all three — they are above reorder level.
6.5 Issue stock for a WO
- Add a new Stock Ledger entry:
P-FLT-01,MW-01, Out, Qty=2, Reference=WO-2026-NNNNN (your WO from Lab 5). - Stock Balance now shows Filter = 48.
6.6 Try a negative stock-out
- Add a stock-out:
P-OIL-01,MW-01, Out, Qty=20. - The system blocks it with
"Insufficient stock (balance 10)"error.
6.7 Load van stock
- Open Inventory → Van Stock. Load: Technician = TECH-001; Part =
P-FLT-01; Qty = 5.
6.8 Trigger a reorder
- Stock-out 10 of
P-CAP-01— leaves 5, which is below reorder level (10). - Open Inventory → Stock Balance. The capacitor row now shows BelowReorder = 1.
6.9 Raise a Purchase Requisition
- Open Inventory → Purchase Requisitions. Add: Part =
P-CAP-01; Qty Required = 50; Status = Draft. Save. - Record the PR Number.
Self-check
- Q6.1 What error message did you get when stock-out exceeded the warehouse balance?
- Q6.2 Where does the BelowReorder flag get computed — in the FE or in the database?
- Q6.3 What's the difference between Warehouse stock and Van Stock?
Lab 7 — Preventive maintenance
IntermediateSchedule a recurring inspection on the AC Unit and check the dashboard.
7.1 Create a quarterly schedule
- Open Preventive Maintenance → PPM Schedules. Create: Asset = AC Unit (your Lab 3 asset); Contract = the AMC from Lab 4; Frequency = Quarterly; Next Due Date = today (so the auto-generator picks it up). Save.
7.2 Add four checklist items
- Open Preventive Maintenance → Checklist Templates. Add for the schedule:
- "Clean condenser coils" — Mandatory.
- "Check refrigerant pressure" — Mandatory.
- "Inspect electrical contacts" — Mandatory.
- "Test customer's remote control" — Optional.
7.3 Generate WOs (manual trigger)
- In SQL Server Management Studio, run:
USE MasGen_CMMS; EXEC dbo.DevSP_CF_MasGen_CMMS_PPM_GenerateWorkOrders @AsOfDate = NULL;
- Result table shows
GeneratedCount = 1.
7.4 Verify the PPM WO appeared
- Open Preventive Maintenance → PPM Work Orders.
- One row appears, linked to your schedule, with today's due date and IsOverdue = 0.
7.5 Record checklist results
- Open Preventive Maintenance → Checklist Results. Add four results:
- Pass — "Coils clean."
- Pass — "Pressure 105 psi within range."
- Pass — "All contacts firm."
- Fail — "Remote battery flat — replaced."
7.6 Open the dashboard
- Open Preventive Maintenance → PPM Dashboard.
- Numbers: Total = 1, On Time = 1, Overdue = 0, On-Time Percent = 100.00.
Self-check
- Q7.1 When the auto-generator creates a WO, what does it do to the schedule's NextDueDate?
- Q7.2 What is "carry-forward" / overdue handling — when does IsOverdue become 1?
Lab 8 — Invoicing & payments
AdvancedGenerate an invoice from the completed WO, approve, record a payment, and check aged receivables.
8.1 Generate the invoice
Run from SSMS (or via the API endpoint):
EXEC dbo.DevSP_CF_MasGen_CMMS_FI_GenerateInvoice @WOId = <your WO id>;
- Record the Invoice Number.
- Open Finance & Invoicing → Invoices — new draft invoice for Greenfield, status = Draft.
8.2 Inspect lines
- Open Finance & Invoicing → Invoice Lines. You should see:
- One Labour line (Qty = 2 hours × £50 = £100).
- One Parts line (the filter you used: 2 × 15 = £30).
- Subtotal = 130, Tax (5%) = 6.50, Total = 136.50.
8.3 Approve & dispatch
- On the Invoices page, click Approve. The status moves to Approved.
8.4 Record a part payment
- Open Finance & Invoicing → Payments. Invoice = your invoice; Amount = 100 (less than full total of 136.50); Method = Bank Transfer; Reference = "BT-001". Save.
- Outstanding balance is now 36.50 — Invoice still appears in Aged Receivables.
8.5 Try an over-payment
- Try to record a second payment of 1,000.
- Behaviour: depends on your business rule. The system stores it but the auto-Paid-marker sees the cumulative amount exceeds total and marks the invoice Paid.
8.6 Aged Receivables
- Open Finance & Invoicing → Aged Receivables. Set As-Of Date = today + 35 days (simulating 35-day old invoice).
- The invoice should appear in the 31-60 bucket.
Self-check
- Q8.1 What auto-marks an Invoice as Paid?
- Q8.2 What is the tax rate hard-coded in the auto-generator?
- Q8.3 Can you delete a payment record? What happens to the invoice status if you do?
Lab 9 — Dashboards & reports
AdvancedUse CRM, Customer Portal and PPM dashboards to interpret system state.
9.1 CRM Dashboard
- Open CRM Web → CRM Dashboard. Click Refresh.
- Record values: Total SRs, Open SRs, Completed SRs, Total WOs, In Progress WOs, Total Customers, Active Contracts.
9.2 Complaints List
- Open CRM Web → Complaints List. Filter by today.
- Your SR from Lab 5 should appear.
9.3 Processing Inbox
- Open CRM Web → Processing Inbox.
- Currently empty (your only SR is now Completed). Quick test: raise another SR to see it appear here.
9.4 Portal: my purchases
- Open Customer Portal → My Purchases. (In production, the customer logs in to their portal directly.)
- The Greenfield assets show with Warranty Status colour-coded.
Self-check
- Q9.1 What does the CRM Dashboard pull from the database?
- Q9.2 A customer phones to ask about all complaints raised in the last week. Which page would you use?
Lab 10 — End-to-end scenario
AdvancedTie everything together with one complete day-in-the-life scenario.
10.1 Pre-step — register the customer for an active contract
- If Royal Tower FM does not yet have an Active contract, create one quickly (3-month T&M contract is fine).
10.2 Raise the SR
- Service Requests → Raise SR for Royal Tower → Priority = Critical → Description "Lift drive failure — passengers stuck".
10.3 Convert + assign + complete
- Same flow as Lab 5. Use a different technician id if you can (TECH-002 maybe).
10.4 Stock issue + WO complete with parts
- Stock-out 1 capacitor from MW-01 (reference = WO number).
- Complete the WO with labour + signature.
10.5 Invoice + Payment
- Generate, Approve, Record a payment for the full total. Verify status moves to Paid.
10.6 Final dashboard check
- CRM Dashboard → click Refresh.
- Record the new totals — they should be one higher in Total SRs and Total WOs than your Lab 9 numbers.
Self-check
- Q10.1 From a customer's complaint to an invoice marked Paid — how many distinct stored procedures did the system invoke (approximate)?
- Q10.2 If during the WO completion you forgot to put the customer signature, what's the recovery flow?
- Q10.3 Royal Tower's lift now needs quarterly preventive maintenance. Which two pages do you use to set that up?
Final assessment
Closed-book · 30 minOnce you've completed the 10 labs, attempt this assessment without consulting the manual.
Multiple choice (1 point each)
Pick exactly one option per question.
A new customer record is auto-numbered as:
- a)
CUST-{YYYY}-{NNN} - b)
CUST-{YYMMDD}-{NNNN} - c)
CMMS-{YY}-{NNNNNN} - d) The user must enter it manually.
The valid next states from In Progress for a Work Order are:
- a) Assigned, On Hold
- b) On Hold, Completed, Cancelled
- c) New, Cancelled, Completed
- d) Closed only
A part can be stocked-out if and only if:
- a) The technician has van stock for it.
- b) The warehouse has a positive balance ≥ requested quantity.
- c) The user has the Storekeeper role.
- d) Reorder level is greater than the requested quantity.
A PPM Work Order is generated:
- a) When the user clicks "Generate".
- b) Immediately when the schedule is created.
- c) By a SQL Agent job running daily, for any schedule whose NextDueDate ≤ today.
- d) Only when an SR is raised.
The customer signature requirement on WO completion is:
- a) Optional.
- b) Required, minimum 10 characters.
- c) Required, must be a base64-encoded PNG.
- d) Required only for invoiceable WOs.
Short answer (3 points each)
- A6. Describe the three things that happen automatically when you click Convert on the Work Orders page.
- A7. A field operations manager wants to know "How many SRs raised today are still open?" Where do they look, and what number gives them the answer?
- A8. Why does MasGen CMMS use stored procedures instead of LINQ-to-SQL?
- A9. Explain why a Customer Portal user only sees their own data, despite the API being accessible from anywhere.
- A10. Walk through the inventory effect of completing a WO that used parts. Specifically: which two tables get rows written to them?
Practical task (15 points)
Answer key (trainers only)
RestrictedReveal Lab self-check answers (Q1.1 — Q10.3)
Q1.1 ~16 main menus (UM + 11 implemented modules + UM sub-areas like Workflow / Audit Log).
Q1.2 Asset Management has 4 submenus (Assets, Asset Hierarchy, Asset Condition Log, Asset Documents).
Q1.3 Pre-seeded categories: Breakdown (BREAK), Installation (INST), Maintenance (MAINT), Inspection (INSP), Consultation (CONSULT).
Q1.4 User Management → Audit Log.
Q1.5 In the header bar at the top of every module page (under the title bar with breadcrumb format Dashboard / Module / Page).
Q2.1 No duplicate warning expected for the three rows because they are sufficiently different.
Q2.2 CUST-{YYMMDD}-{NNNN} (e.g. CUST-260507-0042).
Q2.3 It's a soft check — a name match could be a real duplicate or a separate company with a similar name; the user is best placed to decide.
Q2.4 Customer's CRN_TRN column.
Q3.1 Validation message: "Type & Name required."
Q3.2 /assets/bycode/{AssetCode} — e.g. /assets/bycode/AST-2026-00001.
Q3.3 No — the log is append-only by design. New rows track each rating in time. Helps build trend data for asset health.
Q3.4 The DB-level UNIQUE constraint on Asset Code (not Serial) is enforced. Serial uniqueness per customer is enforced in the SP only when extended (future enhancement).
Q4.1 Draft = not yet active for SR coverage; Active = picked up by ValidateCoverage when raising an SR.
Q4.2 Different contracts (AMC vs T&M) have very different SLAs; tying them per-contract supports differential pricing and customer-specific service levels.
Q4.3 The system picks the most recent active contract whose date range covers today (@CheckDate).
Q5.1 Result = 0; Message = "Illegal transition: {current} → {requested}".
Q5.2 At least 5 rows: created/Assigned, In Progress, On Hold, In Progress, Completed.
Q5.3 WorkOrders.CustomerSignature.
Q5.4 "Customer signature is mandatory for completion".
Q6.1 "Insufficient stock (balance {N})".
Q6.2 In the database — DevSP_CF_MasGen_CMMS_IV_GetStockBalance computes the flag based on running balance vs Parts.ReorderLevel.
Q6.3 Warehouse stock = central inventory at a fixed location. Van stock = items the technician carries with them; deducted preferentially when used on a WO.
Q7.1 Bumps it forward by the frequency (e.g. Quarterly = +3 months).
Q7.2 When a schedule's NextDueDate passes without the daily job running successfully, the catch-up logic creates a WO with IsOverdue = 1.
Q8.1 When cumulative payments ≥ Invoice.TotalAmount, the Insert SP for Payments updates status to Paid.
Q8.2 5%.
Q8.3 Yes (soft delete on Payments table). The status auto-update only runs on insert; you'd need a RecalculateInvoiceStatus SP to re-evaluate (future enhancement).
Q9.1 Total/Open/Completed SR counts, Total/InProgress WO counts, Total customers, Active contract count — all from DevSP_CF_MasGen_CMMS_CRM_Dashboard.
Q9.2 CRM Web → Complaints List, with date range = last 7 days.
Q10.1 Approximately 12–15 distinct SPs invoked across the flow (CreateSR, ValidateCoverage indirectly, ConvertToWO, AssignTechnician, UpdateWOStatus ×N, CompleteWO, StockOut, GenerateInvoice, ApproveAndDispatch, Payments_Insert, plus various SelectAll / SelectByID for re-display).
Q10.2 Re-attempt the Complete action with a valid signature; the WO must still be in Assigned/In Progress/On Hold for the SP to accept it.
Q10.3 PPM Schedules (define Quarterly), Checklist Templates (define inspection tasks).
Reveal Final-Assessment Multiple Choice answers (A1 — A5)
A1: b — CUST-{YYMMDD}-{NNNN}.
A2: b — On Hold, Completed, Cancelled.
A3: b — Warehouse balance must be ≥ requested qty.
A4: c — SQL Agent job daily.
A5: b — Required, ≥ 10 characters.
Reveal Final-Assessment Short-Answer answers (A6 — A10)
A6. (1) WO row created with auto WONumber, (2) WorkOrderHistory row written, (3) The source SR's status is moved to In Progress.
A7. CRM Web → CRM Dashboard; the Open SRs card shows the count.
A8. SP-based architecture keeps business logic in one place (the database), is auditable, performs better with parameterised plans, and avoids ORM-generated SQL surprises.
A9. Row-level security at the SP layer — every CP DevSP takes @CustomerId and filters all reads by it. The portal user's session token is bound to that customer id; the API never lets a user request data for a different @CustomerId.
A10. WorkOrderLabour (one row per technician's labour) and WorkOrderParts (one row per part used). Plus a stock-out is recorded in StockLedger.
What's next?
- Get certified by your trainer (they should sign-off the practical task).
- Read the User Manual sections 15–17 if you skipped them.
- Try operating the system independently for a week using real scenarios from your business.
- Note down any pain points or "I wish it could…" observations — these feed the next iteration of the platform.