// TARGET OBJECT : behavior definition ZZR_CHANGEAPPROVAL000 (base BDEF, managed; generated 2026-09-15) // abap: URI : abap:/repotree-v1/0M7DEJI/System%20Library/ZLOCAL/ZARENA_PLM/Core%20Data%20Services/Behavior%20Definitions/ZZR_CHANGEAPPROVAL000/zzr_changeapproval000.bdef.json // ACTION : replace entire content, then activate (after the three ZD_* abstract entities and ZZR_CHANGEAPPROVAL000). // 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] // 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 zzbp_r_changeapproval000 unique; strict ( 2 ); define behavior for ZZR_CHANGEAPPROVAL000 alias ChangeApproval persistent table zzchngpproval000 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 -> EXECUTING (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; } mapping for zzchngpproval000 { 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; } }