Skip to content

PERP-1: foundation module for the PreSales ERP demo (perp/) - #10

Open
coderflow-demo-server[bot] wants to merge 14 commits into
mainfrom
PERPDEMO
Open

coderflow-demo-server[bot] wants to merge 14 commits into
mainfrom
PERPDEMO

Conversation

@coderflow-demo-server

Copy link
Copy Markdown
Contributor

Adds a new ibmi-agentic/perp/ module alongside cfdemo/, establishing the
build and DDL patterns every subsequent PERP epic will follow.

  • perp/AGENTS.md, perp/Rules.mk, perp/.codermake/config.json — module
    scaffold; .codermake adds a runsqlstm entry for the .table.sql /
    .index.sql / .view.sql / .proc.sql recipes.

  • perp/DDL_STYLE_GUIDE.md — 12-section codebase-side conventions doc:
    file naming, FOR SYSTEM NAME / FOR COLUMN, multi-tenancy on
    company_code, standard audit block, referential integrity, composite
    PKs, journaling, effective-dated pricing, document numbering,
    generic code_master lookup, standard file header, build ordering.

  • perp/qddlsrc/example_reference.table.sql — worked example exercising
    every convention; builds to PERPDEMO/EXMPREF, journaled to PERPJRN
    with IMAGES(*BOTH).

  • perp/qclsrc/perpjrn.clle — bootstrap CL, creates PERPJRN + PERPRCV001
    in PERPDEMO (JRNCACHE, MAXOPT2, sysmgr-rolled receivers). Idempotent.

  • perp/qclsrc/perpsjpf.clle — STRJRNPF wrapper for attaching each new
    SQL table to PERPJRN with IMAGES(*BOTH) OMTJRNE(*OPNCLO).

Closes PERP-10, PERP-11, PERP-12, PERP-13 (all under Epic PERP-1).

Corrections folded in from what was learned building the reference table
against DB2 for i V7R5: FOR COLUMN goes between column name and data type
(not after — SQL0199); _by columns need VARCHAR(18) not VARCHAR(10) so
DEFAULT USER fits (SQL0574); GENERATED ALWAYS AS ('literal') is invalid,
use DEFAULT + named table-level CHECK instead; journal receiver name is
PERPRCV001 (10-char IBM i object-name cap, not PERPRCV0001).

Also — outside the code diff — set the remaining 8 epics (PERP-2..9) and 37
stories (PERP-14..50) up to be self-executable: created a new "PERP
Delivery Playbook" Confluence page under the project hub that codifies
build target, code home, Jira lifecycle, DDL conventions, DB2 gotchas,
journaling routine, per-page docs duties, and a shared DoD template; then
prepended a "read this first" info panel and appended a category-specific
Definition-of-Done checklist to every one of those 45 ticket
descriptions.

Co-Authored-By: CoderFlow ai@coderflow.ai
Learn more: https://coderflow.ai

ProfoundGary and others added 14 commits July 15, 2026 16:07
Adds a new ibmi-agentic/perp/ module alongside cfdemo/, establishing the
build and DDL patterns every subsequent PERP epic will follow.

  * perp/AGENTS.md, perp/Rules.mk, perp/.codermake/config.json — module
    scaffold; .codermake adds a runsqlstm entry for the .table.sql /
    .index.sql / .view.sql / .proc.sql recipes.

  * perp/DDL_STYLE_GUIDE.md — 12-section codebase-side conventions doc:
    file naming, FOR SYSTEM NAME / FOR COLUMN, multi-tenancy on
    company_code, standard audit block, referential integrity, composite
    PKs, journaling, effective-dated pricing, document numbering,
    generic code_master lookup, standard file header, build ordering.

  * perp/qddlsrc/example_reference.table.sql — worked example exercising
    every convention; builds to PERPDEMO/EXMPREF, journaled to PERPJRN
    with IMAGES(*BOTH).

  * perp/qclsrc/perpjrn.clle — bootstrap CL, creates PERPJRN + PERPRCV001
    in PERPDEMO (JRNCACHE, MAXOPT2, sysmgr-rolled receivers). Idempotent.

  * perp/qclsrc/perpsjpf.clle — STRJRNPF wrapper for attaching each new
    SQL table to PERPJRN with IMAGES(*BOTH) OMTJRNE(*OPNCLO).

Closes PERP-10, PERP-11, PERP-12, PERP-13 (all under Epic PERP-1).

Corrections folded in from what was learned building the reference table
against DB2 for i V7R5: FOR COLUMN goes between column name and data type
(not after — SQL0199); _by columns need VARCHAR(18) not VARCHAR(10) so
DEFAULT USER fits (SQL0574); GENERATED ALWAYS AS ('literal') is invalid,
use DEFAULT + named table-level CHECK instead; journal receiver name is
PERPRCV001 (10-char IBM i object-name cap, not PERPRCV0001).

Also — outside the code diff — set the remaining 8 epics (PERP-2..9) and 37
stories (PERP-14..50) up to be self-executable: created a new "PERP
Delivery Playbook" Confluence page under the project hub that codifies
build target, code home, Jira lifecycle, DDL conventions, DB2 gotchas,
journaling routine, per-page docs duties, and a shared DoD template; then
prepended a "read this first" info panel and appended a category-specific
Definition-of-Done checklist to every one of those 45 ticket
descriptions.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…ocseq service

Ships the multi-tenant / generic-lookup foundation that every downstream PERP
epic depends on. Adds 5 tables in PERPDEMO (company, code_master,
document_sequence, company_config, perp_user), a 28-row code_master seed, a
docseq service program with atomic per-(company, doc_type) sequencing, and
three DSPF/RPG maintenance programs (perpselr, wrkcmr, wrkusrr) tied together
by a PERP menu (perpmnu.menu).

Sources under ibmi-agentic/perp/:
- qddlsrc/*.table.sql            — 5 tables + seed script
- qrpglesrc/docseq.sqlrpgle etc. — docseq service + smoke test
- qrpglesrc/perpselr, wrkcmr, wrkusrr — DSPF-driven CRUD programs
- qddssrc/*.dspf                 — matching 5250 subfile screens + PERPMNU
- qsrvsrc/docseq.bnd             — docseq export list
- perp.bnddir, perpmnu.msgf      — binding directory and menu message file
- Rules.mk                       — full build graph
- DDL_STYLE_GUIDE.md             — expanded with RPG (§13), DSPF (§14),
                                    and codermake (§15) conventions and the
                                    DB2 for i / SQLRPGLE gotchas surfaced

Every table journaled via CALL PERPSJPF. All objects build clean into
PERPDEMO with severity <30. docseq end-to-end verified via ssh CALL.

Post-review fixes:
- perpmnu.dspf record format renamed R MENU → R PERPMNU so GO PERPMNU
  works (CRTMNU TYPE(*DSPF) requires format name to match menu name).
- QDDLSRC source PF created in PERPDEMO — was missing at library setup;
  needed for the .table.sql / .index.sql / .view.sql / .proc.sql
  sources to sync back to IBM i on commit. Bootstrap set documented in
  DDL_STYLE_GUIDE.md §16.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Adds the PERP-3 epic (PERP-20..24): uom/item_class/item/item_uom_conversion/
item_lot DDL, and DSPF+RPGLE maintenance programs (WRKUOMR, WRKCNVR, WRKICLR,
WRKITMR, WRKLOTR) scoped by the *LDA-selected company. Item master
maintenance cross-calls the UOM-conversion and lot screens pre-scoped to the
selected item. Extends Rules.mk and the PERP main menu accordingly, and
folds three newly-discovered DB2-for-i/DDS/RPG gotchas into DDL_STYLE_GUIDE.md.

Also fixes an empty-subfile runtime crash ("Session or device error") present
in all 8 PERP work-with programs, including the PERP-2 precedent programs
(PERPSELR, WRKCMR, WRKUSRR): the subfile-options READC loop ran unconditionally
even when nothing was loaded, which raises a CPF5006-class error instead of
*EOF. Guarded with `if numRows > 0`, and reset the row counter explicitly in
the two programs that skip loading when their scope key is blank.

Adds EDTCDE(3) to every numeric DDS field across WRKITMR/WRKCNVR/WRKLOTR (16
fields) and retrofits it onto WRKCMR's sort_order, which was using EDTCDE(Z)
and silently blanked its default-zero value. Zero-suppresses while still
showing a literal 0 for a true zero balance/quantity, per a new standing
convention documented in DDL_STYLE_GUIDE.md.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…, coordinate query service

Implements all 3 stories under epic PERP-4:
- PERP-25: warehouse_layout DDL (one row per company: grid + bin dims)
- PERP-26: WLMR single-record maintenance screen (wlmd.dspf/wlmr.sqlrpgle)
- PERP-27: WHCOORD coordinate query service (whcoord.sqlrpgle/_pr.rpgle,
  whcoord.bnd, whcoordsmk smoke test) — parses item location codes
  (e.g. 'A1'/'B2'/'S3') for their numeric ordinal in RPG rather than
  CASTing to INTEGER in SQL, since real seed data mixes a letter prefix
  with the digit and CAST(...AS INTEGER) rejects that outright.

Wires WLMR/WHCOORDSMK into PERPMNU (options 10/11) and documents the
alphanumeric-location-code gotcha in DDL_STYLE_GUIDE.md sec 14a.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…ory service

Implements all 5 stories of the Vendor & Pricing epic in ibmi-agentic/perp/:

- PERP-28: vendor, item_vendor, item_vendor_price tables + partial unique
  index enforcing one preferred vendor per item; seeds code_master PAYTERMS.
- PERP-29: WRKVNDR/WRKVNDD — vendor master maintenance (filters by
  active/buyer).
- PERP-30: WRKIVNR/WRKIVND — item-vendor profile maintenance, scoped by
  item or vendor; preferred-vendor conflicts rejected by the DB (SQLCODE
  -803) with a friendly message.
- PERP-31: WRKIVPR/WRKIVPD — effective-dated price entry; adding a price
  closes the current row and inserts a new one dated today.
- PERP-32: item_vendor_price_history view + ITMVPRCQ service program
  (itmvprcq_history) + IVPRCQSMK smoke tester, for the pricing-over-time
  graph demo.

Extends PERPMNU with options 10-13. Updates DDL_STYLE_GUIDE.md with three
new DB2-for-i/RPG gotchas discovered along the way (sequential short-name
abbreviation on multi-object name collisions, partial/filtered unique
index support, the 10-char RPG object-name cap). Confluence Data Model,
Design Decisions, Delivery Plan, PERP Delivery Playbook, and the PERP
hub page are updated to match.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…I polish

Splits the flat 13-option PERPMNU into a slim top-level menu (Select
company, System Maintenance, Inventory Master Data, Vendor & Pricing,
Diagnostics/Smoke Tests, Sign off) with 4 new child menus (PERPSYSM,
PERPINVM, PERPVNDM, PERPDIAG) grouping the actual maintenance/diagnostic
programs, so the menu scales cleanly as PERP-6/7/8 land instead of
growing one line per story. Also fixes UI issues found during review:
- WRKVNDR's 5=Display no longer shows an editable panel (fields
  protected via a display-mode indicator).
- The unlabeled EMODE mode indicator ('A'/'C'/'D') gets a 'Mode:' label
  across all 9 affected work-with screens.
- All 5 PERPMNU/child menus get an F3=Exit legend at line 23, matching
  every work-with screen's existing F-key footer.
…r-pricing-tables-maintenance-programs

# Conflicts:
#	perp/Rules.mk
#	perp/perp.bnddir
#	perp/perpmnu.msgf
#	perp/qddssrc/perpmnu.dspf
…uto-approval hook

Implements the full Requisitioning epic (PERP-33 through PERP-36):

- requisition_header / requisition_line DDL (REQUI00001/REQUI00002), with
  confidence_pct and a full approval audit block (approved_by/approved_at/
  approval_source_code+type/approval_notes, all-or-nothing via CHECK),
  journaled to PERPJRN
- REQENTR: requisition entry (header + line subfile), doc-numbered via
  docseq_next('REQ'), UOM/cost defaulted from item master + preferred
  vendor pricing
- REQAPRR: requisition approval (SUBMITTED list -> detail w/ lines +
  confidence badge -> approve/reject, human-stamped)
- REQAUTO: CoderFlow auto-approval hook (skeleton scorer + threshold-gated
  auto-approve against company_config), smoke-tested via REQAUTOSMK
- New PERPREQM child menu under PERPMNU; REQAUTOSMK added to PERPDIAG
- perp/qddlsrc/seed/025_approval_thresholds.sql: seeds company_config
  auto-approval thresholds for both demo companies (numbered 025, not
  030, to avoid colliding with PERP-9's planned 030_items.sql)
- perp/DDL_STYLE_GUIDE.md: documents that GENERATED ALWAYS AS (expression)
  computed columns don't build on this target, and the FOR COLUMN
  duplicate-name gotcha on short SQL names

Also updates Confluence (Design Decisions & Conventions, Data Model —
Transactional & Audit, Delivery Plan — Epics & Roadmap, PERP hub, ACME
Seed Dataset Spec) to reflect the shipped schema and epic status.

Post-close fixes (found via live user testing after the epic closed):
- reqentr.sqlrpgle / reqaprr.sqlrpgle: writeMsg passed a private msgkey
  variable to QMHSNDPM instead of the DDS SFLMSGKEY field (smsgkey),
  crashing every message the programs tried to show ("The call to
  WRITEMSG ended in error"). Fixed to pass smsgkey; removed the dead
  msgkey variable.
- reqentd.dspf: RHEAD (header-entry format) was missing OVERLAY, which
  would have hidden the "no company selected" message even after the
  crash was fixed.
- perp/qddlsrc/seed/025_approval_thresholds.sql (renamed from 030 to
  avoid colliding with PERP-9's planned 030_items.sql).
- reqentr.sqlrpgle: deferred the "2=Change" line option's EXFMT RLEDIT
  until after its driving READC loop drains (defensive, matches
  perpselr.sqlrpgle's pattern), reading from the RPG array snapshot
  instead of the live subfile buffer once deferred.
- reqaprr/reqaprd: reqaprr crashed live with CPF5006 "Session or
  device error" / unmonitored RNX1255 at EXFMT ALCTL when it held two
  subfiles (ASFL/ASCTL list + ALSFL/ALCTL review-detail) in one device
  file. Took four rounds to actually resolve:
    1. Deferring the format switch past the driving READC loop -- did
       not fix it.
    2. Splitting the detail screen into a separately-called program
       (REQAPDTL) with its own device file -- also crashed, cascading
       across both files. REQAPDTL later removed entirely (orphaned
       PERPDEMO objects/source deleted, removed from Rules.mk).
    3. Diagnosed (via community references on this exact error) that
       SFLDSP-on with 0 device-visible rows -- caused by RDFOOT (a
       footer written every loop iteration right before EXFMT ALCTL)
       missing OVERLAY -- was the root cause. Rebuilt with two real
       subfiles (ASFL/ASCTL + ALSFL/ALCTL, header fields combined onto
       ALCTL per reqentd.dspf's RLCTL pattern), separate SFLCLR/SFLDSP
       indicators, RDFOOT with OVERLAY. Compiled clean, reported fixed.
    4. Disproven by the user's own fresh-session retest: identical
       crash, identical statement. Reverted reqaprr/reqaprd.dspf to
       the only design ever confirmed to actually render: one real
       subfile (ASFL/ASCTL) for the list, and a plain non-subfile
       RDETAIL record for the review/approve screen, with up to 6
       line-item fields conditioned on indicators (*in60-*in65) so
       unused rows are blank instead of showing 0.0000. This is a
       scoped, deliberate deviation from this module's usual
       two-subfile pattern, kept only for reqaprr; the true root cause
       of why a second subfile fails here remains unconfirmed.
  Also fixed a related DDS compile-time bug hit along the way
  (SFLDSPCTL + an input field below a subfile's anchor row raises
  CPD7812) and a free-form RPG syntax issue (no multiple
  semicolon-separated statements per source line on this compiler).
  DDL_STYLE_GUIDE.md Sec.14, the Design Decisions & Conventions
  Confluence page, and persistent memory were each corrected multiple
  times as understanding evolved -- final state documents all four
  attempts and outcomes plainly rather than presenting another
  unconfirmed theory as settled.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…et, browse programs

Delivers the full Purchasing epic (PERP-37..41) in one pass.

DDL (PERP-37):
- po_header, po_line, po_line_schedule tables, all journaled to PERPJRN
  (*BOTH/*OPNCLO). FK order preserved: po_header FKs company, vendor,
  perp_user (buyer), code_master; po_line FKs po_header, item, uom,
  code_master, and composite-FKs requisition_line for the optional
  source_requisition line-level linkage (MATCH SIMPLE, both null on
  manual PO).
- po_line_open view exposes the demo-friendly derived columns
  (open_qty = ordered_qty - received_qty, extended_price = ordered_qty
  * unit_price). This is the reference workaround for the GENERATED
  ALWAYS AS (expression) gap documented in DDL_STYLE_GUIDE.md Sec.9 --
  computed columns still don't build on this target, but a companion
  view does.

Programs (PERP-38..41):
- poentr / poentd: manual PO entry, reqentr shape. Buyer snapshot from
  vendor.buyer_code; docseq_next('PO'); unit_price default from
  item_vendor_price current row; F8=Submit flips DRAFT to OPEN.
  Currency hard-coded to USD per user request (removed the field from
  the DSPF, INSERT relies on the DDL default).
- poreqr / poreqd: PO from requisition (consolidate/split). Selects
  APPROVED reqs whose lines aren't yet linked to any po_line; groups
  by preferred vendor; F6=Confirm creates POs with source_requisition
  line-level linkage. Requisition Converted status is derived from
  the linkage, not stored.
- poschr / poschd: blanket schedule maintenance. Soft warning when
  total scheduled_qty > po_line.ordered_qty. OPTIONS(*NOPASS) parms
  so pobrwr drills in scoped.
- pobrwr / pobrwd: PO browse & inquiry. Filterable subfile + plain-
  record BDETAIL drawn from po_line_open. Opt 9 calls poschr scoped
  to line 1 for blanket-schedule editing.

Menu wiring: new PERPPOM child menu with 4 options; PERPMNU adds
option 7 -> GO PERPDEMO/PERPPOM.

Style guide + playbook updated with three runtime-only gotchas
learned live during PERP-7 (all compile clean severity 00, then
crash on first exercise):
- Date/DATFMT triangle: ctl-opt datfmt(*iso) + explicit %date(...:
  *ISO) + sentinel dates within 1940-2039 (the SQL precompiler
  generates its intermediate host vars with the job DATFMT and
  ignores ctl-opt datfmt(*iso), so the SQL side stays capped at *MDY
  even after the ctl-opt fix). RNQ0114 otherwise.
- %subst(varchar : 1 : N) is strict about current data length, not
  declared max -- 'OPEN' (4 chars) can't answer %subst(...,1,10)
  even in a VARCHAR(20) column. RNQ0100 otherwise. Fix: direct
  assign; RPG right-pads or truncates automatically.
- %editc(int : 'X') returns hex, not decimal. Use %char() for plain
  doc-number display. Silent-wrong-output otherwise (every PO # in
  the first browse rendered as 0000000000).

Now captured in perp/AGENTS.md "Runtime-only gotchas" section
(loads at the top of the playbook for future PERP work) and
perp/DDL_STYLE_GUIDE.md Sec.13.

Verification: state-based via SQL (DDL + view + CHECK constraints +
consolidation flow all exercised against live PERPDEMO with test rows,
cleaned up after). Interactive UI verification of the 4 programs done
live by the user, three RPG runtime bugs surfaced and fixed in the
process (see above).

Jira: PERP-7 epic + PERP-37..41 stories all transitioned Done. Confluence
Data Model, Delivery Plan, PERP hub, and Design Decisions pages updated.
…_log,

receipt entry (UOM conversion + lot capture), lot reconciliation service,
reconciliation log browse

Closes the requisition -> PO -> receiving transaction loop (PERP-42..45):

- PERP-42: po_receipt, po_receipt_line, reconciliation_log tables, journaled
  to PERPJRN.
- PERP-43: rcventr/rcventd PO receipt entry — validates PO status, converts
  vendor UOM to inventory UOM via item_uom_conversion, upserts item_lot for
  lot-controlled items, rolls up po_line/po_header status on every receipt
  (the PO-status-transition-from-receipts item PERP-7 deferred to this
  epic). Fixes a message-subfile display bug found live (missing WRITE
  before EXFMT).
- PERP-44: lotrecon module/srvpgm + lotrcnsmk smoke test — detects and
  repairs drift between item.qty_on_hand and SUM(item_lot.qty_on_hand),
  logging every repair to reconciliation_log.
- PERP-45: rcnbrwr/rcnbrwd — filterable reconciliation_log browse + detail.
- New PERPRCVM child menu under PERPMNU option 8; lotrcnsmk added to
  PERPDIAG option 5.

DDL_STYLE_GUIDE.md gains Sec.16a (message-subfile WRITE-before-EXFMT
gotcha) and Sec.17 (CHECK constraints cannot cross tables). Confluence
Data Model, Design Decisions, Delivery Plan, and PERP hub pages updated
to reflect the shipped schema and epic status.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
## What I did

Created a new Epic in the **PERP** Jira project (plogic.atlassian.net) to track Phase Two work:

- **Epic:** [PERP-51 — Phase Two: Prompt Programs and Aesthetic Improvements](https://plogic.atlassian.net/browse/PERP-51)
- **Description:** Tracks Phase Two work covering prompt program enhancements and aesthetic/UI improvements identified through hands-on system testing.

This was a pure ticketing exercise — no code was changed and no repository was touched.

## Why

The user is going to manually walk through the PERP system, testing functionality and identifying areas for improvement. Each issue they find will be filed as a Story under this epic in a series of follow-up requests/tasks, rather than being implemented immediately.

## Next steps

- Waiting for the user to report specific issues found during testing.
- For each issue reported, I will create a Story in Jira under project PERP with the Epic link set to **PERP-51**. No code changes will be made as part of this ticketing workflow unless the user explicitly asks for implementation work separately.
- I saved a memory note (`project-perp-phase-two-epic.md`) recording that PERP-51 is the active Phase Two epic, so future tasks/sessions know where to file new stories.

## Issues encountered

None. The epic was created successfully on the first attempt.

## IBM i task library

`IBMI_BUILD_LIBRARY` = `AITSK00071` (not used in this task, since no build or code work was performed).

## Exploratory Verification

Not applicable — this task did not involve any interactive IBM i display file screens or code changes; it was limited to creating a Jira epic.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…ion for companies

perpseld.dspf/perpselr.sqlrpgle: added CHECK(LC) to Company name/Address/City so
they accept lowercase (DDS input fields default to uppercase-only without it);
coded fields (company code, state, country, currency) stay uppercase. Added
2=Change company info alongside 1=Select, reusing the existing Add panel (now
"Edit Company" with a Mode: A/C indicator); company code is protected
(DSPATR(PR)) during Change since it's an FK'd primary key. Also fixed a
missing-holdMsg bug found live: the "Company X selected"/Add confirmation
messages were being silently wiped before ever displaying. Also, per a follow-up
request, 1=Select now exits straight back to the calling menu after committing
the LDA update (F3-style) instead of redisplaying the list -- the confirmation
message on that path was removed since it's no longer shown to anyone.

PERP-51: implement remaining Phase Two tickets (PERP-72..98) and fix 3 systemic RPG bugs found via live testing

Second batch of the PERP-51 epic (PERP-72 through PERP-98): MM/DD/YY date display
across Requisition Entry/Approval, PO Entry/Browse/Schedule, Item Lots, and Receipt
Entry; new reusable numeric PO-number prompt program (poprmt, F4=Prompt convention);
item/vendor prompts on remaining screens; column realignment and F12-navigation
fixes on PO Entry and PO Browse; outer-loop restart pattern on Requisition/PO Entry
after submit.

Live exploratory testing (not just code review) surfaced and fixed three bug
classes affecting most programs in the module, well beyond their originating
tickets:
- `return;` inside a `begsr` subroutine ends the whole RPG program, not just that
  subroutine -- fixed by switching to `leavesr;` in 19 programs (itmprmt, vndprmt,
  poprmt, perpselr, wrkcnvr, wrklotr, wrkitmr, wrkivnr, wrkivpr, wrkiclr, reqentr,
  poentr, pobrwr, rcventr, poschr, wlmr, wrkusrr, reqaprr, poreqr).
- Message-subfile control record not re-written before the next EXFMT (poentr,
  poschr header loops), and missing/incomplete holdMsg one-shot-skip coverage
  (wrkcnvr, wrkitmr, wrkivnr, wrkiclr, wrkusrr, wlmr, reqaprr) -- both silently
  dropped validation/confirmation messages that were otherwise queued correctly.
- Sentinel date value (0001-01-01) crashed with RNQ0114 on a DATFMT(*MDY)-bound
  screen field despite the program's own datfmt(*iso) ctl-opt -- fixed by using an
  in-range sentinel (1940-01-01) in poentr; corrected a stale comment in pobrwr
  describing the same trap it had already fixed correctly.

All 47 PERP-51 child tickets and the epic itself remain "In Progress" (not "Done")
per explicit instruction -- final sign-off is the user's own testing pass.

Also: adopted local codermake build/ stamps for pre-existing PERPDEMO data tables
after a container-restart wiped the stamp cache, avoiding an accidental CRTPF/
RUNSQLSTM re-create attempt against populated tables (none were harmed).

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
…tribute-byte gap cascade)

The From heading sat one column right of its own SFROM data field because every named DDS
field reserves a hidden attribute-byte column immediately before its start, and the Opt
heading's trailing character occupied the slot From's own attribute byte needed. Fixed by
shifting the whole downstream chain by one column in both records: SFROM/STO/SFACT in the
subfile data record, and To/Factor in the heading record. Compiles clean with zero warnings
(previous single-field attempts each threw CPD7866 field-overlap warnings). Live-verified:
From/CS and To/EA now land on exactly the same columns.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Following the wrkitmr fix, an audit found the same "blank required/FK field
surfaces as a raw SQLCODE/SQLSTATE message" trait in 12 other programs. Fixed
all of them: wrkvndr, wrkusrr, wrkcnvr, wrkcmr, wrkiclr, wrkuomr, wrkivnr,
wrklotr (each gets a validateXxx subroutine checking required fields before
the SQL, with plain per-field messages), plus one-line UOM checks in
poentr/reqentr's changeLine, and unit_price/currency_code + company_code/
company_name/base_currency checks in wrkivpr/perpselr.

While there, fixed the SAME message-display bugs already documented for
wrkitmr in three of these files (wrkvndr, wrkcmr, wrkuomr had no holdMsg
mechanism at all, so every add/change/delete result was silently lost) and
the same return;-ends-whole-program bug in those same three files' error
paths (should be leavesr;). A module-wide sweep afterward found the identical
return; bug in one more file, rcnbrwr.sqlrpgle, NOT fixed here since it's
outside this fix's scope -- flagged for a follow-up decision.

All 12 programs rebuilt clean (severity 00) and live-verified: each shows the
correct field-specific message, and a full valid save still works.

Also includes a one-time shadow-build of cfdemo's menu.menu into this task's
AITSK00019 build library, needed to restore command-line navigation for
interactive testing (this task started in a fresh container without the
shadow-menu from earlier in this session). This produced cfdemo/build/*
artifacts that are specific to this ephemeral task library and have no value
in a future container -- worth discarding rather than keeping tracked.

Co-Authored-By: CoderFlow <ai@coderflow.ai>
Learn more: https://coderflow.ai
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant