ChangeProof Evidence Pack

Generated: 2026-08-28T16:40:16.622Z

1. Change Request

# Change Request: CHG-0042

## Title
Extend expedited order cutoff for Preferred customers

## ID
CHG-0042

## Date
2024-11-15

## Requestor
Sandra Kovacs, Director of Customer Experience, Acme Distribution Inc.

## Affected System
ORDERPRO — Order Processing and Inventory Allocation System (IBM i)

## Description
Preferred customers (customer classification `CUSCLS = 'P'`) are currently
subject to the same 4:00 PM expedited order submission cutoff as Standard
customers. This change requests that Preferred customers be permitted to
submit expedited orders until 6:00 PM local time.

Standard customers retain the existing 4:00 PM cutoff for expedited orders.
No change is required to the standard (non-expedited) order cutoff for any
customer class.

## Business Justification
Preferred customers represent the top 20% of revenue. Extending the expedited
cutoff by two hours brings ORDERPRO into alignment with competitor SLA offerings
and addresses escalated complaints from three key accounts (C-0021, C-0034,
C-0041).

## Acceptance Criteria
1. A Preferred customer (`CUSCLS = 'P'`) submitting an expedited order at or
   before 6:00 PM receives order confirmation.
2. A Preferred customer submitting an expedited order after 6:00 PM is rejected
   with the standard cutoff-exceeded message.
3. A Standard customer (`CUSCLS = 'S'`) submitting an expedited order after
   4:00 PM continues to be rejected.
4. All existing non-expedited order flows are unaffected.
5. Documentation reflects the updated cutoff policy.

## Keywords

Keywords: cutoff, preferred, expedited, 1600, 1800, CUSCLS, ORDTYP, P, E, batch, fulfillment, schedule, SCDTIME

2. Executive Summary

Total findings: 65

evidenceBasisCount
OBSERVED_SOURCE43
INFERRED1
EXECUTED_LOCAL21
statusCount
OPEN48
TARGET_VALIDATION_REQUIRED3
RESOLVED14
validationTargetCount
IBM_I26
LOCAL39

3. Blast Radius

65 total findings — showing primary representative per artifact. Full set in traceability.json.

ArtifactSymbolevidenceBasisstatusvalidationTarget
orderpro/clle/FULMNT.clleSCDTIME(180000)INFERREDOPENIBM_I
orderpro/rpgle/ORDPRC.rpglecommentOBSERVED_SOURCEOPENIBM_I
orderpro/clle/FULMNT.clleORDERPRO/ORDPRCOBSERVED_SOURCEOPENIBM_I
orderpro/dds/CUSMAS.ddsCUSCLSOBSERVED_SOURCEOPENLOCAL
orderpro/dds/ORDHED.ddsORDTYPOBSERVED_SOURCEOPENLOCAL
orderpro/sql/db2/CUSMAS.sqlCUSCLSOBSERVED_SOURCEOPENIBM_I
orderpro/sql/db2/ORDHED.sqlORDTYPOBSERVED_SOURCEOPENIBM_I
orderpro/docs/operations-guide.mdallocates inventory, and triggers end-of-day batch fulfillment processing.OBSERVED_SOURCEOPENLOCAL
api/src/routes/orders.jscutoffHourOBSERVED_SOURCEOPENLOCAL
api/src/adapters/mock-adapter.jscutoffOBSERVED_SOURCEOPENLOCAL
orderpro/sql/sqlite/orderpro.dbCUSCLS=PEXECUTED_LOCALOPENLOCAL
orderpro/sql/sqlite/orderpro.dbCUSCLS=SEXECUTED_LOCALOPENLOCAL

4. Dependency Analysis

FULMNT.clle  -->  ORDPRC.rpgle  (CALL PGM)
orders.js    -->  mock-adapter  -->  ORDPRC fixture
orders.js    -->  CUSMAS        (customer class lookup)

5. Static Analysis Findings

orderpro/rpgle/ORDPRC.rpgle

SymbolFindingBasisStatusLine
commentcomment 'comment' = Handles order cutoff validation and inventory allocation. — keywords: cutoffOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:5
commentcomment 'comment' = Cutoff per spec ORD-001 dated 2019-03-15 — keywords: cutoffOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:7
commentcomment 'comment' = Prototype: Check Order Cutoff — keywords: cutoffOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:12
commentcomment 'comment' = Procedure: CHKORDCTF - Check Order Cutoff Time — keywords: cutoffOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:26
commentcomment 'comment' = Returns *OFF if the cutoff time has passed. — keywords: cutoffOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:28
commentcomment 'comment' = Expedited cutoff = 16:00:00 for all customer classes. — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:30
commentcomment 'comment' = Only expedited orders are subject to the cutoff window — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:42
econdition literal 'e' = 'e' — keywords: EOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:43
commentcomment 'comment' = Cutoff exceeded - order rejected — keywords: cutoffOBSERVED_SOURCEOPENorderpro/rpgle/ORDPRC.rpgle:49

orderpro/clle/FULMNT.clle

SymbolFindingBasisStatusLine
commentcomment 'comment' = FULMNT - Fulfillment Batch Job — keywords: batch, fulfillmentOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:2
commentcomment 'comment' = Processes open expedited orders at end of business day. — keywords: expeditedOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:5
commentcomment 'comment' = Scheduled after the 4PM expedited-order cutoff. — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:8
commentcomment 'comment' = Read all order header records and process open expedited orders — keywords: expeditedOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:26
commentcomment 'comment' = Process only Open Expedited orders — keywords: expeditedOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:30
ORDERPRO/ORDPRCcall 'ORDERPRO/ORDPRC' — keywords: ORDTYPOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:34
commentcomment 'comment' = Job submission — schedule next run — keywords: scheduleOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:61
commentcomment 'comment' = Scheduled after 4PM cutoff - all expedited orders validated. — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:62
ORDERPRO/FULMNTcall 'ORDERPRO/FULMNT' — keywords: SCDTIMEOBSERVED_SOURCEOPENorderpro/clle/FULMNT.clle:66
SCDTIME(180000)Batch job FULMNT is scheduled at 180000 (18:00:00), which equals the new Preferred customer expedited cutoff introduced by CHG-0042. Orders submitted at or near 18:00 may not be captured before the batch run executes. Remediation: move SCDTIME to 181500 (18:15).INFERREDOPENorderpro/clle/FULMNT.clle:66

orderpro/dds/CUSMAS.dds

SymbolFindingBasisStatusLine
CUSCLSfield 'CUSCLS' = Customer Class S=Standard B=Business — keywords: CUSCLSOBSERVED_SOURCEOPENorderpro/dds/CUSMAS.dds:6

orderpro/dds/ORDHED.dds

SymbolFindingBasisStatusLine
ORDTYPfield 'ORDTYP' = Order Type E=Expedited S=Standard — keywords: expedited, ORDTYPOBSERVED_SOURCEOPENorderpro/dds/ORDHED.dds:7

orderpro/sql/db2/CUSMAS.sql

SymbolFindingBasisStatusLine
CUSCLScolumn 'CUSCLS' = CHAR — keywords: CUSCLSOBSERVED_SOURCEOPENorderpro/sql/db2/CUSMAS.sql:11
CUSCLScolumn 'CUSCLS' = TEXT — keywords: CUSCLSOBSERVED_SOURCEOPENorderpro/sql/db2/CUSMAS.sql:24

orderpro/sql/db2/ORDHED.sql

SymbolFindingBasisStatusLine
ORDTYPcolumn 'ORDTYP' = CHAR — keywords: ORDTYPOBSERVED_SOURCEOPENorderpro/sql/db2/ORDHED.sql:11
ORDTYPcolumn 'ORDTYP' = TEXT — keywords: expedited, ORDTYPOBSERVED_SOURCEOPENorderpro/sql/db2/ORDHED.sql:27

orderpro/docs/operations-guide.md

SymbolFindingBasisStatusLine
allocates inventory, and triggers end-of-day batch fulfillment processing.sentence 'allocates inventory, and triggers end-of-day batch fulfillment processing.' = allocates inventory, and triggers end-of-day batch fulfillment processing. — keywords: batch, fulfillmentOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:14
`E` | Expedited — priority fulfilment, subject to cutoff window |list item '`E` | Expedited — priority fulfilment, subject to cutoff window |' = | `E` | Expedited — priority fulfilment, subject to cutoff window | — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:25
`S` | Standard — normal processing, no intraday cutoff |list item '`S` | Standard — normal processing, no intraday cutoff |' = | `S` | Standard — normal processing, no intraday cutoff | — keywords: cutoffOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:26
Customers are classified at account setup and stored in the `CUSCLS` fieldsentence 'Customers are classified at account setup and stored in the `CUSCLS` field' = Customers are classified at account setup and stored in the `CUSCLS` field — keywords: CUSCLSOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:32
Customer class does not alter the documented expedited order cutoff time.sentence 'Customer class does not alter the documented expedited order cutoff time.' = Customer class does not alter the documented expedited order cutoff time. — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:40
4. Cutoff Policyheading '4. Cutoff Policy' = ## — keywords: cutoffOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:44
Expedited orders must be submitted by the applicable cutoff time. Orderssentence 'Expedited orders must be submitted by the applicable cutoff time. Orders' = Expedited orders must be submitted by the applicable cutoff time. Orders — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:46
4001time expression '4001' = 4001 — keywords: cutoffOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:47
Standard orders have no intraday submission cutoff.sentence 'Standard orders have no intraday submission cutoff.' = Standard orders have no intraday submission cutoff. — keywords: cutoffOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:49
Customer Class | Expedited Cutoff | Notes |list item 'Customer Class | Expedited Cutoff | Notes |' = | Customer Class | Expedited Cutoff | Notes | — keywords: cutoff, expeditedOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:51
4:00 PMtime expression '4:00 PM' = 4:00 PM — keywords: cutoff, preferredOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:55
5. Batch Processingheading '5. Batch Processing' = ## — keywords: batchOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:59
The end-of-day fulfillment batch job (`FULMNT`) runs automatically atsentence 'The end-of-day fulfillment batch job (`FULMNT`) runs automatically at' = The end-of-day fulfillment batch job (`FULMNT`) runs automatically at — keywords: batch, fulfillmentOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:61
4:00 PMtime expression '4:00 PM' = 4:00 PM — keywords: cutoff, batchOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:64
The batch job reads all open expedited orders from `ORDHED` and calls thesentence 'The batch job reads all open expedited orders from `ORDHED` and calls the' = The batch job reads all open expedited orders from `ORDHED` and calls the — keywords: expedited, batchOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:66
18:00 time expression '18:00 ' = 18:00 — keywords: schedule, SCDTIMEOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:71
4001time expression '4001' = 4001 — keywords: cutoffOBSERVED_SOURCEOPENorderpro/docs/operations-guide.md:91

api/src/routes/orders.js

SymbolFindingBasisStatusLine
cutoffHournumeric literal 'cutoffHour' = 16 — keywords: cutoffOBSERVED_SOURCEOPENapi/src/routes/orders.js:29

api/src/adapters/mock-adapter.js

SymbolFindingBasisStatusLine
cutoffnumeric literal 'cutoff' = 160000 — keywords: cutoffOBSERVED_SOURCEOPENapi/src/adapters/mock-adapter.js:87

6. Test Results

14 passing · 2 failing · 3 skipped/pending

TestStatusBasis
Batch fulfillment — IBM_I validation boundary FULMNT completes within batch window after CHG-0042TARGET_VALIDATION_REQUIREDEXECUTED_LOCAL
Batch fulfillment — IBM_I validation boundary ORDPRC compiles cleanly after CUSCLS branch additionTARGET_VALIDATION_REQUIREDEXECUTED_LOCAL
Batch fulfillment — IBM_I validation boundary SCDTIME(181500) takes effect in production job scheduleTARGET_VALIDATION_REQUIREDEXECUTED_LOCAL
POST /orders accepts a valid standard order well before cutoffRESOLVEDEXECUTED_LOCAL
POST /orders rejects a request with missing required fieldsRESOLVEDEXECUTED_LOCAL
POST /orders rejects an expedited order submitted after cutoff (hour=17)RESOLVEDEXECUTED_LOCAL
POST /orders accepts an expedited order submitted before cutoff (hour=15)RESOLVEDEXECUTED_LOCAL
POST /orders accepts Preferred customer expedited order at 17:00 (CHG-0042)OPENEXECUTED_LOCAL
POST /orders rejects Preferred customer expedited order at 19:00 (after 18:00 cutoff)RESOLVEDEXECUTED_LOCAL
GET /orders/:id returns 404 for an unknown orderRESOLVEDEXECUTED_LOCAL
Cutoff regression — CHG-0042 Standard customer expedited order at 15:00 is acceptedRESOLVEDEXECUTED_LOCAL
Cutoff regression — CHG-0042 Standard customer expedited order at 17:00 is rejectedRESOLVEDEXECUTED_LOCAL
Cutoff regression — CHG-0042 Preferred customer expedited order at 17:00 should be accepted (CHG-0042)OPENEXECUTED_LOCAL
Cutoff regression — CHG-0042 Preferred customer expedited order at 19:00 is rejectedRESOLVEDEXECUTED_LOCAL
Inventory allocation regression Order for in-stock item is acceptedRESOLVEDEXECUTED_LOCAL
Inventory allocation regression Customer lookup returns correct class for Preferred customerRESOLVEDEXECUTED_LOCAL
Inventory allocation regression Inactive customer data is present in surrogateRESOLVEDEXECUTED_LOCAL
GET /customers/:id returns customer data for a known Preferred customerRESOLVEDEXECUTED_LOCAL
GET /customers/:id returns 404 for an unknown customerRESOLVEDEXECUTED_LOCAL

7. Test Gaps

8. Documentation Gaps

9. IBM i Validation Boundary

Conservative options: idb-connector (ODBC), itoolkit/XMLSERVICE, SSH + CRTBNDRPG, QSYS2.QCMDEXC via ODBC.

10. Rollback Guidance

ArtifactRollback Action
orderpro/rpgle/ORDPRC.rpgleRevert CHKORDCTF to single 1600 cutoff
orderpro/clle/FULMNT.clleRevert SCDTIME to 180000
api/src/routes/orders.jsRevert cutoffHour to constant 16
orderpro/dds/CUSMAS.ddsRevert CUSCLS field text
orderpro/sql/db2/CUSMAS.sqlRevert LABEL ON COLUMN text
orderpro/docs/operations-guide.mdRevert Cutoff Policy and Customer Classes sections

11. Traceability Matrix

CHG-0042 RequirementFinding(s)
Preferred customer cutoff = 18:00ORDPRC.rpgle CHKORDCTF, orders.js cutoffHour
Standard customer cutoff unchangedorders.js cutoffHour, regression cutoff tests
Batch window must not drop 18:00 ordersFULMNT.clle SCDTIME (INFERRED collision)
CUSCLS documentation correctedCUSMAS.dds, Db2 DDL LABEL ON
Operations guide updatedoperations-guide.md Cutoff Policy section
Regression tests addedorders.test.js, cutoff.test.js