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-F001Create adjustment (Draft)ImplementedT1
Draft header (one location + reason) + optional signed lines
Breakdown spans the full filtered set in one grouped round-trip
T2 β standard
ADJ-F010Bulk / import / scan entryMissingT2
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-F011Role / permission gatingImplementedT2
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-F012Reason categorizationPartialT2
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-F013Adjustment history / auditImplementedT2
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-F014Operator attributionMissingT2
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-F023Barcode-scan / mobile entryMissingT2
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-F024Live on-hand at line entryMissingT2
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-F015Value / cost revaluationMissingT3
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-F016Reversal / undoMissingT3
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-F017Approval / threshold gatingMissingT3
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-F018Mandatory-note enforcementMissingT3
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-F019Attachment / photo evidenceMissingT3
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-F020GL / accounting postingMissingT3
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-F021Back-date / effective dateMissingT3
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-F022Discontinued-item write-offImplementedT3
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-F025Printable adjustment documentMissingT3
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-F026Header valuation totalMissingT3
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-F027Damage quarantine / hold binMissingT3
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.