Sync current sources: clean RAP handover names, app rebind, tooling

Working-tree state as of 2026-09-29, uncommitted since the initial
"upload current sources" commit:

- docs/handover/rap/: renamed the 11 generator-suffixed sources
  (zz*000) to the clean object names built on the tenant, plus the
  A2X leg and parameter-entity edits.
- app/: manifest, annotations, i18n, mock data and local/mock ui5
  configs updated to the live service shape.
- PRD.md, CHANGELOG.md, KNOWLEDGE.md: build record through
  2026-09-19, including the rejected reentrance-ticket path.
- tools/adt-reentrance-login/: retained login helper (new).
- docs/v2/zui_arena_change_appr_o4.metadata.xml: captured live
  $metadata (new).
- Dropped a stray 0.3GB-class Eclipse installer that the initial
  commit had tracked under a URL-mangled filename, and the
  machine-specific 0M7DEJI.code-workspace.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-29 10:22:52 -07:00
co-authored by Claude Opus 5
parent f8b45ea4a5
commit 468729eb4e
42 changed files with 4597 additions and 1680 deletions
+41 -24
View File
@@ -17,42 +17,55 @@
|**Add Eslint configuration**<br>True, see https://www.npmjs.com/package/@sap-ux/eslint-plugin-fiori-tools#rules for the eslint rules.|
|**Main Entity**<br>ChangeApprovals|
## Service binding (provisional)
## Service binding (live, reconciled 2026-09-16 - PRD V-2)
The app binds to the RAP **UI** service binding, not the A2X binding the worker uses.
The single source of truth for the service identity is the header comment of
`webapp/localService/mainService/metadata.xml`:
The single source of truth for the service identity is the live `$metadata` of the published
binding, captured 2026-09-16 as `docs/v2/zui_arena_change_appr_o4.metadata.xml` (repo root).
`webapp/localService/mainService/metadata.xml` is a **byte-identical copy** of it, so the mock
server serves the real contract. Refresh both together; never hand-edit the copy.
| Item | Value |
|---|---|
| Service binding (OData V4 - UI) | `ZUI_ARENA_CHANGE_APPROVAL_O4` |
| Service binding (OData V4 - UI) | `ZUI_ARENA_CHANGE_APPR_O4` |
| Service definition | `ZUI_ARENA_CHANGE_APPROVAL` |
| Service URL | `/sap/opu/odata4/sap/zui_arena_change_approval_o4/srvd/sap/zui_arena_change_approval/0001/` |
| Schema namespace / alias | `com.sap.gateway.srvd.zui_arena_change_approval_o4.v0001` / `SAP__self` |
| Entity type / entity set | `ChangeApproval_Type` / `ChangeApproval` |
| Service URL | `/sap/opu/odata4/sap/zui_arena_change_appr_o4/srvd/sap/zui_arena_change_approval/0001/` |
| Schema namespace / alias | `com.sap.gateway.srvd.zui_arena_change_approval.v0001` / `SAP__self` |
| Entity type / entity set | `ChangeApprovalType` / `ChangeApproval` |
| Bound actions | `approve`, `reject(RejectReason)`, `retrySync` |
The first URL segment and the schema namespace are derived from the service **binding** name,
the segment after `srvd/sap/` from the service **definition** name - strongly indicated by the
tenant's `/sap/opu/odata4/sap/api_currencyexchangerate/srvd_a2x/sap/currencyexchangerate/0001`
(namespace `com.sap.gateway.srvd_a2x.api_currencyexchangerate.v0001`) and SAP Help's
`/sap/opu/odata4/sap/api_product/srvd_a2x/sap/product/0002`
[source: sap-docs sap-help loio 5f45f125dfe84c20beb18f5de1512f5a, verified 2026-09-14].
Only the first URL segment comes from the service **binding** name. The schema namespace comes
from the service **definition** name, and the entity type carries a `Type` suffix without an
underscore (live `$metadata`, 2026-09-16; see `KNOWLEDGE.md`). The pre-V-2 assumption of a
binding-derived namespace and a `_Type` suffix was wrong.
`webapp/manifest.json` (`sap.app.dataSources.mainService.uri`, routing) and
`webapp/annotations/annotation.xml` (`edmx:Reference`, every `Annotations Target`, every
`DataFieldForAction.Action`) must stay in sync with it. JSON cannot carry comments, so the
manifest references this note instead.
`webapp/manifest.json` (`sap.app.dataSources.mainService.uri`), `ui5-mock.yaml` /
`ui5-local.yaml` (`sap-fe-mockserver` `urlPath`) and `webapp/annotations/annotation.xml`
(`edmx:Reference`, every `Annotations Target`, every `DataFieldForAction.Action`) must stay in
sync with it. JSON cannot carry comments, so the manifest references this note instead.
**Provisional - namespace = binding name is strongly indicated, not proven; reconcile namespace,
entity type suffix and URL segments against the live `$metadata` of the RAP UI service binding
at PRD V-2 before deploy.**
**Annotation layering.** The backend metadata extension already emits most UI annotations
(LineItem, HeaderInfo, Facets, FieldGroups, Identification, SelectionFields, SemanticKey,
`Status` text with `TextOnly`). An annotation in `annotation.xml` replaces the backend annotation
with the same term + qualifier on the same target, and deleting it there makes the backend one
effective again [source: fiori-mcp-server "Visualizing and Managing Annotations with SAP Fiori
Tools - Service Modeler", verified 2026-09-16].
**Backend for a non-mock run: not configured.** `ui5.yaml` and `ui5-local.yaml` carry
`fiori-tools-proxy` with `backend: []`, and `npm start` is a generator placeholder. When a live
preview is added, the backend is the **UI host** `https://my431353.s4hana.cloud.sap`, never the
`-api` host: a business-user call there is blocked by UCON (live 2026-09-16, `KNOWLEDGE.md`).
## Status model and actions
`Status`: `PENDING -> APPROVED -> EXECUTING -> SYNCED | FAILED`; `REJECTED` is terminal;
`FAILED -> retrySync -> EXECUTING`. `approve`/`reject` are enabled only for `PENDING`,
`retrySync` only for `FAILED` (mocked via `IsApprovable` / `IsRetriable`, which stand in for the
`Core.OperationAvailable` RAP emits for `( features : instance )` actions - PRD RAP-1).
`FAILED -> retrySync -> APPROVED`. `approve`/`reject` are enabled only for `PENDING`,
`retrySync` only for `FAILED`. The backend owns enablement: RAP emits
`Core.OperationAvailable Path="_it/__OperationControl/<action>"` for the `( features : instance )`
actions (PRD RAP-1), and the app keeps no local `OperationAvailable`, which would replace it
[source: fiori-mcp-server "Action Control for Context-Dependent Actions (SAP Fiori Elements)",
verified 2026-09-16]. `IsApprovable` / `IsRetriable` are still in the service but hidden, and
nothing in the app binds to them.
Actions are offered on the object page header only; the list report table is display-only
(`selectionMode: "None"`).
@@ -68,7 +81,11 @@ required for a custom app (only `archeType` is mandatory)
Dev server: `npm run start-mock` / `npm run int-test` bind to port **8082** (8080 is taken on
the dev host). Mock data lives in `webapp/localService/mainService/data/ChangeApproval.json`
(`generateMockData: false`), 8 rows covering every status.
(`generateMockData: false`), 8 rows covering every status. Each row carries every live property:
`StatusText` / `StatusCriticality` as `ZR_CHANGEAPPROVAL` computes them, `__OperationControl`
consistent with the status, `LocalLastChangedAt`, and `SAP__Messages: []`. Initial CHAR values are
`""`, not `null`, on `Nullable="false"` properties. The mock server does not execute bound
actions (see `KNOWLEDGE.md`), so status transitions show only against the live service.
## app