Table of Contents
- How to use this workbook
- Lab 1 — System orientation Foundation
- Lab 2 — Build the Asset taxonomy Foundation
- Lab 3 — Register your first asset Foundation
- Lab 4 — Move & geo-track Intermediate
- Lab 5 — Hire & return Intermediate
- Lab 6 — Build the Vendor master Foundation
- Lab 7 — Plan → POR → Quotation Intermediate
- Lab 8 — PO → Work Order → Receive Intermediate
- Lab 9 — Store inward (GRN) Intermediate
- Lab 10 — POS day-in-the-life Intermediate
- Lab 11 — Stock issue & inter-store transfer Intermediate
- Lab 12 — Stock audit & variance Advanced
- Lab 13 — Chart of Accounts & manual journal Advanced
- Lab 14 — Accounts Gateway sync Advanced
- Lab 15 — End-to-end day scenario Advanced
- Final assessment
- Answer key (trainers)
How to use this workbook
This workbook accompanies the Folks Inventory ERP User Manual. Each lab walks a real-world scenario, asks you to perform 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 with SuperAdmin or a fully-scoped Inventory role.
- The API and FE are both running locally (
dotnet runin each). - Both solutions build with 0 errors. Confirm with your trainer if uncertain.
- The DB
MasGen_ERP_DevV3is restored with seed data. - Have a notebook open to record codes (Vendor, POR, PO, Asset, Sale, JV) — these are referenced in later labs.
Skill levels
Anyone can do these. Login, navigate, build masters.
Requires Foundation completion. Movements, P2P cycle, POS, store ops.
Full system set up + previous labs done. Audits, ledger, gateway, end-to-end.
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 comfortable with the navbar, the side menu, the standard list / form pattern, and the role you'll work as.
1.1 First login
- Open the FE URL. Sign in with the trainer-provided credentials.
- You land on the dashboard / default page mapped to your role's DefaultPath.
- Note the role pill at the top right.
1.2 Walk the menu
- Click each of the seven module groups in turn (Asset, Purchase, Sales, Store, Accounts, Gateway, UM).
- Sub-menus expand. Pages have a consistent toolbar — Add / Refresh / Export / Search.
1.3 Standard page anatomy
- Open Asset → Asset Type. Identify: header toolbar, filter strip, data grid, action column.
- Click Add. The form opens (modal or right-panel). Cancel without saving.
Self-check
- Q1.1 Which table stores your username and password?
- Q1.2 What does the DefaultPath on the Login row control?
- Q1.3 If the Add button is greyed out on a list page, which table likely lacks a privilege row for your role?
Lab 2 — Build the Asset taxonomy
FoundationSet up the three-level Type → Category → Item tree for an IT-and-vehicles fleet.
2.1 Create three Asset Types
- Open Asset → Asset Type. Add three rows — leave Code blank each time.
| # | Type Name | Description |
|---|---|---|
| 1 | IT Hardware | Computers, peripherals, networking gear. |
| 2 | Vehicles | Cars, trucks, vans owned by the company. |
| 3 | Furniture | Desks, chairs, partitions. |
- Record the three auto-generated Type codes.
2.2 Add Categories under each Type
- Open Asset → Asset Category. Add categories — pick the parent Type from the dropdown.
| Type | Categories |
|---|---|
| IT Hardware | Laptops · Desktops · Monitors · Printers · Networking |
| Vehicles | Cars · SUVs · Vans · Trucks |
| Furniture | Office Chairs · Desks · Cabinets |
2.3 Add a few Items
- Open Asset → Asset Item. Add: HP EliteBook 840 G10 under Laptops; Toyota Prado 2024 under SUVs; Steelcase Series 1 Chair under Office Chairs.
- Record the three Item codes.
2.4 Add Unit Details for one Item
- Open Asset → Asset Item Unit Details. For HP EliteBook, add unit
eachwith conversion 1.000 marked default.
Self-check
- Q2.1 Why is the Category dropdown filtered when you change the Type?
- Q2.2 What happens if two Items share the same name under the same Category?
- Q2.3 You changed an Item's default unit after creation. What table is recalculated?
Lab 3 — Register your first asset
FoundationOnboard one physical laptop end-to-end — master row, location, contacts, image, value monitor seed.
3.1 Create the AssetItem instance
- Open Asset → Asset Item. Add a serial-tagged instance of HP EliteBook 840 G10:
- Serial No:
SN-LAP-0001 - Acquisition Date: 2026-04-01
- Acquisition Cost:
4,180 - Vendor: leave blank for now
- Serial No:
- Record the AssetItem code (e.g.
AST-2026-00001).
3.2 Set location
- Open Asset → Location Details. Bind the asset to Project Site: HQ — Floor 2; lat
25.276987, long55.296249.
3.3 Attach a contact
- On Asset → Contacts, link the assigned employee (your trainer's user) as Custodian.
3.4 Upload an image
- Use Asset → Image Path (or the inline image control on Item) to upload a photo. Save.
- The thumbnail appears in the grid.
3.5 Seed the Value Monitor
- Open Asset → Asset Value Monitor. Click Insert for the new asset — opening value
4,180, diminishing %20per year. - A row appears with current book value = 4,180.
Self-check
- Q3.1 Why must the Value Monitor be seeded before you log any maintenance?
- Q3.2 What URL pattern would a QR code for an asset embed (if QR support were enabled)?
- Q3.3 If you tried to register a second asset with serial
SN-LAP-0001, what should happen?
Lab 4 — Move an asset & capture geo
IntermediateCreate a movement that physically transfers the EliteBook from HQ — Floor 2 to Branch Office — Floor 1, capturing the geo coordinates at receipt.
4.1 Initiate movement
- Open Asset → General Asset Movement. From: HQ Floor 2. To: Branch Office Floor 1. Reason: Transfer.
- Record the MovementID.
4.2 Mark in-transit
- Save with status In Transit.
4.3 Receive & capture geo
- Mark the movement Received. Enter receiver lat/long:
25.198765/55.272345. - A row is added to
*MovementGeoLocation; the asset's Current Location now reads Branch Office.
4.4 Verify history
- Open Asset → Reports → General Asset Movement. Filter by your AssetItemID.
- One row appears with from/to and the geo coords.
Self-check
- Q4.1 What status path must a movement traverse?
- Q4.2 If you backdate a movement before the last AssetValueMonitor row, what happens?
- Q4.3 Where would a Device-class asset's geo trail be stored instead of GeneralAssetMovement?
Lab 5 — Hire & return rental equipment
IntermediateUse the Hired hierarchy to bring in a generator for a 30-day project, log usage, then return it to the agency.
5.1 Add the lease agency
- Open Asset → Hired Rented Lease Agency. Add SkyHire FZE, contact details, currency AED.
5.2 Add the HiredItem
- Open Asset → Hired Item. Category Generators, item Cummins 100kVA, agency = SkyHire, daily rate
180.00 AED.
5.3 Log a HiredOperation
- From Asset → Hired Operation, log start 2026-05-01, planned end 2026-05-30, project site = Site B.
5.4 Compute rent costing
- Open Asset → Hired Rent Costing. Click Compute — 30 days × 180 = 5,400 AED.
- A costing row appears.
5.5 Return
- Set the HiredOperation actual end date and status = Returned.
Self-check
- Q5.1 Why is there no Disposal flow for HiredItem?
- Q5.2 If the project ends 5 days early, what happens to the rent costing?
Lab 6 — Build the Vendor master
FoundationOnboard three vendors so the next labs can quote against them.
6.1 Add three vendors
- Open Purchase → Purchase Dictionary → Vendor Entry. Add three rows — leave Vendor Code blank.
| # | Name | Country | Trade Lic | VAT/TRN | Currency | Payment Terms |
|---|---|---|---|---|---|---|
| 1 | ABC Trading LLC | UAE | TL-A-100 | VAT-A-200 | AED | Net 30 |
| 2 | Stellar Office Supplies | UAE | TL-B-100 | VAT-B-200 | AED | Net 45 |
| 3 | Iron Hardware Co | UAE | TL-C-100 | VAT-C-200 | AED | Net 60 |
- Record the three Vendor codes.
6.2 Add primary contacts
- For each vendor, add one Primary contact (name, email, phone).
Self-check
- Q6.1 What does Net 30 mean for downstream Bills?
- Q6.2 A vendor's TRN appears on customer-facing PO PDFs. Where is it stored?
Lab 7 — Plan → POR → Quotation
IntermediateRun the front half of P2P — from a Purchase Plan through a POR, vendor invitations, quotes and comparison.
7.1 Create a Purchase Plan
- Open Purchase → Purchase Plan. Period: 2026-Q3. Plan name: Q3 IT Refresh.
- Add lines: 5× HP EliteBook 840 G10, 5× Dell 24" Monitor, 5× Logitech MX Keyboard.
- Record the Plan code.
7.2 Raise a POR from the plan
- Open Purchase → POR. Click From Plan → pick your Plan. Department: IT. Project Site: HQ Floor 2.
- Set the Delivery Distribution — split: 3 to HQ Floor 2, 2 to Branch Office Floor 1.
- Status = Submitted.
- Record the POR No.
7.3 Invite vendors
- Open the POR; click Invite Vendor. Tick all three vendors from Lab 6.
7.4 Submit quotes (act as each vendor)
- Open Purchase → SubmitQuot three times — one per vendor — entering different unit prices.
| Item | ABC | Stellar | Iron |
|---|---|---|---|
| EliteBook 840 | 4,250 | 4,180 | 4,300 |
| Dell 24" Monitor | 650 | 675 | 620 |
| MX Keyboard | 180 | 175 | 190 |
7.5 Compare
- Open Purchase → Compare Quotation. Tick the cheapest line per item. (Hint: split-award likely.)
- Record the winning vendor per line.
Self-check
- Q7.1 Why must the POR move to Submitted before you can invite vendors?
- Q7.2 What table holds line-level prices submitted by each vendor?
- Q7.3 Can you split-award? Where is that recorded?
Lab 8 — PO → Work Order → Receive
IntermediateFrom the comparison, generate POs, optional WOs, and receive a delivery.
8.1 Generate POs
- From the comparison page, click Process PO. The system creates one PO per winning vendor.
- Record each PO No.
8.2 Issue a Purchase Work Order
- Open one PO; click Generate Work Order. Select the items that need internal handling.
8.3 Receive the delivery
- Open Purchase → Delivery. Pick the open PO. Receive the full quantity.
- Attach the (mock) Delivery Note PDF.
- A StoreEntry is auto-created — visible in Store → Inward.
8.4 Capture logistics
- Open Purchase → Create Logistic. Vehicle Light Truck, plate D-12345, driver Ali Khan.
Self-check
- Q8.1 What status is the PO after delivery?
- Q8.2 What's the difference between PO, PWO, and Delivery quantities?
- Q8.3 If you receive 4 of 5 ordered, what status flag does the PO carry?
Lab 9 — Store inward (GRN)
IntermediateThe Delivery you just received auto-created a StoreEntry. Now examine it and post an ad-hoc inward.
9.1 Inspect the auto entry
- Open Store → Inward. Filter by today.
- Auto-StoreEntry rows from Lab 8 are listed. Each carries the Delivery reference.
9.2 Post an ad-hoc inward
- Click Add. Item Notebook A5, qty 50, Movement Type Local Purchase, Received By yourself.
- StockAtStore for Notebook A5 increments by 50.
9.3 Verify on dashboard
- Open Store → Stock Balance. Item filter = Notebook A5. Confirm closing qty.
Self-check
- Q9.1 Where in the data model is QtyBefore vs QtyAfter stored?
- Q9.2 If you cancel a StoreEntry that's already increased StockAtStore, what reverses it?
Lab 10 — POS day-in-the-life
IntermediateOpen a session, ring 5 sales (one with multi-tender), void one, and close — including the Z-Report.
10.1 Open the session
- Open POS → Open Session. Pick Terminal Counter-1. Opening Balance: 500.
- Record SessionID.
10.2 Ring sales 1–4 (single tender)
| # | Items | Tender |
|---|---|---|
| 1 | 2× HP Mouse, 5× USB Cable | Cash |
| 2 | 3× Notebook A5 | Cash |
| 3 | 1× Dell 24" Monitor | Card |
| 4 | 1× Logitech MX Keyboard | Card |
- Ring each sale, tender, print receipt.
10.3 Sale 5 — multi-tender
- Cart: 1× HP EliteBook 840. Total ≈ 4,389. Tender 2,000 cash + 2,389 card.
- Two POS_Payment rows are written; change = 0.
10.4 Void
- Ring a 6th sale; before tender, click Void.
- No POS_Sale row is committed.
10.5 Close session
- Open POS → Close Session. Enter physical drawer count.
- Z-Report prints. Variance should be 0 if you counted accurately.
Self-check
- Q10.1 Multi-tender — how many rows are written to POS_Payment for sale 5?
- Q10.2 What is the formula for ExpectedBalance at session close?
- Q10.3 The Z-Report is generated on close — which controller method emits it?
Lab 11 — Stock issue & inter-store transfer
IntermediateIssue stock to a project site, then transfer 5 monitors from HQ store to Branch store.
11.1 Issue to a project site
- Open Store → Issue. Project Site = HQ Floor 2; item = Notebook A5; qty = 10.
- StoreExit row is created; StockAtStore decrements by 10.
11.2 Inter-store transfer
- Open Store → Inter-Store Transfer. From HQ to Branch; item = Dell 24" Monitor; qty = 5.
- A consigner StoreExit and consignee StoreEntry are created; the two are linked via VirtualEntryID.
Self-check
- Q11.1 What protects against issuing more than the available qty?
- Q11.2 Why two virtual rows (Exit + Entry) for one physical move?
Lab 12 — Stock audit & variance
AdvancedRun a counting batch, intentionally introduce a variance, dispose damaged stock and reconcile.
12.1 Generate audit batch
- Open Store → Stock Audit. Click Generate Batch. Auditor: yourself.
- Record the BatchCode.
12.2 Enter physical counts
- For 9 of 10 items, enter the system qty (zero variance). For one item (e.g. HP Mouse), enter system qty − 2 to simulate breakage.
- Audit row turns Flagged.
12.3 Dispose damaged
- Move the variance to Damaged Stock. Reason: Drop test failure.
- As Manager, approve the damaged-stock row.
- A StoreExit posts; StockAtStore reflects the new floor truth.
Self-check
- Q12.1 What three states can a Store Audit row hold?
- Q12.2 Damaged stock approval posts to which ledger group eventually?
Lab 13 — Chart of Accounts & manual journal
AdvancedConfirm the chart, post a manual JV for a one-off cash adjustment, see it in the Cash Book.
13.1 Inspect the chart
- Open Accounts → Ledger Group. Confirm the five top groups (Asset / Liability / Equity / Income / Expense).
13.2 Add one ledger
- Open Accounts → Ledger. Add Petty Cash under Cash & Bank, opening balance 1,000.
13.3 Post a JV
- Open Accounts → Journal. New JV. Date today, narration: Office stationery from Petty Cash.
- Detail rows: Office Supplies Expense Dr 80; Petty Cash Cr 80.
- Save enables only when Σ Debit = Σ Credit.
- Record the JV number.
13.4 Check the Cash Book
- Open Accounts → Reports → Cash Book. Filter by today + Petty Cash.
- Your JV appears.
Self-check
- Q13.1 What's the difference between a Ledger Group and a Sub-Ledger?
- Q13.2 Why does the system reject an unbalanced JV?
Lab 14 — Accounts Gateway sync
AdvancedWatch a POS sale (from Lab 10) flow into Accounts via the Gateway. Post the candidate; verify Trial Balance.
14.1 Open the Gateway
- Open Accounts → Accounts Gateway. Find candidates from Lab 10's POS sales.
- Each sale appears as a row with Type=POS Sale, Sell amount, posted timestamp.
14.2 Post the customer side
- Click Post on each candidate.
- A new
Accounts_TransactionRV is created. Status flips to Posted.
14.3 Verify in Trial Balance
- Open Accounts → Reports → Trial Balance for today.
- Cash Dr increased by total tender; Sales Cr increased by net; Tax Payable Cr by tax amount.
Self-check
- Q14.1 What three SPs power the gateway?
- Q14.2 A customer paid card+cash — how is the gateway candidate built?
- Q14.3 If you forget to post a candidate, who/what reminds you?
Lab 15 — End-to-end day scenario
AdvancedBring it all together. One scenario, from morning open to evening close, touching every module.
The scenario
It's 09:00. The HQ store opens. A delivery from ABC Trading arrives at 09:15. By 11:00 the POS counter is open and customers are buying. At 13:30 a manager spots damaged inventory; you process the variance. At 17:00 you close the POS, the store and the day. You verify postings flowed to the GL.
Step list — keep notes!
- 09:00 — Open the day. Inspect Accounts → Gateway — should be empty.
- 09:15 — Receive a Delivery against an open PO (from Lab 8). Capture logistics.
- 11:00 — Open Counter-1 POS session, opening 500.
- 11:00–13:00 — Ring 4 sales, mix of cash, card and one multi-tender.
- 13:30 — Walk-the-floor audit. Find a 2-unit shortage; route to Damaged Stock; manager approves.
- 15:00 — Inter-store transfer 3 monitors HQ → Branch.
- 16:30 — Open Gateway. Post all candidates.
- 17:00 — Close POS session (capture variance), close store day.
- Trial Balance reflects: Sales Cr (counter), Cost of Goods Dr (damaged), Cash Dr (tender), Card Settlement Dr (card).
What you should have
- 1 PO closed (full delivery received).
- 4 POS sales completed.
- 1 audit batch with 1 variance approved as Damaged.
- 1 inter-store transfer.
- ≥ 5 Gateway candidates all posted.
- 1 closed POS session with computed variance.
Self-check
- Q15.1 Where can you see the full chronology of today's activity for audit?
- Q15.2 If the damaged-stock approval was rejected, what would have rolled back?
- Q15.3 Compare today's Trial Balance to yesterday's — what changed and why?
Final Assessment
Closed-book — 30 minutes
Five MCQs, five short-answer questions, one practical. No cheating — but the User Manual is fair game.
Which SP recomputes book value when an asset cost is captured?
- A AssetItem_Update
- B AssetMaintenance_Insert
- C AssetValueMonitor_UpdateDiminiPercentage
- D AssetOperation_Insert
The Accounts Gateway candidate for a card + cash POS sale produces how many Accounts_TransactionDetails rows (typically)?
- A 1
- B 2
- C 3
- D 4 or more
A POR cannot move to Quoted until …
- A the buyer signs off
- B at least one vendor has Submitted a quote
- C the Plan is approved
- D the Delivery is created
Inter-store transfer creates which pair of rows?
- A Two StoreExits
- B Two StoreEntries
- C One StoreExit + One StoreEntry, linked by VirtualEntryID
- D A single StoreEntry on the consignee
What blocks a period close?
- A Open POS sessions or in-transit deliveries or flagged audits
- B Empty Trial Balance
- C Vendor master with no contacts
- D Asset with disposed status
Short answers
- Why is the asset module split across owned (Asset / Device / Equipment / Utility) and Hired hierarchies?
- Explain three-way match in your own words — where does it live?
- What gets stored in
StockAtStore.AveragePricePerUnitand how is it kept fresh? - Trace a customer's cash POS purchase end-to-end into the GL — name the SPs in order.
- What does it mean that the system is SP-driven? Give one practical consequence.
Practical (graded by trainer)
Run a complete P2P cycle for a single PO of 10 USB hubs from Stellar Office Supplies: Plan → POR → Quotation (3 vendors) → Compare → PO → Delivery → Stock In → Bill → Approve → post via Gateway. Provide all codes and the Trial Balance impact.
Answer Key (trainers)
Lab 1 — Q1.1, Q1.2, Q1.3
Q1.1 — Login.
Q1.2 — Where the user is redirected after a successful authentication; per role.
Q1.3 — UserRolePrivileges for the page's SubMenuID and the Create PagePrivilegeType is missing.
Lab 2 — Q2.1, Q2.2, Q2.3
Q2.1 — The category dropdown is loaded by AssetCategory_SelectByAssetTypeID.
Q2.2 — A unique-name SP guard rejects the duplicate.
Q2.3 — StockAtStore rows for that item are recalculated to the new default unit.
Lab 3 — Q3.1, Q3.2, Q3.3
Q3.1 — Maintenance / cost SPs include a Value Monitor recompute step.
Q3.2 — /assets/bycode/{AssetCode}.
Q3.3 — Insert is rejected — serial number uniqueness.
Lab 4 — Q4.1, Q4.2, Q4.3
Q4.1 — Initiate → InTransit → Received (Closed). Geo captured at Received.
Q4.2 — The SP rejects with a backdate error.
Q4.3 — In DeviceMovementGeoLocation.
Lab 5 — Q5.1, Q5.2
Q5.1 — You don't own it. Return it to the agency instead.
Q5.2 — Update HiredOperation actual end date; recompute HiredRentCosting; reduced amount payable to agency.
Lab 6 — Q6.1, Q6.2
Q6.1 — Bill is due 30 days after the Bill Date — drives Aged Payables.
Q6.2 — On the Vendors table.
Lab 7 — Q7.1, Q7.2, Q7.3
Q7.1 — Submission triggers the workflow listener that opens the invitation page.
Q7.2 — QuoteForPurchaseOrderRequestDetails.
Q7.3 — Yes — comparison page lets you pick winning vendor per line; one PO per vendor created at the end.
Lab 8 — Q8.1, Q8.2, Q8.3
Q8.1 — Delivered; once Bill is matched, Closed.
Q8.2 — PO.OrderedQty (commitment), PWO.WorkOrderQty (execution), Delivery.ReceivedQty (actual).
Q8.3 — Partial.
Lab 9 — Q9.1, Q9.2
Q9.1 — On StoreEntry as QuantityBefore and QuantityAfter; in StockAtStore as the running closing balance.
Q9.2 — A reversing StoreExit; the SP refuses to delete the StoreEntry directly.
Lab 10 — Q10.1, Q10.2, Q10.3
Q10.1 — Two — one cash, one card.
Q10.2 — ExpectedBalance = OpeningBalance + SalesTotal − PayoutsTotal.
Q10.3 — PosReportController.DayClose (or session-close handler).
Lab 11 — Q11.1, Q11.2
Q11.1 — The SP guard checks StockAtStore.ClossingBalanceQuantity ≥ requested qty.
Q11.2 — Each store has its own balance; the pair preserves balance integrity per store.
Lab 12 — Q12.1, Q12.2
Q12.1 — Pending, Approved, Rejected (and Flagged in flight).
Q12.2 — Damaged Stock / Cost of Goods Dr; Inventory Cr.
Lab 13 — Q13.1, Q13.2
Q13.1 — A Group is a chart-of-accounts node (Asset/Liability/etc.); a Sub-Ledger is a customer/supplier line under a control ledger like Receivables.
Q13.2 — Double-entry — debits must equal credits, otherwise the GL is unbalanced.
Lab 14 — Q14.1, Q14.2, Q14.3
Q14.1 — Payments_AccountsGateWay_Customer_Insert, ..._Supplier_Insert, ..._ListActionItems_Select.
Q14.2 — One candidate (the sale) — the detail rows split tender into Cash Dr + Card Settlement Dr; Sales Cr + Tax Payable Cr.
Q14.3 — The Inbox surfaces an unposted-candidates count; finance can see it on the dashboard.
Lab 15 — Q15.1, Q15.2, Q15.3
Q15.1 — ActivityLog filtered by today.
Q15.2 — The Damaged-Stock row stays Pending; no StoreExit is posted; StockAtStore unchanged.
Q15.3 — Cash & Card Settlement up by tender total; Sales & Tax Payable up by net & tax; Inventory down by COGS; small variance from damaged.
Final assessment
MCQ 1: C. MCQ 2: D (4+ — Cash Dr, Card Settlement Dr, Sales Cr, Tax Cr). MCQ 3: B. MCQ 4: C. MCQ 5: A.