Skip to main content

Admin Service

The Admin Service (/admin/) provides full CRUD operations for managing promotions, budgets, coupons, and master data via OData V4 with Fiori Elements support.

tip
Path is /admin/ — not /odata/v4/admin/

Some older integration notes reference /odata/v4/admin/Promotions. That path returns 404 — it does not exist. CAP services normally default to /odata/v4/<service>, but the DRE admin service intentionally mounts at /admin/ via the @path: '/admin' service annotation. Always use /admin/ as the base path.

Overview

PropertyValue
Base Path/admin/
ProtocolOData V4
AuthAdmin (full), PromotionManager (read), BudgetManager (budgets)
Draft SupportYes, for most entities

Promotions

GET    /admin/Promotions
POST /admin/Promotions
GET /admin/Promotions(<ID>)
PATCH /admin/Promotions(<ID>)
DELETE /admin/Promotions(<ID>)

Draft-enabled with custom actions:

ActionDescription
activate()Transition promotion to ACTIVE status
deactivate()Transition promotion to INACTIVE status
PropertyTargetDescription
posGroupsPromotionPosGroupsPOS group assignments
calculationConfigCalculationConfigsCalculation settings
campaignCampaignsOptional campaign grouping

Inverse Associations

Conditions and DiscountActions point back to a Promotion via their own promotion association — they are NOT exposed as forward navigation properties on Promotions. Query them via filter, e.g. GET /admin/Conditions?$filter=promotion_ID eq <ID> or GET /admin/DiscountActions?$filter=promotion_ID eq <ID>.

EntityDescription
ConditionsCondition definitions with virtual parameterSummary
ConditionValueListItemsValue list items for conditions
ConditionArticleListItemsArticle list items for conditions
PromotionPosGroupsPromotion-to-POS group junction

Articles

GET    /admin/Articles
POST /admin/Articles
GET /admin/Articles(<ID>)
PATCH /admin/Articles(<ID>)
DELETE /admin/Articles(<ID>)

Draft-enabled. Product master data (article number, EAN, manufacturer, category).

Article Groups

GET    /admin/ArticleGroups
POST /admin/ArticleGroups
GET /admin/ArticleGroups(<ID>)
PATCH /admin/ArticleGroups(<ID>)
DELETE /admin/ArticleGroups(<ID>)

Draft-enabled. Hierarchical article groupings for condition targeting.

POS Groups

GET    /admin/PosGroups
POST /admin/PosGroups
GET /admin/PosGroups(<ID>)
PATCH /admin/PosGroups(<ID>)
DELETE /admin/PosGroups(<ID>)

Draft-enabled. Store segmentation for targeted promotions.

Priority Groups

GET    /admin/PriorityGroups
POST /admin/PriorityGroups
GET /admin/PriorityGroups(<ID>)
PATCH /admin/PriorityGroups(<ID>)
DELETE /admin/PriorityGroups(<ID>)

Draft-enabled. Controls promotion execution ordering. Linked to promotions via PriorityGroupPromotions.

Mutual Exclusion Groups

GET    /admin/MutualExclusionGroups
POST /admin/MutualExclusionGroups
GET /admin/MutualExclusionGroups(<ID>)
PATCH /admin/MutualExclusionGroups(<ID>)
DELETE /admin/MutualExclusionGroups(<ID>)

Draft-enabled. Prevents conflicting promotions from being applied together.

Coupon Types

GET    /admin/CouponTypes
POST /admin/CouponTypes
GET /admin/CouponTypes(<ID>)
PATCH /admin/CouponTypes(<ID>)
DELETE /admin/CouponTypes(<ID>)

Draft-enabled with custom actions:

ActionParametersDescription
generateCodes(numberOfCodes)numberOfCodes: IntegerGenerate coupon codes
issueCoupon(customerId)customerId: StringIssue a personalized digital coupon
activate()--Activate coupon type
deactivate()--Deactivate coupon type
EntityOperationsDescription
CouponCodesRead onlyGenerated coupon codes (no direct insert/delete)
RedemptionLogsRead onlyCoupon redemption audit trail
CouponTypePromotionsCRUDJunction linking coupon types to promotions

Budgets

GET    /admin/Budgets
POST /admin/Budgets
GET /admin/Budgets(<ID>)
PATCH /admin/Budgets(<ID>)
DELETE /admin/Budgets(<ID>)

Draft-enabled. Virtual fields: statusCriticality, utilization (computed at runtime).

EntityOperationsDescription
BudgetPromotionsCRUDMany-to-many junction to promotions
BudgetNotificationsCRUDThreshold-based budget alerts
BudgetConsumptionsRead onlyBudget consumption audit trail

Stakeholders

GET    /admin/Stakeholders
POST /admin/Stakeholders
GET /admin/Stakeholders(<ID>)
PATCH /admin/Stakeholders(<ID>)
DELETE /admin/Stakeholders(<ID>)

Draft-enabled. Budget funding parties. Virtual field: totalShareAcrossBudgets.

EntityDescription
BudgetStakeholdersJunction with share percentages
StakeholderPromotions⚠️ DEPRECATED junction — kept for backward compatibility only; no active Fiori surface
RechargeContributionsBudget contribution tracking per stakeholder

Calculation Logs (Audit)

GET    /admin/CalculationLogs
GET /admin/CalculationLogs(<ID>)
GET /admin/CalculationLogs(<ID>)/items
GET /admin/CalculationLogs(<ID>)/promotions

Read-only audit trail for transaction confirmations. Includes per-item (CalculationLogItems) and per-promotion (CalculationLogPromotions) details.

Notification Logs

GET    /admin/NotificationLogs
GET /admin/NotificationLogs(<ID>)

Read-only audit trail for budget notification alerts.

Article Import Jobs

Scope: POS batch imports only

ArticleImportJobs / ArticleImportJobItems track imports submitted via POST /pos/articles/import-batch only. They do not track imports submitted via POST /api/v1/Articles:bulk-import. For PublicAPI bulk imports, use ImportJobs + ImportJobErrors via the Public API.

These entities are deprecated for new integrations. A @deprecated annotation will be added to the Public API projection. The Admin Service view remains available for the Fiori monitoring UI (no Fiori UI change planned).

GET    /admin/ArticleImportJobs
GET /admin/ArticleImportJobs(<ID>)
GET /admin/ArticleImportJobs(<ID>)/items

Read-only. Monitors POS batch article imports triggered via POST /pos/articles/import-batch. ArticleImportJobItems provides per-article results. statusCriticality and failedCriticality virtual fields enable color-coded status display in Fiori.

Code List Entities (Read-Only)

Enum lookup tables used by Fiori Elements for dropdown values:

EntityValues
PromotionStatusesDRAFT, ACTIVE, INACTIVE, EXPIRED, ARCHIVED, PENDING_APPROVAL, APPROVED, REJECTED, PILOT
PromotionTypesARTICLE, RECEIPT, LOYALTY, BUNDLE, COUPON
ExclusivityLevelsNONE, PROMOTION, GROUP, GLOBAL
DiscountTypesPERCENTAGE, ABSOLUTE, UNIT_PRICE
ApplicationQuantityModesALL, LIMITED, CHEAPEST, MOST_EXPENSIVE
CalculationModesADDITIVE, MULTIPLICATIVE
RoundingModesROUND_HALF_UP, ROUND_DOWN, ROUND_UP, NONE
SelectionTypesALL, CHEAPEST, MOST_EXPENSIVE, RANDOM
ArticleSourcesMANUAL, IMPORTED
GroupTypesBRAND, CATEGORY, CUSTOM
LogicalConnectorsAND, OR, NOT
ComparisonOperatorsEQUALS, CONTAINS, STARTS_WITH, GREATER_THAN, LESS_THAN, BETWEEN, GTE, LTE
ConditionTypesARTICLE, ARTICLE_GROUP, ARTICLE_LIST, CUSTOMER_GROUP, RECEIPT_AMOUNT, ITEM_QUANTITY, PAYMENT_MEANS, PAYMENT_CARD, CUSTOMER, MANUFACTURER, ADDITIONAL_FIELD, CREDIT_CARD_BIN, USER_DEFINED, LOYALTY_ACCOUNT, MANUAL_DISCOUNT, CHANNEL, TIME_WINDOW, TIME_PERIOD
ConditionValueCategoriesARTICLE_NUMBER, ARTICLE_GROUP_ID, CUSTOMER_GROUP_ID, CARD_TYPE, BIN_PREFIX, LOYALTY_TIER, REASON_CODE, PAYMENT_MEANS, CUSTOMER_ID, MANUFACTURER_ID, CHANNEL
ActionTypesARTICLE, ARTICLE_GROUP, ARTICLE_LIST, RECEIPT, SCALED_RECEIPT, BUNDLE, POST_PURCHASE_COUPON, LOYALTY, QUANTITY_TIER, FREE_ITEM
DistributionModesPROPORTIONAL, EQUAL, HIGHEST_FIRST
ExclusionTypesARTICLE, ARTICLE_GROUP, ARTICLE_LIST, MANUFACTURER
ResolutionStrategiesHIGHEST_DISCOUNT, LOWEST_DISCOUNT
BudgetStatusesDRAFT, SCHEDULED, ACTIVE, EXHAUSTED, EXPIRED
CouponCodeTypesGENERIC, INDIVIDUAL
CouponStatusesACTIVE, INACTIVE
CouponCodeStatusesCREATED, ACTIVE, RESERVED, REDEEMED, EXPIRED, CANCELLED
StakeholderTypesSUPPLIER, BRAND, INTERNAL, EXTERNAL_SUPPLIER
CalculationLogStatusesCALCULATED, FAILED
LoyaltyActionTypesADD_FIXED, MULTIPLY_POINTS, CURRENCY_TO_POINTS, SUBTRACT_POINTS
LoyaltyTargetScopesARTICLE, ARTICLE_GROUP, ARTICLE_LIST, ALL_ITEMS

Authorization

RoleAccess
AdminFull CRUD on all entities
PromotionManagerRead access to all entities
BudgetManagerRead + Update on Budgets and related entities

Draft Editing

Most entities support OData draft editing:

  • POST /admin/Promotions with IsActiveEntity: false to create a draft
  • PATCH /admin/Promotions(ID=<id>,IsActiveEntity=false) to edit a draft
  • POST /admin/Promotions(ID=<id>,IsActiveEntity=false)/draftActivate to activate
  • POST /admin/Promotions(ID=<id>,IsActiveEntity=true)/draftEdit to edit an active entity