Files
arena-plm-fiori/docs/handover/rap/zr_changeapproval.bdef.asbdef
alexzandClaude Opus 5 468729eb4e 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>
2026-09-29 10:22:52 -07:00

92 lines
6.1 KiB
Plaintext

// TARGET OBJECT : behavior definition ZR_CHANGEAPPROVAL (base BDEF, managed) - README step U6, UI leg
// abap: URI : abap:/repotree-v1/0M7DEJI/System%20Library/ZLOCAL/ZARENA_PLM/Core%20Data%20Services/Behavior%20Definitions/ZR_CHANGEAPPROVAL/zr_changeapproval.bdef.json
// ACTION : create via ADT MCP (objectType BDEF/BDO, implementationType Managed, README U6) once the view
// ZR_CHANGEAPPROVAL is active, replace entire content, save, then activate BEFORE the behavior pool
// class exists. SAP's RAP exercise activates the BDEF first and only then creates the behavior
// implementation class [source: abap-docs /abap-platform-rap-opensap/week4/unit3#step-3-create-and-implement-the-behavior-implementation-bil-class-for-the-travel-entity,
// verified 2026-09-16]. The three ZD_* abstract entities (U2-U4) must be active. That exercise is an
// unmanaged, non-strict BDEF, so if activation refuses because class ZBP_R_CHANGEAPPROVAL does not exist
// (an error, not a warning), create the class (README U7), paste it, and activate BDEF + class in one call.
// Sources (all verified 2026-09-15):
// action syntax incl. ( features : instance ), parameter, result [1] $self
// [abap-docs /abap-docs-cloud/ABENBDL_ACTION, ABENBDL_ACTIONS_FC, ABENBDL_ACTION_INPUT_PARAM, ABENBDL_ACTION2_ABEXA]
// internal operations (usable only from the behavior pool) [abap-docs /abap-docs-cloud/ABENBDL_INTERNAL]
// field ( readonly, numbering : managed ) for a UUID key [abap-docs /abap-docs-cloud/ABENBDL_FIELD_NUMBERING; /abap-fiori-showcase/01_general_features#readonly]
// field ( readonly : update, mandatory : create ) combination [abap-docs /abap-fiori-showcase/06_object_page_content (StreamIsReadOnly)]
// determination on modify { create; } sets the initial status [abap-docs /abap-docs-cloud/ABENBDL_DETERMINATIONS (setStatustoNew)]
// readonly fields written by determinations/actions IN LOCAL MODE [same source: field ( readonly ) AmountSum + TotalPrice determination]
// etag master [abap-docs /abap-docs-cloud/ABENBDL_ETAG]; explicit mapping because CDS aliases differ from table fields [abap-docs /abap-docs-cloud/ABENBDL_TYPE_MAPPING]
// authorization master ( none ): "no authorization checks for the entire RAP BO" - access is governed exclusively by the
// IAM app / business catalog (ADR-002, ARN-007) and read access by DCL [abap-docs /abap-docs-cloud/ABENBDL_AUTHORIZATION].
// NOT FINAL: ( none ) vs global authorization is open question PRD OQ-8, decided before business roles are assigned.
// Sources (verified 2026-09-16):
// validation ValName on save { create; } - invoked in the save sequence; a failing validation rejects the complete
// transactional buffer of the RAP transaction; EML MODIFY is not allowed in a validation
// [abap-docs /abap-docs-cloud/ABENBDL_VALIDATIONS]
// State machine (PRD ARN-002, M1 decision 2026-09-16):
// create -> PENDING; approve: PENDING -> APPROVED; reject: PENDING -> REJECTED (terminal);
// markExecuting: APPROVED -> EXECUTING; markSynced: EXECUTING -> SYNCED (terminal); markFailed: EXECUTING -> FAILED;
// retrySync: FAILED -> APPROVED (the worker re-claims it through markExecuting). Only markExecuting writes EXECUTING.
// Open point (falsifiable at activation): StatusText/StatusCriticality/IsApprovable/IsRetriable are CDS-calculated and
// deliberately absent from the mapping. ABENBDL_TYPE_MAPPING only requires a mapping where table and entity field
// NAMES differ; it is silent on calculated elements. If activation reports an error (not a warning) for the unmapped
// elements, fall back to persisting them (add the four columns to the table + mapping) and maintain them in the actions.
managed implementation in class zbp_r_changeapproval unique;
strict ( 2 );
define behavior for ZR_CHANGEAPPROVAL alias ChangeApproval
persistent table zchangeapproval
lock master
authorization master ( none )
etag master LocalLastChangedAt
{
create;
internal update;
field ( readonly, numbering : managed ) ID;
field ( readonly : update, mandatory : create ) ItemNumber, ChangeType, ArenaEcoId;
field ( mandatory : create ) SapPreview;
field ( readonly ) Status, StatusText, StatusCriticality, IsApprovable, IsRetriable,
RequestedBy, RequestedOn, DecidedBy, DecidedOn,
SapChangeNumber, ErrorMessage, RejectReason,
CreatedBy, CreatedAt, LastChangedBy, LastChangedAt, LocalLastChangedAt;
// Business-user actions (UI projection): PENDING -> APPROVED | REJECTED, FAILED -> APPROVED (PRD RAP-1/RAP-2)
action ( features : instance ) approve result [1] $self;
action ( features : instance ) reject parameter ZD_CHANGEAPPROVAL_REJECTP result [1] $self;
action ( features : instance ) retrySync result [1] $self;
// Worker actions (A2X projection): APPROVED -> EXECUTING -> SYNCED | FAILED (PRD RAP-6)
action ( features : instance ) markExecuting result [1] $self;
action ( features : instance ) markSynced parameter ZD_CHANGEAPPROVAL_SYNCEDP result [1] $self;
action ( features : instance ) markFailed parameter ZD_CHANGEAPPROVAL_FAILEDP result [1] $self;
determination setInitialStatus on modify { create; }
// Semantic key ItemNumber + ChangeType + ArenaEcoId (PRD RAP-8) is unique among non-REJECTED records
validation checkDuplicate on save { create; }
mapping for zchangeapproval
{
ID = id;
ItemNumber = item_number;
ItemName = item_name;
ChangeType = change_type;
ArenaEcoId = arena_eco_id;
Status = status;
RequestedBy = requested_by;
RequestedOn = requested_on;
DecidedBy = decided_by;
DecidedOn = decided_on;
SapChangeNumber = sap_change_number;
ErrorMessage = error_message;
RejectReason = reject_reason;
SapPreview = sap_preview;
CreatedBy = created_by;
CreatedAt = created_at;
LastChangedBy = last_changed_by;
LastChangedAt = last_changed_at;
LocalLastChangedAt = local_last_changed_at;
}
}