Wiki πŸ” Search

Adjustments β€” feature detail

Technical detail, English only. Every row below is a real row of the module's scorecard, linkable by its ID (for example #ADJ-F001). Measured at 56d2d327.

Columns are the ones the scorecard actually has β€” name, description, comparison source, status, evidence, notes β€” plus the gap impact where Β§7 ranks the row. Nothing is inferred.

T1 β€” core

ADJ-F001 Create adjustment (Draft) Implemented T1

Draft header (one location + reason) + optional signed lines

Compared against
RMS+RMH+WIDS365+market
Evidence
CreateAdjustment/CreateAdjustmentEndpoint.cs:103
Notes
Resolves Location/ReasonCode/variant PublicIds; snapshots cost/price; mints ADJ-######
ADJ-F002 Signed quantity change per line Implemented T1

Per-line QuantityChange (+ increase / βˆ’ decrease)

Compared against
RMS+RMH+WIDS365+market
Evidence
InventoryAdjustmentLine.cs:16; CreateAdjustmentEndpoint.cs:65-67 (NotEqual 0)
Notes
Signed delta, not a target count β€” same model as WIDS365
ADJ-F003 Reason-coded (required) Implemented T1

Every adjustment carries a reason from the catalog

Compared against
RMS+RMH+WIDS365+market
Evidence
InventoryAdjustment.cs:17 (non-null); CreateAdjustmentEndpoint.cs:118-125
Notes
Required by default β€” stronger than RMS/RMH (there it is config-driven "recommended") and matches WIDS365 (header-required)
ADJ-F004 Complete β†’ post to inventory Implemented T1

Complete writes InventoryMovement + upserts LocationProduct.QuantityOnHand, one transaction

Compared against
RMS+RMH+WIDS365+market
Evidence
CompleteAdjustmentEndpoint.cs:77,146-205,208-209
Notes
The core purpose. Atomic flip + per-line movement + QoH upsert + concurrency retry (#964)
ADJ-F005 Line management Implemented T1

Add / update / remove / atomic bulk-remove lines on a Draft

Compared against
RMS+RMH+WIDS365+market
Evidence
AddLine :60, UpdateLine :62, RemoveLine :30, RemoveLines batch #799
Notes
ProductVariant immutable on a line (remove+re-add); LineNumber auto max+1
ADJ-F006 Status lifecycle Implemented T1

Draft β†’ Completed | Cancelled; only Draft is mutable

Compared against
RMS+RMH+WIDS365+market
Evidence
AdjustmentStatus.cs; 409 guards in 5 endpoints; atomic flips
Notes
Both terminal states are atomic WHERE Status=Draft flips (no lost-update). Maps to WIDS365 Open→Closed / RMS Commit
ADJ-F007 Document numbering Implemented T1

Human ADJ-###### per merchant

Compared against
RMS+RMH+WIDS365
Evidence
CreateAdjustmentEndpoint.cs:156 via IDocumentSequenceService
Notes
Unique (MerchantId, DocumentNumber). Sequence service = shared-infra (ADJ-D07)
ADJ-F008 View adjustment detail Implemented T1

Full header + lines + names + attribution

Compared against
RMS+RMH+WIDS365+market
Evidence
GetAdjustmentEndpoint.cs:84
Notes
Resolves Location/ReasonCode/Employee names + CreatedBy/UpdatedBy from CentralDb
ADJ-F009 List / filter / sort / search Implemented T1

Paged list; filter location/status/reason/search; 7 sorts; Draft/Completed/Cancelled breakdown

Compared against
RMS+RMH+WIDS365+market
Evidence
ListAdjustmentsEndpoint.cs:117; breakdown :147-156 (#633)
Notes
Breakdown spans the full filtered set in one grouped round-trip

T2 β€” standard

ADJ-F010 Bulk / import / scan entry Missing T2

Add many lines fast β€” CSV/clipboard import or barcode-scan, not one-by-one

Compared against
WIDS365+RMS+market
Evidence
Natural home: a bulk-add endpoint over InventoryAdjustmentLine + a portal import/scan surface
Notes
QIIUB adds lines one at a time (bulk remove exists, #799; bulk add does not). WIDS365 has batch-JSON + clipboard/CSV; RMS Inventory Wizard 150; market has CSV + scan + mobile
Risk if absent
Large write-offs / recounts are slow line-by-line gap rank 3
ADJ-F011 Role / permission gating Implemented T2

Only authorized roles can create/complete adjustments

Compared against
RMS+RMH+market
Evidence
Roles("SystemAdmin","Admin") on every endpoint; portal canTransition = Admin||Manager (AdjustmentDetailPage.tsx:63)
Notes
Coarse RBAC (no per-location or per-reason grant) but the market-standard control is present
ADJ-F012 Reason categorization Partial T2

Preset reason set (damage / shrink / theft / found / recount)

Compared against
RMS+RMH+market
Evidence
ReasonType='Adjustment' scopes the picker (ListReasonCodesEndpoint.cs:25; portal AdjustmentsListPage.tsx:70-74)
Notes
What works: merchant-authored reasons scoped by ReasonType. Missing: no enforced category enum (shrinkage/theft/found are free-text, same as RMS/RMH). NB the ADJ-DAMAGE/ADJ-SHRINK codes ship only as DevSeed fixtures, not product presets
ADJ-F013 Adjustment history / audit Implemented T2

Who/when + an append-only movement trail per adjustment

Compared against
RMS+RMH+WIDS365+market
Evidence
InventoryMovement (append-only, ReferenceType=InventoryAdjustment); CreatedBy/UpdatedBy (BaseEntity.cs:14-15) surfaced in Get/List
Notes
Ledger + user attribution = the ADR-0023 document-trail tier. (WIDS365 additionally uses temporal tables; QIIUB deliberately does not on the movement ledger β€” ADR-0023.)
ADJ-F014 Operator attribution Missing T2

Record the specific employee (or completing user) on the adjustment

Compared against
RMS+RMH+WIDS365+market
Evidence
EmployeeId/ClosedByEmployeeId modeled + surfaced but never written (InventoryAdjustment.cs:16,22)
Notes
Reserved schema, no writer β†’ Missing (status def). Aggravated: Complete/Cancel flip via ExecuteUpdateAsync, which bypasses the audit interceptor, so not even UpdatedByUserId is stamped on the transition (the base attribution credited to F013 covers create/edit only). See Β§8
Risk if absent
No POS-employee accountability on write-offs (loss-prevention gap) gap rank 1
ADJ-F023 Barcode-scan / mobile entry Missing T2

Add adjustment lines by scanning, or from a mobile device

Compared against
market
Evidence
Line entry is manual desktop only (AdjustmentLineEntryBar.tsx); natural home: a scan handler + mobile surface
Notes
Market table-stakes; unfolded from ADJ-F010 so the import/scan/mobile lines map 1:1 like the rest of the table
ADJ-F024 Live on-hand at line entry Missing T2

Show the item's current QuantityOnHand while entering the line

Compared against
WIDS365+market
Evidence
Entry bar takes qty blind; natural home: resolve LocationProduct.QuantityOnHand into the line-entry response
Notes
WIDS365 surfaces available-on-hand at entry β€” lets the operator adjust to a known figure

T3 β€” advanced

ADJ-F015 Value / cost revaluation Missing T3

Adjust on-hand cost/value (revalue), not just quantity

Compared against
market
Evidence
Lines are quantity-only; LocationProduct.Cost never re-weighted at Complete (CompleteAdjustmentEndpoint.cs:180-183)
Notes
ERP tier β€” Cin7 explicit revaluation, NetSuite worksheet, Odoo. Not in Square/Clover/Lightspeed/WIDS365
Risk if absent
ERP-tier accounting not served gap rank 6
ADJ-F016 Reversal / undo Missing T3

One-click reverse of a Completed adjustment (auto-offset)

Compared against
market
Evidence
No endpoint; Completed is terminal. Natural home: a "reverse" endpoint that mints an offsetting Draft
Notes
Today the operator manually creates an offsetting adjustment. Some ERP/mid-market offer a void/reverse
Risk if absent
Fixing a wrong Completed adjustment is a manual offset gap rank 4
ADJ-F017 Approval / threshold gating Missing T3

Require sign-off (or a dollar threshold) before Complete

Compared against
market
Evidence
Complete open to any Admin/SystemAdmin; no threshold. Natural home: a status/approval gate on the transition
Notes
Rare even in ERP (NetSuite has no native approval) β€” building it would meet-or-beat the market
Risk if absent
No control on high-value adjustments gap rank 5
ADJ-F018 Mandatory-note enforcement Missing T3

Force a free-text note when the reason demands it

Compared against
market+QIIUB-original
Evidence
ReasonCode.RequiresNote exists (ReasonCode.cs:13) but no adjustment endpoint enforces it
Notes
Reserved flag, unwired β†’ Missing. Cheap quick-win over existing schema
Risk if absent
"requires note" reasons don't actually require one gap rank 2
ADJ-F019 Attachment / photo evidence Missing T3

Attach a photo/document to a damage/shrinkage write-off

Compared against
market
Evidence
Not in entity or endpoints. Natural home: a generic attachment table keyed by (ReferenceType, ReferenceId)
Notes
Compliance-grade write-off evidence; present in some mid-market inventory apps
ADJ-F020 GL / accounting posting Missing T3

Post a journal entry (shrinkage expense / COGS) per adjustment

Compared against
market
Evidence
No accounting integration on adjustments
Notes
ERP tier (NetSuite/Cin7). RMS/RMH also lack per-adjustment GL (batch close-out export only) β€” QIIUB is at parity with the reference systems here, behind only ERP
ADJ-F021 Back-date / effective date Missing T3

Set an adjustment's effective date for period accounting

Compared against
market+RMS
Evidence
AdjustmentDate = UtcNow at create, not user-settable (CreateAdjustmentEndpoint.cs)
Notes
ERP period-close nicety
ADJ-F022 Discontinued-item write-off Implemented T3

Adjust/write-off a product that is inactive/discontinued

Compared against
RMS+market
Evidence
Adjustment line variant resolution never joins the productActiveStatus filter (it sits on Product), so a killed SKU can still be lined; GetAdjustmentEndpoint.cs:98-99 keeps it visible in detail
Notes
You can clear the last units of a discontinued SKU
ADJ-F025 Printable adjustment document Missing T3

Print / export the adjustment as a document

Compared against
RMS+WIDS365
Evidence
No print/PDF surface (repo-wide ADR-0070 print gap); natural home: the ADR-0070 print pipeline
Notes
Internal doc β€” lower need than a PO/transfer slip, hence T3
ADJ-F026 Header valuation total Missing T3

Show the adjustment's total quantity / value magnitude

Compared against
WIDS365
Evidence
No aggregate on the header; natural home: a derived total in the Get/List projection
Notes
WIDS365 surfaces valuation totals on the header
ADJ-F027 Damage quarantine / hold bin Missing T3

Hold damaged stock in a non-sellable state, optionally return-to-main

Compared against
RMS+RMH
Evidence
QIIUB models damage as a destructive reason-coded write-off only; natural home: a location/stock-state flag
Notes
RMS/RMH InventoryOffline offers hold + return-to-main; QIIUB meets only the dispose half (reclassified from N/A after the Fable pass)
Deeper still: the full scorecard, rendered from the same source. This page never re-renders it.