ChangeProof Evidence Pack

Generated: 2026-08-30T02:31:55.677Z

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: 86

evidenceBasisCount
OBSERVED_SOURCE65
EXECUTED_LOCAL21
statusCount
TARGET_VALIDATION_REQUIRED30
RESOLVED56
validationTargetCount
IBM_I30
LOCAL56

3. Blast Radius

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

ArtifactSymbolevidenceBasisstatusvalidationTarget
orderpro/rpgle/ORDPRC.rpgleCUSCLSOBSERVED_SOURCETARGET_VALIDATION_REQUIREDIBM_I
orderpro/clle/FULMNT.clleORDERPRO/FULMNTOBSERVED_SOURCETARGET_VALIDATION_REQUIREDIBM_I
orderpro/dds/CUSMAS.ddsCUSCLSOBSERVED_SOURCERESOLVEDLOCAL
orderpro/dds/ORDHED.ddsORDTYPOBSERVED_SOURCERESOLVEDLOCAL
orderpro/sql/db2/CUSMAS.sqlCUSCLSOBSERVED_SOURCETARGET_VALIDATION_REQUIREDIBM_I
orderpro/sql/db2/ORDHED.sqlORDTYPOBSERVED_SOURCETARGET_VALIDATION_REQUIREDIBM_I
orderpro/docs/operations-guide.md0042OBSERVED_SOURCERESOLVEDLOCAL
api/src/routes/orders.jscutoffHourOBSERVED_SOURCERESOLVEDLOCAL
api/src/adapters/mock-adapter.jscutoffOBSERVED_SOURCERESOLVEDLOCAL
orderpro/sql/sqlite/orderpro.dbCUSCLS=PEXECUTED_LOCALRESOLVEDLOCAL
orderpro/sql/sqlite/orderpro.dbCUSCLS=SEXECUTED_LOCALRESOLVEDLOCAL

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' = Validates cutoff windows and allocates inventory for incoming orders. — keywords: cutoffOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:8
CUSCLSvariable 'CUSCLS' — keywords: CUSCLSOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:12
ORDTYPvariable 'ORDTYP' — keywords: ORDTYPOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:13
commentcomment 'comment' = CHKORDCTF - Validate expedited order cutoff window — keywords: cutoff, expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:42
commentcomment 'comment' = CHG-0042: Preferred customers have an extended expedited cutoff of 18:00. — keywords: cutoff, preferred, expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:44
commentcomment 'comment' = Standard customers retain the existing 16:00 cutoff. — keywords: cutoffOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:45
CUTOFFvariable 'CUTOFF' = 160000 — keywords: cutoffOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:54
commentcomment 'comment' = Non-expedited orders are not subject to this intraday cutoff. — keywords: cutoff, expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:56
pcondition literal 'p' = 'p' — keywords: POBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/rpgle/ORDPRC.rpgle:61

orderpro/clle/FULMNT.clle

SymbolFindingBasisStatusLine
commentcomment 'comment' = FULMNT - Fulfillment Batch Job — keywords: batch, fulfillmentOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:2
commentcomment 'comment' = Processes open expedited orders at end of business day. — keywords: expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:5
commentcomment 'comment' = CHG-0042: Batch rescheduled to 18:15 to avoid collision with — keywords: batchOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:8
commentcomment 'comment' = the new 18:00 Preferred customer expedited order cutoff. — keywords: cutoff, preferred, expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:9
commentcomment 'comment' = the batch run executes. — keywords: batchOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:11
commentcomment 'comment' = Read all order header records and process open expedited orders — keywords: expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:31
commentcomment 'comment' = Process only Open Expedited orders — keywords: expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:35
ORDERPRO/ORDPRCcall 'ORDERPRO/ORDPRC' — keywords: ORDTYPOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:39
commentcomment 'comment' = Job submission — schedule next run — keywords: scheduleOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:66
commentcomment 'comment' = CHG-0042: moved from 18:00 to 18:15 to ensure all Preferred — keywords: preferredOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:67
commentcomment 'comment' = customer expedited orders (cutoff 18:00) are captured before — keywords: cutoff, expeditedOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:68
commentcomment 'comment' = the batch run executes. — keywords: batchOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:69
ORDERPRO/FULMNTcall 'ORDERPRO/FULMNT' — keywords: cutoff, preferred, SCDTIMEOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/clle/FULMNT.clle:73

orderpro/dds/CUSMAS.dds

SymbolFindingBasisStatusLine
CUSCLSfield 'CUSCLS' = Customer Class S=Standard P=Preferred — keywords: preferred, CUSCLSOBSERVED_SOURCERESOLVEDorderpro/dds/CUSMAS.dds:6

orderpro/dds/ORDHED.dds

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

orderpro/sql/db2/CUSMAS.sql

SymbolFindingBasisStatusLine
CUSCLScolumn 'CUSCLS' = CHAR — keywords: CUSCLSOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/sql/db2/CUSMAS.sql:12
CUSCLScolumn 'CUSCLS' = TEXT — keywords: preferred, CUSCLSOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/sql/db2/CUSMAS.sql:25
commentcomment 'comment' = CUSCLS label updated per CHG-0042: P=Preferred replaces legacy B=Business designation. — keywords: preferred, CUSCLSOBSERVED_SOURCETARGET_VALIDATION_REQUIREDorderpro/sql/db2/CUSMAS.sql:29

orderpro/sql/db2/ORDHED.sql

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

orderpro/docs/operations-guide.md

SymbolFindingBasisStatusLine
0042time expression '0042' = 0042 — keywords: cutoff, preferred, expeditedOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:6
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_SOURCERESOLVEDorderpro/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_SOURCERESOLVEDorderpro/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_SOURCERESOLVEDorderpro/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_SOURCERESOLVEDorderpro/docs/operations-guide.md:32
`P` | Preferred — top-tier accounts with extended service levels |list item '`P` | Preferred — top-tier accounts with extended service levels |' = | `P` | Preferred — top-tier accounts with extended service levels | — keywords: preferredOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:38
Customer class determines the applicable expedited order cutoff time.sentence 'Customer class determines the applicable expedited order cutoff time.' = Customer class determines the applicable expedited order cutoff time. — keywords: cutoff, expeditedOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:40
See **Section 4 — Cutoff Policy** for details.sentence 'See **Section 4 — Cutoff Policy** for details.' = See **Section 4 — Cutoff Policy** for details. — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:41
4. Cutoff Policyheading '4. Cutoff Policy' = ## — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:45
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_SOURCERESOLVEDorderpro/docs/operations-guide.md:47
4001time expression '4001' = 4001 — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:48
Standard orders have no intraday submission cutoff.sentence 'Standard orders have no intraday submission cutoff.' = Standard orders have no intraday submission cutoff. — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:50
Customer Class | Expedited Cutoff | Notes |list item 'Customer Class | Expedited Cutoff | Notes |' = | Customer Class | Expedited Cutoff | Notes | — keywords: cutoff, expeditedOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:52
----------------|-----------------|-------|list item '----------------|-----------------|-------|' = |----------------|-----------------|-------| — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:53
4:00 PMtime expression '4:00 PM' = 4:00 PM — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:54
6:00 PMtime expression '6:00 PM' = 6:00 PM — keywords: cutoff, preferredOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:55
0042time expression '0042' = 0042 — keywords: cutoff, preferred, expedited, CUSCLS, POBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:57
6:00 PMtime expression '6:00 PM' = 6:00 PM — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:58
> Customer Experience and applies to the IBM i ORDPRC program, the API facade,sentence '> Customer Experience and applies to the IBM i ORDPRC program, the API facade,' = > Customer Experience and applies to the IBM i ORDPRC program, the API facade, — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:59
> and the batch fulfillment schedule.sentence '> and the batch fulfillment schedule.' = > and the batch fulfillment schedule. — keywords: cutoff, batch, fulfillment, scheduleOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:60
--list item '--' = --- — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:62
5. Batch Processingheading '5. Batch Processing' = ## — keywords: batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:64
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_SOURCERESOLVEDorderpro/docs/operations-guide.md:66
18:15time expression '18:15' = 18:15 — keywords: batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:67
0042time expression '0042' = 0042 — keywords: batch, scheduleOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:69
18:00time expression '18:00' = 18:00 — keywords: preferred, expedited, batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:70
> in the queue before the batch run begins.sentence '> in the queue before the batch run begins.' = > in the queue before the batch run begins. — keywords: batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:71
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_SOURCERESOLVEDorderpro/docs/operations-guide.md:73
`ORDPRC` program to perform inventory allocation and status updates.sentence '`ORDPRC` program to perform inventory allocation and status updates.' = `ORDPRC` program to perform inventory allocation and status updates. — keywords: batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:74
*Job name:** `FULMNT`list item '*Job name:** `FULMNT`' = **Job name:** `FULMNT` — keywords: batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:76
*Job description:** `ORDERPRO/ORDJBD`list item '*Job description:** `ORDERPRO/ORDJBD`' = **Job description:** `ORDERPRO/ORDJBD` — keywords: batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:77
18:15 time expression '18:15 ' = 18:15 — keywords: batch, schedule, SCDTIMEOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:78
--list item '--' = --- — keywords: batchOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:80
4001time expression '4001' = 4001 — keywords: cutoffOBSERVED_SOURCERESOLVEDorderpro/docs/operations-guide.md:98

api/src/routes/orders.js

SymbolFindingBasisStatusLine
cutoffHourfunction 'cutoffHour' — keywords: CUSCLS, POBSERVED_SOURCERESOLVEDapi/src/routes/orders.js:34

api/src/adapters/mock-adapter.js

SymbolFindingBasisStatusLine
cutofffunction 'cutoff' — keywords: cutoff, CUSCLS, POBSERVED_SOURCERESOLVEDapi/src/adapters/mock-adapter.js:89

6. Test Results

16 passing · 0 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
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)RESOLVEDEXECUTED_LOCAL
Cutoff regression — CHG-0042 Preferred customer expedited order at 19:00 is rejectedRESOLVEDEXECUTED_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)RESOLVEDEXECUTED_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
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

No test gaps identified.

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

12. Diff Summary (Pre → Post Change)

CategoryCount
Resolved39
Persisted (still open)0
Target validation required26
New findings29

Resolved

Target Validation Required