Git-versioned Acumatica configuration for LAB5 Electronics Inc., an electronics manufacturer demo company used for the lab5.ca Demo Tenant Factory sales pitch.
Requires the acu CLI (PyPI: acumatica-cli) at least 0.24.0.
Rebuilds an empty Acumatica tenant into LAB5 Electronics Inc. from this Git tree. Not a production ERP.
acu apply writes company, chart of accounts, warehouse, stock items, vendors, customers, and module preferences.
acu run then posts linked documents so the books show a manufacturer cash cycle: owner capital, buy parts, assemble kits, sell, invoice, collect.
Watch the process: empty tenant to company, masters, and linked history.
acu run with no path runs every file under scenario/ in order.
Each file is one manufacturing leg. Documents chain vendor or customer to order to receipt or shipment to bill or invoice to payment.
| File | What it posts |
|---|---|
10-seed-capital.yaml |
$50,000 owner capital (debit 10100, credit 30000). CLI skips when already present. |
20-buy.yaml |
Component purchase order, receipt, bill, then wire from four vendors. Cash out $4,037 into WH01. |
30-build.yaml |
Assembles 10 GW-EDGE, 5 GW-CELL, 5 GW-RAIL. Cash does not move. |
40-sell.yaml |
Sales order, shipment, invoice to ACMEMFG, NORTHGRID, AGRISENSE. Revenue $4,138; invoices stay Open. |
45-collect.yaml |
ACMEMFG full $1,196; NORTHGRID partial $1,000; AGRISENSE Open. After this pack: cash $48,159, AR $1,942. |
46-collect.yaml |
Pays leftover NORTHGRID and AGRISENSE. Skip when AR 11000 is 0; full run ends cash $50,101, AR 0. |
Pitch films often stop after 45 so mixed Open accounts receivable stays on screen.
| Path | Role |
|---|---|
matrix.yaml |
Multi-host pin+where: cells id+erp+default_api+base_url (V27); --cell selects |
config/bootstrap/ |
Company, features, credit terms (Bootstrap REST package is CLI SoT 1.4.0+) |
config/baseline/ |
GL foundation (COA, ledger, subaccounts, UOMs) |
config/setup/ |
Financial year, master calendar, open periods |
config/master/ |
Inventory, warehouse, items, vendors, customers, module prefs, roles, users |
config/views/ |
Observation defs for acu state (trial balance); not seed |
scenario/10-seed-capital.yaml |
Once-class owner capital JE (CLI skip-if-present when present) |
scenario/20-buy.yaml |
Additive component PO to receipt to bill to AP pay (four vendors) |
scenario/30-build.yaml |
Additive kit assembly (parts to GW-EDGE / CELL / RAIL) |
scenario/40-sell.yaml |
Additive SO to ship to invoice (three customers; no AR pay) |
scenario/45-collect.yaml |
Additive mixed AR collect: ACMEMFG full, NORTHGRID partial, AGRISENSE open |
scenario/46-collect.yaml |
Close remaining Open AR after 45; skip when AR 11000 is already 0 |
state/ |
Local derived observations (acu state from config/views/; gitignored) |
overlays/ |
Optional Default-half rewrites (default-<default_api>/); bare apply/run/diff auto-compose |
reports/ |
Multi-host matrix evidence templates and run notes |
Start from a brand-new empty tenant. Do not apply onto a half-configured company.
# 1. Credentials (local .env): ACU_TENANT, ACU_USER, ACU_PASSWORD
# Default API pin + REST where = matrix.yaml cell (default_api + base_url)
# Optional ACU_BASE_URL overrides active cell where (ad-hoc probes)
# ACU_SSH optional (defaults to Administrator@<host> when unset;
# set blank ACU_SSH= for hosted / no-SSH)
# First cell is default; --cell id selects another
acu config check
# acu --cell 25r1 config check
# 2. Empty tenant + bootstrap (SSH control plane)
# create also publishes AcuBootstrap — ready for apply
acu tenant create --login TENANT
# Hosted / tenant already exists: acu bootstrap
# Offline UI fallback: acu bootstrap --export AcuBootstrap.zip
# 3. Seed configuration (config/ umbrella; order = bootstrap → baseline → setup → master)
# bare apply/run/diff auto-compose overlays/default-<default_api>/ when present
acu apply
# 4. Linked history for the pitch (once capital, then buy/build/sell/collect)
acu run
# 5. Prove no drift on seeded config
acu diff
# 6. Capture derived state (trial balance → state/)
acu state| File | Class | Warm re-run |
|---|---|---|
10-seed-capital.yaml |
once | CLI skips when capital JE already present; Owner Capital stays 50k (not stacked) |
20-buy.yaml |
additive | New component PO/receipt/bill/pay each run; part and cash deltas hold |
30-build.yaml |
additive | New kit assemblies each run; parts to kits deltas hold |
40-sell.yaml |
additive | New SO/ship/invoice pack each run; AR +4138, cash 0; deltas hold |
45-collect.yaml |
additive | Mixed AR: ACMEMFG full 1196, NORTHGRID partial 1000, AGRISENSE open; cash +2196. Re-run only after a fresh sell pack and 46 has closed leftover Open NORTHGRID |
46-collect.yaml |
once when AR 0 | Pays remaining Open NORTHGRID + AGRISENSE (live Balance); skip when AR 11000 is 0. After one 45 pack: cash +1942, AR 0 |
Primary compose: acu apply config/ then acu run scenario/.
Warm capital-only gate (state must not move):
acu run scenario/10-seed-capital.yaml && acu state --assert-unchanged| Command | Role |
|---|---|
acu tenant list |
List tenants on the instance (SSH) |
acu tenant delete --login TENANT --yes |
Delete tenant + recycle app pool |
acu tenant recycle --yes |
Restart site app pool (free API slots / reload tenant map) |
acu extract |
Inverse of apply: live tenant to config/** seed YAML |
acu schema |
Dump endpoint OpenAPI into schemas/ |
acu inventory ARTIFACT |
Offline: SM203520 Settings XML ZIP / ac.exe export xml into inventory/ |
acu reconcile |
Offline: inventory/ vs optional config/ into findings/ |
acu check --all --yes |
Cold lifecycle every matrix.yaml cell (delete, create, apply, run, diff); leaves tenant (no final delete); drift fails cell as exit 1 |
make check |
Same as acu check --all for lab matrix (tenant CHECK by default; CHECK_TENANT= override) |
make check HOST=25r1 |
Same E2E for one matrix cell only (acu --cell 25r1 check) |
Overlays live under overlays/default-<default_api>/.
With host-true matrix cells, bare commands auto-compose the pin overlay (acu-cli at least 0.24.0). Explicit path args disable auto.
# Cell 25r1 default_api: 24.200.001 → overlays/default-24.200.001/
acu --cell 25r1 apply
acu --cell 25r1 run
acu --cell 25r1 diff
# Explicit (no auto) — later path wins same keys
acu apply config/ overlays/default-24.200.001/
# Cold lifecycle every cell (SSH + tenant required)
acu check --all --yes --tenant LAB5