diff --git a/.changeset/tidy-things-hope.md b/.changeset/tidy-things-hope.md new file mode 100644 index 00000000000..3aefc7e8029 --- /dev/null +++ b/.changeset/tidy-things-hope.md @@ -0,0 +1,5 @@ +--- +'@sap-ux/generator-odata-downloader': minor +--- + +Adds recurisive hierarchy support diff --git a/packages/generator-odata-downloader/package.json b/packages/generator-odata-downloader/package.json index 8181af0a6c5..135014b20d3 100644 --- a/packages/generator-odata-downloader/package.json +++ b/packages/generator-odata-downloader/package.json @@ -39,9 +39,9 @@ "prebuilds", "yeoman.png" ], - "dependencies": {}, - "devDependencies": { - "@sap-devx/yeoman-ui-types": "1.23.0", + "devDependencies": {}, + "dependencies": { + "@sap-devx/yeoman-ui-types": "1.22.0", "@sap-ux/annotation-converter": "0.10.21", "@sap-ux/axios-extension": "workspace:*", "@sap-ux/btp-utils": "workspace:*", @@ -59,12 +59,12 @@ "@sap-ux/vocabularies-types": "0.15.0", "@sap/ux-specification": "1.144.0", "@types/inquirer": "8.2.6", - "@types/yeoman-generator": "5.2.14", + "@types/yeoman-generator": "5.2.11", "@vscode-logging/logger": "2.0.8", "deepmerge": "4.3.1", - "i18next": "25.10.10", + "i18next": "25.8.18", "inquirer": "8.2.7", - "odata-query": "8.0.7", + "odata-query": "8.0.5", "os-name": "4.0.1", "prettify-xml": "1.2.0", "rimraf": "6.1.3", @@ -73,4 +73,4 @@ "engines": { "node": ">=20.x" } -} \ No newline at end of file +} diff --git a/packages/generator-odata-downloader/src/data-download/odata-download-generator.ts b/packages/generator-odata-downloader/src/data-download/odata-download-generator.ts index 1ab16632e3c..b63c1d30644 100644 --- a/packages/generator-odata-downloader/src/data-download/odata-download-generator.ts +++ b/packages/generator-odata-downloader/src/data-download/odata-download-generator.ts @@ -22,7 +22,7 @@ import { initI18nODataDownloadGenerator, t } from '../utils/i18n'; import type { EntitySetsFlat } from './odata-query'; import { getODataDownloaderPrompts, promptNames } from './prompts/prompts'; import { type ReferencedEntities } from './types'; -import { createEntitySetData } from './utils'; +import { buildReferentialConstraintFileContent, createEntitySetData } from './utils'; import { getValueHelpSelectionPrompt } from './prompts/value-help-prompts'; import type { MockserverConfig, MockserverService } from '@sap-ux/ui5-config'; import { @@ -133,6 +133,13 @@ export class ODataDownloadGenerator extends Generator { this.prompts.setCallback(fn); } }; + + if (typeof opts.appWizard?.setHeaderTitle === 'function') { + opts.appWizard.setHeaderTitle( + t('texts.generatorTitle'), + `${this.rootGeneratorName()}@${this.rootGeneratorVersion()}` + ); + } } /** @@ -226,7 +233,8 @@ export class ODataDownloadGenerator extends Generator { const entityFileData = createEntitySetData( this.state.entityOData, this.state.entityPropertyToEntitySet, - this.state.appEntities.listEntity.entitySetName + this.state.appEntities.listEntity.entitySetName, + this.state.appEntities.hierarchyEntities ); ODataDownloadGenerator.logger.info( t('info.entityFilesToBeGenerated', { entities: Object.keys(entityFileData).join(', ') }) @@ -238,6 +246,31 @@ export class ODataDownloadGenerator extends Generator { // Writes relative to destination root path this.writeDestinationJSON(join(this.state.mockDataRootPath!, `${entityName}.json`), entityData); }); + + // Write mock server .js constraint files for hierarchy entities whose parent nav prop + // has no referentialConstraint in metadata — only for entity sets actually written, + // and only if the .js file does not already exist + this.state.appEntities.hierarchyEntities + ?.filter( + (h) => + h.missingReferentialConstraints && dataFiles.some(([name]) => name === h.entitySetName) + ) + ?.forEach((h) => { + const jsFilePath = join(this.state.mockDataRootPath!, `${h.entitySetName}.js`); + if (!this.fs.exists(jsFilePath)) { + const { navPropName, constraints } = h.missingReferentialConstraints!; + const content = buildReferentialConstraintFileContent(navPropName, constraints); + this.writeDestination(jsFilePath, content); + ODataDownloadGenerator.logger.info( + `Written referential constraint file: ${h.entitySetName}.js` + ); + } else { + ODataDownloadGenerator.logger.debug( + `Skipping referential constraint file for '${h.entitySetName}' — already exists` + ); + } + }); + // eslint-disable-next-line @typescript-eslint/no-floating-promises TelemetryHelper.sendTelemetry('ODATA_DOWNLOADER_WRITE_DATA_FILES_END', { 'writeFileDuration': `${Date.now() - writeStartTime} ms`, diff --git a/packages/generator-odata-downloader/src/data-download/odata-query.ts b/packages/generator-odata-downloader/src/data-download/odata-query.ts index 194dea1508d..96e8d1cbbfb 100644 --- a/packages/generator-odata-downloader/src/data-download/odata-query.ts +++ b/packages/generator-odata-downloader/src/data-download/odata-query.ts @@ -3,11 +3,14 @@ import buildQuery, { type Filter } from 'odata-query'; import { t } from '../utils/i18n'; import { ODataDownloadGenerator } from './odata-download-generator'; import { type SelectedEntityAnswer } from './prompts/prompts'; -import type { ReferencedEntities } from './types'; +import type { ReferencedEntities, HierarchyEntity } from './types'; export type EntitySetsFlat = { [entityPath: string]: string }; type ExpandTree = { expand?: Record }; +/** Default number of hierarchy levels to fetch in a descendants query. */ +const defaultHierarchyLevels = 3; + /** * Builds the expands object used to create an odata query. * @@ -49,12 +52,14 @@ export function getExpands(entityPaths: { entityPath: string; entitySetName: str * @param listEntity - The list entity to query from * @param selectedEntities - The selected entities to include in the query * @param top - The maximum number of records to return + * @param hierarchyEntity * @returns The generated query string */ export function createQueryFromEntities( listEntity: ReferencedEntities['listEntity'], selectedEntities: SelectedEntityAnswer[], - top = 1 + top = 1, + hierarchyEntity?: HierarchyEntity ): { query: string } { const selectedPaths = selectedEntities?.map((entity) => { return { entityPath: entity.fullPath, entitySetName: entity.entity.entitySetName }; @@ -74,13 +79,62 @@ export function createQueryFromEntities( ODataDownloadGenerator.logger.info(t('info.entityFilesToBeGenerated', { entities: entitySetNames.join(', ') })); const mainEntity = listEntity; + + // Hierarchy entities use a descendants query instead of top/filter + if (hierarchyEntity) { + // Build filter from semantic key values + const filterParts: string[] = []; + mainEntity.semanticKeys.forEach((key) => { + if (key.value !== undefined && key.value !== '') { + if (key.type === 'Edm.Boolean') { + filterParts.push(`${key.name} eq ${key.value}`); + } else { + const values = String(key.value).split(','); + const isGuid = ['Edm.UUID', 'Edm.Guid'].includes(key.type); + const wrap = (v: string): string => (isGuid ? v.trim() : `'${v.trim()}'`); + if (values.length === 1) { + filterParts.push(`${key.name} eq ${wrap(values[0])}`); + } else { + const orParts = values.map((v) => `${key.name} eq ${wrap(v)}`); + filterParts.push(`(${orParts.join(' or ')})`); + } + } + } + }); + const filterParam = filterParts.length > 0 ? `,filter(${filterParts.join(' and ')})` : ''; + + const hierarchyArgs = `$root/${mainEntity.entitySetName},${hierarchyEntity.qualifier},${hierarchyEntity.nodeProperty}`; + const topLevelsPart = `com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/${mainEntity.entitySetName},HierarchyQualifier='${hierarchyEntity.qualifier}',NodeProperty='${hierarchyEntity.nodeProperty}',Levels=${defaultHierarchyLevels})`; + + // Draft-enabled hierarchies require an ancestors() wrapper to scope to active entities + const applyPart = hierarchyEntity.isDraft + ? `$apply=ancestors(${hierarchyArgs}${filterParam},keep start)/${topLevelsPart}` + : `$apply=${topLevelsPart}`; + + const expandQuery = entitiesToExpand ? buildQuery(entitiesToExpand) : ''; + const expandPart = expandQuery ? `&${expandQuery.substring(1)}` : ''; + const query = `${mainEntity.entitySetName}?${applyPart}${expandPart}`; + ODataDownloadGenerator.logger.debug(`Query for odata: ${query}`); + return { query }; + } + const mainEntityFilters: Filter[] = []; mainEntity.semanticKeys.forEach((key) => { // Process ranges and/or comma seperated values - if (key.value) { - if (key.type === 'Edm.String') { + if (key.value !== undefined && key.value !== '') { + if (['Edm.UUID', 'Edm.Guid'].includes(key.type)) { + const filterParts = String(key.value).split(','); + const filters: Filter[] = filterParts.map((part) => ({ + [key.name]: { type: 'guid' as const, value: part.trim() } + })); + mainEntityFilters.push(filters.length === 1 ? filters[0] : { or: filters }); + } else if (key.type === 'Edm.Boolean') { + mainEntityFilters.push({ + [key.name]: String(key.value) === 'true' + }); + } else if (key.type === 'Edm.String') { // Create the range and set values - const filterParts = key.value.split(','); + const filterParts = String(key.value).split(','); const filters: Filter[] = []; filterParts.forEach((filterPart) => { const filterRangeParts = filterPart.trim().split('-'); @@ -137,6 +191,66 @@ export function createQueryFromEntities( ODataDownloadGenerator.logger.debug(`Query for odata: ${query}`); return { query }; } +/** + * Builds a nav-key-rooted TopLevels query for a nav-prop that has a hierarchy annotation. + * e.g. PPS_PurchaseOrder(PurchaseOrder='4500003676',DraftUUID=...,IsActiveEntity=true)/_PurchaseOrderItem + * ?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/...,...) + * + * @param listEntity - The parent/list entity (provides entity set name and key values) + * @param navPropName - The navigation property name connecting parent to child + * @param hierarchyEntity - The hierarchy descriptor for the nav-prop entity + * @returns The query string, or undefined if no semantic key values are available + */ +export function buildNavPropHierarchyQuery( + listEntity: ReferencedEntities['listEntity'], + navPropName: string, + hierarchyEntity: HierarchyEntity +): string | undefined { + const draftKeyNames = new Set(['DraftUUID', 'IsActiveEntity']); + + // Build key segment: use keyName (actual entity key) if set, else name (semantic key = actual key) + const keyParts: string[] = []; + for (const key of listEntity.semanticKeys) { + if (key.value === undefined || key.value === '' || draftKeyNames.has(key.name)) { + continue; + } + const actualKeyName = key.keyName ?? key.name; + const firstValue = String(key.value).split(',')[0].trim(); + const isGuid = ['Edm.UUID', 'Edm.Guid'].includes(key.type); + const isBoolean = key.type === 'Edm.Boolean'; + keyParts.push(`${actualKeyName}=${isGuid || isBoolean ? firstValue : `'${firstValue}'`}`); + } + + if (keyParts.length === 0) { + ODataDownloadGenerator.logger.debug( + `buildNavPropHierarchyQuery: no key values available for '${listEntity.entitySetName}', skipping nav-prop hierarchy query for '${navPropName}'` + ); + return undefined; + } + + // Draft entities: append fixed active-read values for whichever draft keys are present + const draftFixedValues: Record = { + DraftUUID: '00000000-0000-0000-0000-000000000000', + IsActiveEntity: 'true' + }; + listEntity.entityType?.keys + ?.filter((k) => k.name in draftFixedValues) + .forEach((k) => keyParts.push(`${k.name}=${draftFixedValues[k.name]}`)); + + ODataDownloadGenerator.logger.debug( + `buildNavPropHierarchyQuery: key segment for '${listEntity.entitySetName}': (${keyParts.join(',')})` + ); + + const keySegment = `${listEntity.entitySetName}(${keyParts.join(',')})`; + const navPath = `${keySegment}/${navPropName}`; + const hierarchyNodesRef = `$root/${navPath}`; + + const topLevelsPart = `com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=${hierarchyNodesRef},HierarchyQualifier='${hierarchyEntity.qualifier}',NodeProperty='${hierarchyEntity.nodeProperty}',Levels=${defaultHierarchyLevels})`; + const query = `${navPath}?$apply=${topLevelsPart}`; + ODataDownloadGenerator.logger.debug(`Nav-prop hierarchy query: ${query}`); + return query; +} + /** * Builds an odata query and fetches the data from a backend. * @@ -144,19 +258,75 @@ export function createQueryFromEntities( * @param odataService - The OData service to use for fetching * @param selectedEntities - The selected entities to include in the query * @param top - The maximum number of records to return + * @param hierarchyEntity - Hierarchy entity when the list entity itself is a hierarchy root + * @param navPropHierarchyEntities - Hierarchy entities for selected nav-props (not the list entity) * @returns The fetched OData result */ export async function fetchData( listEntity: ReferencedEntities['listEntity'], odataService: ODataService, selectedEntities: SelectedEntityAnswer[], - top?: number + top?: number, + hierarchyEntity?: HierarchyEntity, + navPropHierarchyEntities: HierarchyEntity[] = [] ): Promise<{ odataResult: { entityData?: []; error?: string } }> { - const query = createQueryFromEntities(listEntity, selectedEntities, top); + const query = createQueryFromEntities(listEntity, selectedEntities, top, hierarchyEntity); const odataResult = await executeQuery(odataService, query.query); - return { - odataResult - }; + + // Issue additional nav-key-rooted TopLevels queries for nav-prop hierarchy entities + for (const navHierarchy of navPropHierarchyEntities) { + const matchingEntity = selectedEntities.find((s) => s.entity.entitySetName === navHierarchy.entitySetName); + if (!matchingEntity) { + ODataDownloadGenerator.logger.debug( + `fetchData: no selected entity matched hierarchy entity '${navHierarchy.entitySetName}', skipping` + ); + continue; + } + const navQuery = buildNavPropHierarchyQuery(listEntity, matchingEntity.entity.entityPath, navHierarchy); + if (!navQuery) { + ODataDownloadGenerator.logger.debug( + `fetchData: could not build nav-prop hierarchy query for '${navHierarchy.entitySetName}', skipping` + ); + continue; + } + const navResult = await executeQuery(odataService, navQuery); + if (!navResult.entityData || !odataResult.entityData) { + ODataDownloadGenerator.logger.debug( + `fetchData: no data returned for nav-prop hierarchy query '${navHierarchy.entitySetName}', skipping merge` + ); + continue; + } + + ODataDownloadGenerator.logger.debug( + `fetchData: merging ${navResult.entityData.length} hierarchy records into '${matchingEntity.entity.entityPath}' expanded items` + ); + + // Patch hierarchy properties in-place onto matching expanded nav-prop records + const navPropName = matchingEntity.entity.entityPath; + const hierPropName = navHierarchy.nodeProperty.split('/')[0]; + const navResultData = navResult.entityData as Record[]; + let patchCount = 0; + + for (const rootRecord of odataResult.entityData as Record[]) { + const expandedItems = rootRecord[navPropName]; + if (!Array.isArray(expandedItems)) { + continue; + } + for (const item of expandedItems as Record[]) { + const match = navResultData.find((h) => navHierarchy.entityTypeKeys.every((k) => h[k] === item[k])); + if (match) { + item[hierPropName] = match[hierPropName]; + patchCount++; + } + } + } + + ODataDownloadGenerator.logger.debug( + `fetchData: patched '${hierPropName}' onto ${patchCount} expanded '${navPropName}' records` + ); + } + + return { odataResult }; } /** diff --git a/packages/generator-odata-downloader/src/data-download/prompts/prompt-helpers.ts b/packages/generator-odata-downloader/src/data-download/prompts/prompt-helpers.ts index a432e05637e..c62b2736607 100644 --- a/packages/generator-odata-downloader/src/data-download/prompts/prompt-helpers.ts +++ b/packages/generator-odata-downloader/src/data-download/prompts/prompt-helpers.ts @@ -1,24 +1,24 @@ import type { ODataService } from '@sap-ux/axios-extension'; import { isAppStudio } from '@sap-ux/btp-utils'; import type { OdataServiceAnswers } from '@sap-ux/odata-service-inquirer'; -import type { ServiceSpecification, ApplicationAccess } from '@sap-ux/project-access'; +import type { ApplicationAccess, ServiceSpecification } from '@sap-ux/project-access'; import { FileName, getSpecificationModuleFromCache } from '@sap-ux/project-access'; import { UI5Config } from '@sap-ux/ui5-config'; import type { EntityType } from '@sap-ux/vocabularies-types'; import type { CollectionFacet } from '@sap-ux/vocabularies-types/vocabularies/UI'; import { UIAnnotationTypes } from '@sap-ux/vocabularies-types/vocabularies/UI'; -import { readFile } from 'node:fs/promises'; +import type { Specification } from '@sap/ux-specification/dist/types/src'; import type { CheckboxChoiceOptions } from 'inquirer'; +import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; +import { TelemetryHelper } from '../../telemetry'; import { t } from '../../utils/i18n'; -import { fetchData, type EntitySetsFlat } from '../odata-query'; import { ODataDownloadGenerator } from '../odata-download-generator'; -import type { SelectedEntityAnswer } from './prompts'; +import { fetchData, type EntitySetsFlat } from '../odata-query'; +import { PromptState } from '../prompt-state'; import type { AppConfig, Entity } from '../types'; import { getSystemNameFromStore } from '../utils'; -import { PromptState } from '../prompt-state'; -import type { Specification } from '@sap/ux-specification/dist/types/src'; -import { TelemetryHelper } from '../../telemetry'; +import type { SelectedEntityAnswer } from './prompts'; /** * Fetches OData from the backend service. @@ -44,11 +44,24 @@ export async function getData( const queryStartTime = Date.now(); // eslint-disable-next-line @typescript-eslint/no-floating-promises TelemetryHelper.sendTelemetry('ODATA_DOWNLOAD_SEND_QUERY', { 'time': Date() }); + // Use TopLevels query when the list entity is itself a hierarchy root + const hierarchyEntity = appConfig.referencedEntities.hierarchyEntities?.find( + (h) => h.entitySetName === appConfig.referencedEntities!.listEntity.entitySetName + ); + // Detect hierarchy entities for selected nav-props (not the list entity itself) + const navPropHierarchyEntities = + appConfig.referencedEntities.hierarchyEntities?.filter( + (h) => + h.entitySetName !== appConfig.referencedEntities!.listEntity.entitySetName && + selectedEntities.some((s) => s.entity.entitySetName === h.entitySetName) + ) ?? []; const { odataResult } = await fetchData( appConfig.referencedEntities.listEntity, odataServiceProvider, selectedEntities, - 1 + hierarchyEntity ? undefined : 1, + hierarchyEntity, + navPropHierarchyEntities ); if (odataResult.entityData) { // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -154,10 +167,14 @@ function getEntitySelectionChoices( : []; for (const navEntity of navEntities) { const expandPath = navEntity.entityPath; - // For hierarchies this may be ok but we currently do not detect hierarchies - // Dont re-include entities that are referenced on the path already (this will need to change with hiereachy support) - if (navEntity.entityType?.name === listPageEntity?.entityType?.name || parentPath.includes(expandPath)) { + // Allow self-referential navigation properties when they are the ParentNavigationProperty of a detected hierarchy + const effectiveListEntity = listPageEntity ?? currentEntity; + if ( + navEntity.entityType?.name === effectiveListEntity?.entityType?.name || + parentPath.includes(expandPath) + ) { // Stop the tree traversal if the current nodes entity type is the same as the list + // Hierarchy self-referential nav props are also skipped here; hierarchy data is fetched via a separate descendants query continue; } const fullPath = parentPath.concat(`${parentPath ? '/' : ''}${expandPath}`); @@ -193,7 +210,7 @@ function getEntitySelectionChoices( value: entityChoice, checked: entityChoice.entity.defaultSelected }); - entitySetsFlat[expandPath] = navEntity.entitySetName; // Can overwrite since we will only need to know each unique entity set name later + entitySetsFlat[fullPath] = navEntity.entitySetName; } } return { @@ -256,9 +273,16 @@ export async function getServiceDetails( let systemName; if (backendConfig) { + let backendUrl = backendConfig.url; + if (backendConfig.connectPath) { + const normalizedPath = backendConfig.connectPath.startsWith('/') + ? backendConfig.connectPath + : `/${backendConfig.connectPath}`; + backendUrl = new URL(normalizedPath, backendConfig.url).href; + } systemName = isAppStudio() ? backendConfig?.destination - : await getSystemNameFromStore(backendConfig.url, backendConfig?.client); + : await getSystemNameFromStore(backendUrl, backendConfig?.client); } return { diff --git a/packages/generator-odata-downloader/src/data-download/prompts/prompts.ts b/packages/generator-odata-downloader/src/data-download/prompts/prompts.ts index e654d29438c..37664a7f45d 100644 --- a/packages/generator-odata-downloader/src/data-download/prompts/prompts.ts +++ b/packages/generator-odata-downloader/src/data-download/prompts/prompts.ts @@ -36,6 +36,7 @@ export const promptNames = { updateMainServiceMetadata: 'updateMainServiceMetadata' }; +const guidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; const invalidEntityKeyFilterChars = ['.']; /** @@ -51,10 +52,17 @@ async function validateKeysAndFetchData( odataServiceAnswers: Partial, appConfig: AppConfig ): Promise { - const hasKeyInput = Object.entries(answers).find( - ([key, value]) => key.startsWith('entityKeyIdx:') && !!value?.trim() - ); - if (!hasKeyInput) { + // Query will only execute if we have at least one input value and no invalid inputs + let hasOneValidKeyValue = false; + const validKeyInputs = appConfig.referencedEntities?.listEntity.semanticKeys.every((key, index) => { + if (!hasOneValidKeyValue) { + hasOneValidKeyValue = !!key.value; + } + // if we have a value, if we dont have a value but have an answer the input was invalid + return (key.value !== undefined && key.value !== '') || !answers[`entityKeyIdx:${index}`]; + }); + + if (!validKeyInputs || !hasOneValidKeyValue) { return t('prompts.skipDataDownload.validation.keyRequired'); } @@ -296,6 +304,9 @@ function getEntitySelectionPrompt( choices: () => relatedEntityChoices.choices, validate: async (selectedEntities, answers: Answers): Promise => { relatedEntityChoices.choices.forEach((entityChoice) => { + if (entityChoice.disabled) { + return; + } entityChoice.checked = selectedEntities.some( (selectedEntity: SelectedEntityAnswer) => selectedEntity.fullPath === entityChoice.value.fullPath ); @@ -320,7 +331,7 @@ function getEntitySelectionPrompt( } return undefined; } - }; + } as CheckBoxQuestion; } /** @@ -372,6 +383,9 @@ function getResetSelectionPrompt( // Dont apply a reset unless the value was changed as this validate function is triggered by any earlier prompt inputs if (reset !== previousReset) { relatedEntityChoices.choices.forEach((entityChoice) => { + if (entityChoice.disabled) { + return; + } const entityChoiceValue = entityChoice.value as SelectedEntityAnswer; entityChoice.checked = reset === false ? entityChoiceValue.entity.defaultSelected : false; // Restore default selection }); @@ -417,23 +431,31 @@ function getKeyPrompts( name: `entityKeyIdx:${keypart}`, message: () => t('prompts.entityKey.message', { - keyName: appConfig.referencedEntities?.listEntity.semanticKeys[keypart]?.name + keyName: `${appConfig.referencedEntities?.listEntity.semanticKeys[keypart]?.name} (${appConfig.referencedEntities?.listEntity.entitySetName})` }), type: 'input', + default: () => { + const keyRef = appConfig.referencedEntities?.listEntity.semanticKeys[keypart]; + if (keyRef?.name === 'IsActiveEntity') { + return 'true'; + } + return undefined; + }, guiOptions: { hint: t('prompts.entityKey.hint') }, validate: async (keyValue: string, answers: Answers): Promise => { + const keyRef = appConfig.referencedEntities?.listEntity.semanticKeys[keypart]; + // Clear validated value upfront; only re-set if validation passes + if (keyRef) { + delete keyRef.value; + } + if (invalidEntityKeyFilterChars.includes(keyValue)) { return t('prompts.entityKey.validation.invalidKeyValueChars', { chars: invalidEntityKeyFilterChars.join() }); } - const keyRef = appConfig.referencedEntities?.listEntity.semanticKeys[keypart]; - // Clear key values - if (!keyValue && keyRef) { - delete keyRef.value; - } if (keyValue && keyRef) { if (keyRef.type === 'Edm.Boolean') { @@ -442,17 +464,28 @@ function getKeyPrompts( } catch { return t('prompts.entityKey.validation.invalidBooleanValue'); } + } else if (['Edm.UUID', 'Edm.Guid'].includes(keyRef.type)) { + const guidParts = keyValue.split(','); + for (const part of guidParts) { + if (!guidRegex.test(part.trim())) { + return t('prompts.entityKey.validation.invalidGuidValue'); + } + } + keyRef.value = keyValue.trim(); } else { keyRef.value = keyValue.trim(); } } const filterAndParts = keyValue.split(','); - // Dont validate as range if its a UUID, its not supported - if (keyRef?.type !== 'Edm.UUID') { + // Dont validate as range if its a UUID/GUID, its not supported + if (keyRef?.type && !['Edm.UUID', 'Edm.Guid'].includes(keyRef.type)) { for (const filterPart of filterAndParts) { const filterRangeParts = filterPart.split('-'); if (filterRangeParts.length > 2) { + if (keyRef) { + delete keyRef.value; + } return t('prompts.entityKey.validation.invalidRangeSpecified'); } } @@ -523,7 +556,7 @@ function getUpdateMainServiceMetadataPrompt( odataServiceAnswers: Partial, appConfig: AppConfig ): ConfirmQuestion { - let entityModelResult: ReferencedEntities | undefined; + let entityModelResult: ReferencedEntities | undefined | string; const question: ConfirmQuestion = { when: async () => { if (appConfig.appAccess && appConfig.specification && odataServiceAnswers?.metadata) { diff --git a/packages/generator-odata-downloader/src/data-download/types.ts b/packages/generator-odata-downloader/src/data-download/types.ts index a4a32e080dd..8739e2415e0 100644 --- a/packages/generator-odata-downloader/src/data-download/types.ts +++ b/packages/generator-odata-downloader/src/data-download/types.ts @@ -6,7 +6,23 @@ import type { PageV4 } from '@sap/ux-specification/dist/types/src/v4'; import type { Answers, CheckboxChoiceOptions } from 'inquirer'; import type { EntitySetsFlat } from './odata-query'; -export type SemanticKeyFilter = { name: string; type: string; value: string | undefined }; +export type SemanticKeyFilter = { name: string; keyName?: string; type: string; value: string | undefined }; + +export type HierarchyEntity = { + entitySetName: string; + entityTypeName: string; + qualifier: string; + nodeProperty: string; // From Aggregation.RecursiveHierarchy.NodeProperty + parentProperty: string; // Resolved from ParentNavigationProperty referential constraint + parentPropertyType: string; // EDM type of the parent property (e.g. Edm.Guid, Edm.String) + isDraft: boolean; // Entity has IsActiveEntity key — requires ancestors() wrapper + entityTypeKeys: string[]; // Key property names of this hierarchy entity's type + missingReferentialConstraints?: { + // Set when the parent nav prop has no referentialConstraint in metadata + navPropName: string; + constraints: { sourceProperty: string; targetProperty: string }[]; + }; +}; export type ReferencedEntities = { listEntity: Entity & { @@ -14,6 +30,7 @@ export type ReferencedEntities = { }; pageObjectEntities?: Entity[]; navPropEntities?: Map; + hierarchyEntities?: HierarchyEntity[]; }; export type Entity = { entitySetName: string; diff --git a/packages/generator-odata-downloader/src/data-download/utils.ts b/packages/generator-odata-downloader/src/data-download/utils.ts index 5a0b7e5e470..2cca84e0598 100644 --- a/packages/generator-odata-downloader/src/data-download/utils.ts +++ b/packages/generator-odata-downloader/src/data-download/utils.ts @@ -9,7 +9,7 @@ import type { PagesV4 } from '@sap/ux-specification/dist/types/src/v4'; import { t } from '../utils/i18n'; import { ODataDownloadGenerator } from './odata-download-generator'; import type { EntitySetsFlat } from './odata-query'; -import type { Entity, ReferencedEntities, SemanticKeyFilter } from './types'; +import type { Entity, ReferencedEntities, SemanticKeyFilter, HierarchyEntity } from './types'; import { navPropNameExclusions } from './types'; /** @@ -45,12 +45,16 @@ function mergeEntitySetData( * @param odataResult - The OData result to process * @param entitySetsFlat - Map of entity paths to entity set names * @param entitySetName - The name of the entity set + * @param hierarchyEntities - Optional hierarchy descriptors; when provided, root node parent properties are cleared + * @param parentPath * @returns Object keyed on entity set name containing entity data arrays */ export function createEntitySetData( odataResult: object | unknown[], entitySetsFlat: EntitySetsFlat, - entitySetName: string + entitySetName: string, + hierarchyEntities?: HierarchyEntity[], + parentPath = '' ): { [key: string]: object[] } { const resultDataByEntitySet: { [key: string]: object[] } = {}; const odataRestulAsArray: Record[] = Array.isArray(odataResult) @@ -63,15 +67,24 @@ export function createEntitySetData( // Each entry is of the same entity set data odataRestulAsArray.forEach((resultEntry) => { - Object.entries(entitySetsFlat).forEach(([entityPath, entitySetName]) => { - // There are nested expanded entities - if (resultEntry[entityPath]) { - const entitySetData = createEntitySetData(resultEntry[entityPath], entitySetsFlat, entitySetName); - mergeEntitySetData(resultDataByEntitySet, entitySetData); - // Since we have assigned the property value to its own entity set property we can remove it from the parent (to prevent dups and file bloat) - delete resultEntry[entityPath]; + for (const propName of Object.keys(resultEntry)) { + const contextualKey = parentPath ? `${parentPath}/${propName}` : propName; + // Prefer full-path key for accurate mapping; fall back to flat prop name for backward compat + const childEntitySetName = entitySetsFlat[contextualKey] ?? entitySetsFlat[propName]; + if (!childEntitySetName || !resultEntry[propName]) { + continue; } - }); + const entitySetData = createEntitySetData( + resultEntry[propName] as object | unknown[], + entitySetsFlat, + childEntitySetName, + undefined, + contextualKey + ); + mergeEntitySetData(resultDataByEntitySet, entitySetData); + // Since we have assigned the property value to its own entity set property we can remove it from the parent (to prevent dups and file bloat) + delete resultEntry[propName]; + } // Initialize seen set for this entity set if needed if (!seenInThisCall[entitySetName]) { @@ -92,9 +105,101 @@ export function createEntitySetData( } }); + if (hierarchyEntities?.length) { + normalizeHierarchyNodeIds(resultDataByEntitySet, hierarchyEntities); + clearRootHierarchyParentProperty(resultDataByEntitySet, hierarchyEntities); + } + return resultDataByEntitySet; } +/** Regex matching a 32-character uppercase hex string (ABAP RAW16 GUID without dashes). */ +const upperHexGuidPattern = /^[0-9A-F]{32}$/; + +/** + * Converts a 32-character uppercase hex string to standard GUID format (lowercase, 8-4-4-4-12 dashes). + * + * @param hex - The 32-character hex string + * @returns The GUID-formatted string + */ +function hexToGuid(hex: string): string { + const h = hex.toLowerCase(); + return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`; +} + +/** + * Normalizes hierarchy NodeId values to match the parent property GUID format. + * ABAP exposes the same underlying GUID in different formats depending on the EDM type: + * Edm.Guid properties use lowercase with dashes, while Edm.String NodeId values use uppercase + * hex without dashes. The mock data server uses strict equality to match parent-child relationships, + * so the formats must be aligned. + * + * @param entityFileData - The entity set data map keyed by entity set name + * @param hierarchyEntities - The detected hierarchy entity descriptors + */ +export function normalizeHierarchyNodeIds( + entityFileData: { [key: string]: object[] }, + hierarchyEntities: HierarchyEntity[] +): void { + for (const hierarchy of hierarchyEntities) { + if (!['Edm.Guid', 'Edm.UUID'].includes(hierarchy.parentPropertyType)) { + continue; + } + const pathParts = hierarchy.nodeProperty.split('/'); + for (const entityData of Object.values(entityFileData)) { + for (const entity of entityData) { + const record = entity as Record; + let nodeValue: string | undefined; + if (pathParts.length > 1) { + const complexObj = record[pathParts[0]] as Record | undefined; + nodeValue = complexObj?.[pathParts[1]] as string | undefined; + } else { + nodeValue = record[pathParts[0]] as string | undefined; + } + if (typeof nodeValue === 'string' && upperHexGuidPattern.test(nodeValue)) { + const guidValue = hexToGuid(nodeValue); + if (pathParts.length > 1) { + (record[pathParts[0]] as Record)[pathParts[1]] = guidValue; + } else { + record[pathParts[0]] = guidValue; + } + } + } + } + } +} + +/** + * Clears the parent property on root hierarchy nodes (DistanceFromRoot === 0). + * The mock data server uses an empty parent property to determine the root of the hierarchy from the data. + * + * @param entityFileData - The entity set data map keyed by entity set name + * @param hierarchyEntities - The detected hierarchy entity descriptors + */ +export function clearRootHierarchyParentProperty( + entityFileData: { [key: string]: object[] }, + hierarchyEntities: HierarchyEntity[] +): void { + for (const hierarchy of hierarchyEntities) { + const pathParts = hierarchy.nodeProperty.split('/'); + for (const entityData of Object.values(entityFileData)) { + for (const entity of entityData) { + const record = entity as Record; + if (!(hierarchy.parentProperty in record)) { + continue; + } + const distanceFromRoot = + pathParts.length > 1 + ? (record[pathParts[0]] as Record)?.DistanceFromRoot + : record.DistanceFromRoot; + if (distanceFromRoot === 0) { + record[hierarchy.parentProperty] = ''; + } + } + } + } +} + /** * Load the system from store if available otherwise return as a new system choice. * @@ -122,11 +227,23 @@ export async function getSystemNameFromStore(systemUrl: string, client?: string */ function getSemanticKeyProperties(entityType: EntityType): SemanticKeyFilter[] { const keyNames: SemanticKeyFilter[] = []; + const draftKeyNames = new Set(['DraftUUID', 'IsActiveEntity']); + const entityBusinessKeys = entityType.keys.filter((k) => !draftKeyNames.has(k.name)); + if (entityType?.annotations.Common?.SemanticKey) { const semanticKey = entityType.annotations.Common.SemanticKey; - semanticKey.forEach((keyProperty) => { + semanticKey.forEach((keyProperty, index) => { + const semName = keyProperty.value; + const isActualKey = entityBusinessKeys.some((k) => k.name === semName); + const actualKey = isActualKey ? undefined : entityBusinessKeys[index]?.name; + if (actualKey) { + ODataDownloadGenerator.logger.debug( + `Semantic key '${semName}' mapped to actual entity key '${actualKey}'` + ); + } keyNames.push({ - name: keyProperty.value, + name: semName, + keyName: actualKey, type: keyProperty.$target?.type ?? 'Edm.String', value: undefined }); @@ -203,6 +320,115 @@ function getNavPropsForExpansion( return navPropEntities; } +/** + * Scans converted metadata for entity sets with Aggregation.RecursiveHierarchy annotations. + * Extracts the node identifier property and parent reference property for each. + * + * @param convertedMetadata - The converted metadata object + * @returns Array of hierarchy entity descriptors + */ +export function getHierarchyEntities(convertedMetadata: ConvertedMetadata): HierarchyEntity[] { + const hierarchyEntities: HierarchyEntity[] = []; + for (const entitySet of convertedMetadata.entitySets) { + const aggregationAnnotations = entitySet.entityType?.annotations?.Aggregation; + if (!aggregationAnnotations) { + continue; + } + const hierarchyKey = Object.keys(aggregationAnnotations).find((key) => key.startsWith('RecursiveHierarchy')); + if (!hierarchyKey) { + continue; + } + const qualifier = hierarchyKey.split('#')[1] ?? ''; + const aggregationAnnotation = aggregationAnnotations[hierarchyKey as keyof typeof aggregationAnnotations]; + if (!aggregationAnnotation) { + continue; + } + const nodeProperty = (aggregationAnnotation as { NodeProperty?: { value?: string } }).NodeProperty?.value; + const parentNavPropAnnotation = ( + aggregationAnnotation as { + ParentNavigationProperty?: { + value?: string; + $target?: { + referentialConstraint?: { sourceProperty: string }[]; + }; + }; + } + ).ParentNavigationProperty; + const parentNavPropName = parentNavPropAnnotation?.value; + const hasReferentialConstraint = (parentNavPropAnnotation?.$target?.referentialConstraint?.length ?? 0) > 0; + // When a referential constraint exists, use the source property directly. + // Otherwise, look for a non-key property whose name contains 'Parent' and whose type + // matches a business key (e.g. PurchasingParentItem for PurchaseOrderItem). + let parentProperty: string | undefined; + if (hasReferentialConstraint) { + parentProperty = parentNavPropAnnotation?.$target?.referentialConstraint?.[0]?.sourceProperty; + } else if (parentNavPropName) { + const businessKeys = entitySet.entityType.keys + .map((k) => k.name) + .filter((k) => !['DraftUUID', 'IsActiveEntity'].includes(k)); + const keyTypes = new Set( + businessKeys.map((k) => entitySet.entityType.entityProperties.find((p) => p.name === k)?.type) + ); + parentProperty = + entitySet.entityType.entityProperties.find( + (p) => + !businessKeys.includes(p.name) && + p.name.toLowerCase().includes('parent') && + keyTypes.has(p.type) + )?.name ?? parentNavPropName; + } + + if (nodeProperty && parentProperty) { + const isDraft = !!(entitySet.annotations?.Common?.DraftRoot ?? entitySet.annotations?.Common?.DraftNode); + const parentPropertyType = + entitySet.entityType.entityProperties.find((prop) => prop.name === parentProperty)?.type ?? + 'Edm.String'; + const entityTypeKeys = entitySet.entityType.keys.map((k) => k.name); + const draftKeyNames = new Set(['DraftUUID', 'IsActiveEntity']); + const businessKeys = entityTypeKeys.filter((k) => !draftKeyNames.has(k)); + + // When the parent nav prop has no referential constraint in metadata, derive it from hierarchy data + // so the generator can write a mock server .js file to compensate + let missingReferentialConstraints: HierarchyEntity['missingReferentialConstraints']; + if (!hasReferentialConstraint && parentNavPropName) { + const constraints: { sourceProperty: string; targetProperty: string }[] = []; + // node key → parent property (e.g. PurchaseOrderItem → PurchasingParentItem) + const nodeKey = businessKeys.find((k) => k !== parentProperty); + if (nodeKey) { + constraints.push({ sourceProperty: nodeKey, targetProperty: parentProperty }); + } + // shared key properties (same name on both sides, e.g. PurchaseOrder → PurchaseOrder) + businessKeys + .filter((k) => k !== nodeKey) + .forEach((k) => constraints.push({ sourceProperty: k, targetProperty: k })); + + missingReferentialConstraints = { navPropName: parentNavPropName, constraints }; + ODataDownloadGenerator.logger.debug( + `getHierarchyEntities: '${entitySet.name}' nav prop '${parentNavPropName}' has no referentialConstraint in metadata — derived: ${JSON.stringify(constraints)}` + ); + } + + hierarchyEntities.push({ + entitySetName: entitySet.name, + entityTypeName: entitySet.entityType.fullyQualifiedName, + qualifier, + nodeProperty, + parentProperty, + parentPropertyType, + isDraft, + entityTypeKeys, + missingReferentialConstraints + }); + } + } + if (hierarchyEntities.length) { + ODataDownloadGenerator.logger.debug( + `Hierarchy entities found: ${hierarchyEntities.map((h) => h.entitySetName).join(', ')}` + ); + } + return hierarchyEntities; +} + /** * Load the entity model for processing to determine the odata queries that are relevant for the application. * @@ -215,72 +441,108 @@ export async function getEntityModel( appAccess: ApplicationAccess, specification: Specification, remoteMetadata: string -): Promise { +): Promise { let entities: ReferencedEntities | undefined; const mainService = appAccess.app.services['mainService']; - if (mainService.local) { - const convertedMetadata = convert(parse(remoteMetadata)); - const appConfig = await specification.readApp({ app: appAccess }); + try { + if (mainService.local) { + const convertedMetadata = convert(parse(remoteMetadata)); + const appConfig = await specification.readApp({ app: appAccess }); - if ( - appConfig.applicationModel && - appConfig.applicationModel?.target?.fioriElements == FioriElementsVersion.v4 - ) { - const appModel = appConfig.applicationModel; - const pages = appModel.pages as unknown as PagesV4; - let mainListEntityType: EntityType | undefined; - const pageObjectEntities: Entity[] = []; + if ( + appConfig.applicationModel && + appConfig.applicationModel?.target?.fioriElements == FioriElementsVersion.v4 + ) { + const appModel = appConfig.applicationModel; + const pages = appModel.pages as unknown as PagesV4; + let mainListEntityType: EntityType | undefined; + const pageObjectEntities: Entity[] = []; - // Get all the app referenced pages and list entity - Object.values(pages).forEach((page) => { - // Get the main list entity - if (page.pageType === PageTypeV4.ListReport && page.entityType && page.entitySet) { - mainListEntityType = convertedMetadata.entityTypes.find( - (et) => et.fullyQualifiedName === page.entityType - ); - if (mainListEntityType) { - const entityKeys = getSemanticKeyProperties(mainListEntityType); - entities = { - listEntity: { - entitySetName: page.entitySet, - semanticKeys: entityKeys, - entityPath: page.entitySet, - entityType: mainListEntityType - } - }; - - // Add nav props of the list entity - entities.listEntity.navPropEntities = getNavPropsForExpansion( - mainListEntityType, - convertedMetadata + // Get all the app referenced pages and list entity + Object.values(pages).forEach((page) => { + // Get the main list entity + if (page.pageType === PageTypeV4.ListReport && page.entityType && page.entitySet) { + mainListEntityType = convertedMetadata.entityTypes.find( + (et) => et.fullyQualifiedName === page.entityType ); + if (mainListEntityType) { + const entityKeys = getSemanticKeyProperties(mainListEntityType); + entities = { + listEntity: { + entitySetName: page.entitySet, + semanticKeys: entityKeys, + entityPath: page.entitySet, + entityType: mainListEntityType + } + }; + + // Add nav props of the list entity + entities.listEntity.navPropEntities = getNavPropsForExpansion( + mainListEntityType, + convertedMetadata + ); + } + } else if (page.pageType === PageTypeV4.ObjectPage && page.entityType && page.entitySet) { + // Dont add the page object for the main entity since it will be the query root entity set + if ( + page.entitySet && + page.entityType && + page.entityType !== mainListEntityType?.fullyQualifiedName + ) { + const objectPageEntitySet = findEntitySet(convertedMetadata.entitySets, page.entityType); + const pageEntity: Entity = { + entityPath: page.navigationProperty!, + entitySetName: page.entitySet, + entityType: objectPageEntitySet?.entityType, + page + }; + pageObjectEntities.push(pageEntity); + } } - } else if (page.pageType === PageTypeV4.ObjectPage && page.entityType && page.entitySet) { - // Dont add the page object for the main entity since it will be the query root entity set - if ( - page.entitySet && - page.entityType && - page.entityType !== mainListEntityType?.fullyQualifiedName - ) { - const objectPageEntitySet = findEntitySet(convertedMetadata.entitySets, page.entityType); - const pageEntity: Entity = { - entityPath: page.navigationProperty!, - entitySetName: page.entitySet, - entityType: objectPageEntitySet?.entityType, - page - }; - pageObjectEntities.push(pageEntity); - } - } - }); + }); - if (!entities?.listEntity) { - ODataDownloadGenerator.logger.info(t('info.noListEntityDefined')); - return undefined; + if (!entities?.listEntity) { + ODataDownloadGenerator.logger.info(t('info.noListEntityDefined')); + return t('info.noListEntityDefined'); + } + entities.pageObjectEntities = pageObjectEntities; + entities.hierarchyEntities = getHierarchyEntities(convertedMetadata); } - entities.pageObjectEntities = pageObjectEntities; } + return entities; + } catch (error) { + const errLog = t('errors.entityModelLoading', { error }); + ODataDownloadGenerator.logger.error(errLog); + return errLog; } - return entities; +} + +/** + * Builds the content of a mock server `.js` constraint file for a hierarchy entity + * whose parent navigation property has no referential constraint in the metadata. + * + * @param navPropName - The navigation property name (used in the switch case) + * @param constraints - The derived referential constraints to return + * @returns The complete `.js` file content as a string + */ +export function buildReferentialConstraintFileContent( + navPropName: string, + constraints: { sourceProperty: string; targetProperty: string }[] +): string { + const constraintsJson = JSON.stringify(constraints, null, 12).replaceAll('\n', '\n '); + return [ + `module.exports = {`, + ` // See: https://github.com/SAP/open-ux-odata/blob/main/docs/MockserverAPI.md#getreferentialconstraints`, + ` getReferentialConstraints(navigationProperty) {`, + ` switch (navigationProperty.name) {`, + ` case "${navPropName}":`, + ` return ${constraintsJson};`, + ` default:`, + ` return navigationProperty.referentialConstraint;`, + ` }`, + ` }`, + `};`, + `` + ].join('\n'); } diff --git a/packages/generator-odata-downloader/src/translations/odataDownloadGenerator.i18n.json b/packages/generator-odata-downloader/src/translations/odataDownloadGenerator.i18n.json index 240be87aa70..8102b9dc699 100644 --- a/packages/generator-odata-downloader/src/translations/odataDownloadGenerator.i18n.json +++ b/packages/generator-odata-downloader/src/translations/odataDownloadGenerator.i18n.json @@ -1,19 +1,23 @@ { "errors": { "odataQueryError": "An error occurred when querying for odata: {{error}}. $t(texts.seeLogForDetails)", - "dataNotFetched": "Data was not fetched" + "dataNotFetched": "Data was not fetched", + "entityModelLoading": "Error reading the data model: {{- error}}. $t(texts.seeLogForDetails)" }, "info": { "loggingInitialised": "Logger has been configure with level: {{logLevel}}", "noServiceEntityData": "No service entity data to write.", "noValueHelpData": "No Value Help service data to write.", "entityFilesToBeGenerated": "The following entity files will be created: {{entities}}", - "noListEntityDefined": "No list entity defined. A main list entity is required for data downloading." + "noListEntityDefined": "No list entity defined. A main list entity is required for data downloading.", + "hierarchyEntityQuery": "Fetching hierarchy data for entity set: {{entitySetName}}", + "hierarchyFilesGenerated": "The following hierarchy data files were created: {{entities}}" }, "texts": { "seeLogForDetails": "For more information, view the logs.", "rows_one": "{{count}} row", - "rows_other": "{{count}} rows" + "rows_other": "{{count}} rows", + "generatorTitle": "Fiori Elements Data Downloader" }, "prompts": { "appSelection": { @@ -26,7 +30,8 @@ } }, "relatedEntitySelection": { - "message": "Select entities for data download (pre-selected entities are referenced by the application)" + "message": "Select entities for data download (pre-selected entities are referenced by the application)", + "hierarchyAutoQueried": "auto-queried via descendants" }, "toggleSelection": { "message": "Reset selection", @@ -39,7 +44,8 @@ "validation": { "invalidKeyValueChars": "Invalid key value contain not allowed characters: {{chars}}", "invalidRangeSpecified": "Invalid range specified, only the lowest and highest values allowed. e.g. '1-10'", - "invalidBooleanValue": "Invalid boolean value entered. Please enter true or false." + "invalidBooleanValue": "Invalid boolean value entered. Please enter true or false.", + "invalidGuidValue": "Invalid GUID format. Expected format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } }, "skipDataDownload": { @@ -49,7 +55,7 @@ "labelFalse": "Suppress the OData query (prevents multiple queries during selections)", "querySuccess": "OData query success. $t(texts.rows, {\"count\": \"{{count}}\") returned. $t(texts.seeLogForDetails)", "validation": { - "keyRequired": "Please enter at least one key field value to run the odata query" + "keyRequired": "Please enter at least one key valid field value to run the odata query" }, "choiceLabel": "Skip data download" }, @@ -65,7 +71,7 @@ }, "steps": { "odataDownloader": { - "name": "OData Downloader", + "name": "Configure Data Download", "description": "Download data from an OData service for use with the UX Tools Mockdata Server" }, "valueHelpSelection": { @@ -76,4 +82,4 @@ "telemetry": { "unknownOs": "Unknown" } -} \ No newline at end of file +} diff --git a/packages/generator-odata-downloader/test/odata-download-generator.test.ts b/packages/generator-odata-downloader/test/odata-download-generator.test.ts index 23f5ba9a9de..a63e0504644 100644 --- a/packages/generator-odata-downloader/test/odata-download-generator.test.ts +++ b/packages/generator-odata-downloader/test/odata-download-generator.test.ts @@ -205,7 +205,12 @@ describe('ODataDownloadGenerator', () => { await generator.writing(); expect(mockDestinationRoot).toHaveBeenCalledWith(join('/test/app')); - expect(createEntitySetData).toHaveBeenCalledWith([{ TravelID: '1' }], { Travel: 'Travel' }, 'Travel'); + expect(createEntitySetData).toHaveBeenCalledWith( + [{ TravelID: '1' }], + { Travel: 'Travel' }, + 'Travel', + undefined + ); expect(mockWriteDestinationJSON).toHaveBeenCalledTimes(2); expect(mockWriteDestinationJSON).toHaveBeenCalledWith( join('webapp', 'localService', 'mockdata', 'Travel.json'), diff --git a/packages/generator-odata-downloader/test/odata-query.test.ts b/packages/generator-odata-downloader/test/odata-query.test.ts index 362cc30dedf..b89e044a375 100644 --- a/packages/generator-odata-downloader/test/odata-query.test.ts +++ b/packages/generator-odata-downloader/test/odata-query.test.ts @@ -1,6 +1,12 @@ import type { EntityType } from '@sap-ux/vocabularies-types'; -import { createQueryFromEntities, getExpands } from '../src/data-download/odata-query'; -import type { ReferencedEntities } from '../src/data-download/types'; +import { + buildNavPropHierarchyQuery, + createQueryFromEntities, + fetchData, + getExpands +} from '../src/data-download/odata-query'; +import type { ODataService } from '@sap-ux/axios-extension'; +import type { ReferencedEntities, HierarchyEntity } from '../src/data-download/types'; import type { SelectedEntityAnswer } from '../src/data-download/prompts/prompts'; describe('Test odata query builder', () => { @@ -244,4 +250,499 @@ describe('Test odata query builder', () => { "ListEntity1?$filter=Prop1 eq 'abc123'&$expand=a($expand=a.1($expand=a.1.1),a.2($expand=a.2.1,a.2.2)),b,c($expand=c.1)&$count=true" ); }); + + test('`createQueryFromEntities` should not wrap GUID/UUID values in quotes', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'ListEntity1', + semanticKeys: [], + navPropEntities: [], + entityPath: 'root', + entityType: {} as EntityType + }; + + // Single GUID value + let query = createQueryFromEntities( + { + ...listEntity, + semanticKeys: [{ name: 'ID', value: '550e8400-e29b-41d4-a716-446655440000', type: 'Edm.Guid' }] + }, + [] + ); + expect(query.query).toEqual('ListEntity1?$filter=ID eq 550e8400-e29b-41d4-a716-446655440000&$count=true'); + + // Single UUID value + query = createQueryFromEntities( + { + ...listEntity, + semanticKeys: [{ name: 'ID', value: '550e8400-e29b-41d4-a716-446655440000', type: 'Edm.UUID' }] + }, + [] + ); + expect(query.query).toEqual('ListEntity1?$filter=ID eq 550e8400-e29b-41d4-a716-446655440000&$count=true'); + + // Comma-separated GUIDs + query = createQueryFromEntities( + { + ...listEntity, + semanticKeys: [ + { + name: 'ID', + value: '550e8400-e29b-41d4-a716-446655440000,a1b2c3d4-e5f6-7890-abcd-ef1234567890', + type: 'Edm.Guid' + } + ] + }, + [] + ); + expect(query.query).toEqual( + 'ListEntity1?$filter=((ID eq 550e8400-e29b-41d4-a716-446655440000) or (ID eq a1b2c3d4-e5f6-7890-abcd-ef1234567890))&$count=true' + ); + }); + + test('`createQueryFromEntities` should handle boolean semantic key values', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'ListEntity1', + semanticKeys: [], + navPropEntities: [], + entityPath: 'root', + entityType: {} as EntityType + }; + + // Boolean true value (stored as actual boolean by JSON.parse in prompt validation) + let query = createQueryFromEntities( + { + ...listEntity, + semanticKeys: [{ name: 'IsActive', value: true as unknown as string, type: 'Edm.Boolean' }] + }, + [] + ); + expect(query.query).toEqual('ListEntity1?$filter=IsActive eq true&$count=true'); + + // Boolean in hierarchy query + const hierarchy: HierarchyEntity = { + entitySetName: 'ListEntity1', + entityTypeName: 'ListEntity1Type', + qualifier: 'MyHierarchy', + nodeProperty: 'ID', + parentProperty: 'Parent', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: [] + }; + query = createQueryFromEntities( + { + ...listEntity, + semanticKeys: [{ name: 'IsActive', value: true as unknown as string, type: 'Edm.Boolean' }] + }, + [], + 1, + hierarchy + ); + expect(query.query).toEqual( + "ListEntity1?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/ListEntity1,HierarchyQualifier='MyHierarchy',NodeProperty='ID',Levels=3)" + ); + }); + + test('`createQueryFromEntities` should generate correct descendants query for hierarchy entities', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'SalesOrganizations', + semanticKeys: [], + navPropEntities: [], + entityPath: 'root', + entityType: {} as EntityType + }; + const hierarchy: HierarchyEntity = { + entitySetName: 'SalesOrganizations', + entityTypeName: 'SalesOrgType', + qualifier: 'SalesOrgHierarchy', + nodeProperty: 'ID', + parentProperty: 'Parent', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: [] + }; + + // No filter - no semantic key values (filter param omitted entirely) + let query = createQueryFromEntities(listEntity, [], 1, hierarchy); + expect(query.query).toEqual( + "SalesOrganizations?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/SalesOrganizations,HierarchyQualifier='SalesOrgHierarchy',NodeProperty='ID',Levels=3)" + ); + + // With string filter (non-draft: filter ignored in TopLevels, same output) + query = createQueryFromEntities( + { ...listEntity, semanticKeys: [{ name: 'ID', value: 'Sales', type: 'Edm.String' }] }, + [], + 1, + hierarchy + ); + expect(query.query).toEqual( + "SalesOrganizations?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/SalesOrganizations,HierarchyQualifier='SalesOrgHierarchy',NodeProperty='ID',Levels=3)" + ); + + // With GUID filter (non-draft: filter ignored in TopLevels) + query = createQueryFromEntities( + { + ...listEntity, + semanticKeys: [{ name: 'ID', value: '550e8400-e29b-41d4-a716-446655440000', type: 'Edm.Guid' }] + }, + [], + 1, + hierarchy + ); + expect(query.query).toEqual( + "SalesOrganizations?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/SalesOrganizations,HierarchyQualifier='SalesOrgHierarchy',NodeProperty='ID',Levels=3)" + ); + + // With comma-separated filter values (non-draft: filter ignored in TopLevels) + query = createQueryFromEntities( + { ...listEntity, semanticKeys: [{ name: 'ID', value: 'Sales,Marketing', type: 'Edm.String' }] }, + [], + 1, + hierarchy + ); + expect(query.query).toEqual( + "SalesOrganizations?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/SalesOrganizations,HierarchyQualifier='SalesOrgHierarchy',NodeProperty='ID',Levels=3)" + ); + + // With expands + const selectedEntities: SelectedEntityAnswer[] = [ + { fullPath: 'Children', entity: { entitySetName: 'SalesOrganizations', entityPath: 'Children' } } + ]; + query = createQueryFromEntities( + { ...listEntity, semanticKeys: [{ name: 'ID', value: 'Sales', type: 'Edm.String' }] }, + selectedEntities, + 1, + hierarchy + ); + expect(query.query).toEqual( + "SalesOrganizations?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/SalesOrganizations,HierarchyQualifier='SalesOrgHierarchy',NodeProperty='ID',Levels=3)&$expand=Children" + ); + }); + + test('`createQueryFromEntities` should wrap with ancestors() for draft-enabled hierarchy entities', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'P_SADL_HIER_UUID_D_COMPNY_ROOT', + semanticKeys: [], + navPropEntities: [], + entityPath: 'root', + entityType: {} as EntityType + }; + const hierarchy: HierarchyEntity = { + entitySetName: 'P_SADL_HIER_UUID_D_COMPNY_ROOT', + entityTypeName: 'P_SADL_HIER_UUID_D_COMPNY_ROOTType', + qualifier: 'I_SADL_HIER_UUID_COMPANY_NODE', + nodeProperty: '__HierarchyPropertiesForI_SADL_HIER_UUID_COMPANY_NODE/NodeId', + parentProperty: 'OwnerCompany', + parentPropertyType: 'Edm.Guid', + isDraft: true, + entityTypeKeys: [] + }; + + // No user filter — no filter on ancestors + let query = createQueryFromEntities(listEntity, [], 1, hierarchy); + expect(query.query).toEqual( + "P_SADL_HIER_UUID_D_COMPNY_ROOT?$apply=ancestors($root/P_SADL_HIER_UUID_D_COMPNY_ROOT,I_SADL_HIER_UUID_COMPANY_NODE,__HierarchyPropertiesForI_SADL_HIER_UUID_COMPANY_NODE/NodeId,keep start)/com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/P_SADL_HIER_UUID_D_COMPNY_ROOT,HierarchyQualifier='I_SADL_HIER_UUID_COMPANY_NODE',NodeProperty='__HierarchyPropertiesForI_SADL_HIER_UUID_COMPANY_NODE/NodeId',Levels=3)" + ); + + // With GUID and boolean filters — filter applied to ancestors wrapper, TopLevels unaffected + query = createQueryFromEntities( + { + ...listEntity, + semanticKeys: [ + { name: 'Company', value: 'cb565aac-b20e-1fe1-8b88-3dca3ae3111a', type: 'Edm.Guid' }, + { name: 'IsActiveEntity', value: true as unknown as string, type: 'Edm.Boolean' } + ] + }, + [], + 1, + hierarchy + ); + expect(query.query).toEqual( + "P_SADL_HIER_UUID_D_COMPNY_ROOT?$apply=ancestors($root/P_SADL_HIER_UUID_D_COMPNY_ROOT,I_SADL_HIER_UUID_COMPANY_NODE,__HierarchyPropertiesForI_SADL_HIER_UUID_COMPANY_NODE/NodeId,filter(Company eq cb565aac-b20e-1fe1-8b88-3dca3ae3111a and IsActiveEntity eq true),keep start)/com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/P_SADL_HIER_UUID_D_COMPNY_ROOT,HierarchyQualifier='I_SADL_HIER_UUID_COMPANY_NODE',NodeProperty='__HierarchyPropertiesForI_SADL_HIER_UUID_COMPANY_NODE/NodeId',Levels=3)" + ); + }); +}); + +describe('buildNavPropHierarchyQuery', () => { + const hierarchy: HierarchyEntity = { + entitySetName: 'PPS_PurOrdItemHierarchy', + entityTypeName: 'PPS_PurOrdItemHierarchyType', + qualifier: 'I_PPS_PurchaseOrderItemHNRltn', + nodeProperty: '__HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn/NodeId', + parentProperty: 'PurchasingParentItem', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: ['PurchaseOrder', 'PurchaseOrderItem'] + }; + + test('should build a nav-key-rooted TopLevels query for a non-draft list entity', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'PPS_PurchaseOrder', + semanticKeys: [{ name: 'PurchaseOrder', value: '4500003676', type: 'Edm.String' }], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + const result = buildNavPropHierarchyQuery(listEntity, '_PurchaseOrderItem', hierarchy); + expect(result).toEqual( + "PPS_PurchaseOrder(PurchaseOrder='4500003676')/_PurchaseOrderItem?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/PPS_PurchaseOrder(PurchaseOrder='4500003676')/_PurchaseOrderItem,HierarchyQualifier='I_PPS_PurchaseOrderItemHNRltn',NodeProperty='__HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn/NodeId',Levels=3)" + ); + }); + + test('should append only the draft keys that are present in entityType.keys', () => { + // Both DraftUUID and IsActiveEntity present → both appended + const listEntityBoth: ReferencedEntities['listEntity'] = { + entitySetName: 'PPS_PurchaseOrder', + semanticKeys: [{ name: 'PurchaseOrder', value: '4500003676', type: 'Edm.String' }], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [{ name: 'DraftUUID' }, { name: 'IsActiveEntity' }] } as unknown as EntityType + }; + expect(buildNavPropHierarchyQuery(listEntityBoth, '_PurchaseOrderItem', hierarchy)).toEqual( + "PPS_PurchaseOrder(PurchaseOrder='4500003676',DraftUUID=00000000-0000-0000-0000-000000000000,IsActiveEntity=true)/_PurchaseOrderItem?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/PPS_PurchaseOrder(PurchaseOrder='4500003676',DraftUUID=00000000-0000-0000-0000-000000000000,IsActiveEntity=true)/_PurchaseOrderItem,HierarchyQualifier='I_PPS_PurchaseOrderItemHNRltn',NodeProperty='__HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn/NodeId',Levels=3)" + ); + + // Only IsActiveEntity present → only IsActiveEntity appended + const listEntityActiveOnly: ReferencedEntities['listEntity'] = { + ...listEntityBoth, + entityType: { keys: [{ name: 'IsActiveEntity' }] } as unknown as EntityType + }; + expect(buildNavPropHierarchyQuery(listEntityActiveOnly, '_PurchaseOrderItem', hierarchy)).toEqual( + "PPS_PurchaseOrder(PurchaseOrder='4500003676',IsActiveEntity=true)/_PurchaseOrderItem?$apply=com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/PPS_PurchaseOrder(PurchaseOrder='4500003676',IsActiveEntity=true)/_PurchaseOrderItem,HierarchyQualifier='I_PPS_PurchaseOrderItemHNRltn',NodeProperty='__HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn/NodeId',Levels=3)" + ); + }); + + test('should use keyName over name when set (semantic key mapped to actual entity key)', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'TravelSet', + semanticKeys: [{ name: 'TravelID', keyName: 'TravelUUID', value: 'abc-123', type: 'Edm.Guid' }], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + const result = buildNavPropHierarchyQuery(listEntity, '_Items', hierarchy); + expect(result).toContain('TravelSet(TravelUUID=abc-123)/_Items'); + }); + + test('should use unquoted values for GUID and boolean keys', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'MySet', + semanticKeys: [ + { name: 'ID', value: '550e8400-e29b-41d4-a716-446655440000', type: 'Edm.Guid' }, + { name: 'IsActive', value: 'true', type: 'Edm.Boolean' } + ], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + const result = buildNavPropHierarchyQuery(listEntity, '_Children', hierarchy); + expect(result).toContain('MySet(ID=550e8400-e29b-41d4-a716-446655440000,IsActive=true)/_Children'); + }); + + test('should use only the first value when semantic key has comma-separated values', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'Orders', + semanticKeys: [{ name: 'OrderID', value: 'ORD1,ORD2', type: 'Edm.String' }], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + const result = buildNavPropHierarchyQuery(listEntity, '_Items', hierarchy); + expect(result).toContain("Orders(OrderID='ORD1')/_Items"); + expect(result).not.toContain('ORD2'); + }); + + test('should return undefined when no semantic key values are provided', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'PPS_PurchaseOrder', + semanticKeys: [], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + expect(buildNavPropHierarchyQuery(listEntity, '_PurchaseOrderItem', hierarchy)).toBeUndefined(); + }); + + test('should return undefined when all semantic keys have empty or undefined values', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'PPS_PurchaseOrder', + semanticKeys: [ + { name: 'PurchaseOrder', value: '', type: 'Edm.String' }, + { name: 'DraftUUID', value: 'some-uuid', type: 'Edm.Guid' } + ], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + // Empty value and draft key are both skipped → no key parts → undefined + expect(buildNavPropHierarchyQuery(listEntity, '_PurchaseOrderItem', hierarchy)).toBeUndefined(); + }); + + test('should skip DraftUUID and IsActiveEntity from semantic keys', () => { + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'Orders', + semanticKeys: [ + { name: 'OrderID', value: 'ORD1', type: 'Edm.String' }, + { name: 'DraftUUID', value: 'some-uuid', type: 'Edm.Guid' }, + { name: 'IsActiveEntity', value: 'true', type: 'Edm.Boolean' } + ], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + const result = buildNavPropHierarchyQuery(listEntity, '_Items', hierarchy); + expect(result).toContain("Orders(OrderID='ORD1')/_Items"); + expect(result).not.toContain('DraftUUID=some-uuid'); + expect(result).not.toContain('IsActiveEntity=true'); + }); +}); + +describe('fetchData', () => { + const mockOdataService = { + defaults: { baseURL: 'https://example.com/', headers: {} }, + get: jest.fn() + } as unknown as ODataService; + + const listEntity: ReferencedEntities['listEntity'] = { + entitySetName: 'Orders', + semanticKeys: [{ name: 'OrderID', value: 'ORD1', type: 'Edm.String' }], + navPropEntities: [], + entityPath: 'root', + entityType: { keys: [] } as unknown as EntityType + }; + + const navHierarchy: HierarchyEntity = { + entitySetName: 'OrderItems', + entityTypeName: 'OrderItemsType', + qualifier: 'ItemHierarchy', + nodeProperty: '__HP/NodeId', + parentProperty: 'ParentItem', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: ['OrderID', 'ItemID'] + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + test('should return entityData from a successful query', async () => { + const rows = [{ OrderID: 'ORD1' }]; + (mockOdataService.get as jest.Mock).mockResolvedValueOnce({ data: '', odata: () => rows }); + + const result = await fetchData(listEntity, mockOdataService, [], 1); + + expect(result.odataResult.entityData).toEqual(rows); + expect(result.odataResult.error).toBeUndefined(); + }); + + test('should return an error string when the query throws', async () => { + (mockOdataService.get as jest.Mock).mockRejectedValueOnce(new Error('Network failure')); + + const result = await fetchData(listEntity, mockOdataService, [], 1); + + expect(result.odataResult.entityData).toBeUndefined(); + expect(result.odataResult.error).toContain('Network failure'); + }); + + test('should issue a nav-prop hierarchy query and patch matching expanded items', async () => { + const mainRows = [ + { + OrderID: 'ORD1', + _Items: [ + { OrderID: 'ORD1', ItemID: '10', __HP: null }, + { OrderID: 'ORD1', ItemID: '20', __HP: null } + ] + } + ]; + const navRows = [ + { OrderID: 'ORD1', ItemID: '10', __HP: { NodeId: 'node-1', DistanceFromRoot: 0 } }, + { OrderID: 'ORD1', ItemID: '20', __HP: { NodeId: 'node-2', DistanceFromRoot: 1 } } + ]; + + (mockOdataService.get as jest.Mock) + .mockResolvedValueOnce({ data: '', odata: () => mainRows }) + .mockResolvedValueOnce({ data: '', odata: () => navRows }); + + const selectedEntities = [ + { fullPath: '_Items', entity: { entitySetName: 'OrderItems', entityPath: '_Items' } } + ] as any[]; + + const result = await fetchData(listEntity, mockOdataService, selectedEntities, 1, undefined, [navHierarchy]); + + const items = (result.odataResult.entityData as any[])[0]['_Items'] as any[]; + expect(items[0]['__HP']).toEqual({ NodeId: 'node-1', DistanceFromRoot: 0 }); + expect(items[1]['__HP']).toEqual({ NodeId: 'node-2', DistanceFromRoot: 1 }); + expect(mockOdataService.get).toHaveBeenCalledTimes(2); + }); + + test('should skip nav-prop hierarchy query when no selected entity matches', async () => { + const mainRows = [{ OrderID: 'ORD1' }]; + (mockOdataService.get as jest.Mock).mockResolvedValueOnce({ data: '', odata: () => mainRows }); + + // selectedEntities has a different entity set — no match for navHierarchy + const selectedEntities = [ + { fullPath: '_Other', entity: { entitySetName: 'OtherSet', entityPath: '_Other' } } + ] as any[]; + + const result = await fetchData(listEntity, mockOdataService, selectedEntities, 1, undefined, [navHierarchy]); + + expect(mockOdataService.get).toHaveBeenCalledTimes(1); + expect(result.odataResult.entityData).toEqual(mainRows); + }); + + test('should skip nav-prop hierarchy query when buildNavPropHierarchyQuery returns undefined', async () => { + const mainRows = [{ OrderID: 'ORD1' }]; + (mockOdataService.get as jest.Mock).mockResolvedValueOnce({ data: '', odata: () => mainRows }); + + const noKeyEntity: ReferencedEntities['listEntity'] = { + ...listEntity, + semanticKeys: [] // no keys → buildNavPropHierarchyQuery returns undefined + }; + const selectedEntities = [ + { fullPath: '_Items', entity: { entitySetName: 'OrderItems', entityPath: '_Items' } } + ] as any[]; + + const result = await fetchData(noKeyEntity, mockOdataService, selectedEntities, 1, undefined, [navHierarchy]); + + expect(mockOdataService.get).toHaveBeenCalledTimes(1); + expect(result.odataResult.entityData).toEqual(mainRows); + }); + + test('should skip patching when nav query returns no data', async () => { + const mainRows = [{ OrderID: 'ORD1', _Items: [{ OrderID: 'ORD1', ItemID: '10', __HP: null }] }]; + (mockOdataService.get as jest.Mock) + .mockResolvedValueOnce({ data: '', odata: () => mainRows }) + .mockResolvedValueOnce({ data: '', odata: () => undefined }); // nav query returns no data + + const selectedEntities = [ + { fullPath: '_Items', entity: { entitySetName: 'OrderItems', entityPath: '_Items' } } + ] as any[]; + + const result = await fetchData(listEntity, mockOdataService, selectedEntities, 1, undefined, [navHierarchy]); + + // __HP untouched — merge skipped + const items = (result.odataResult.entityData as any[])[0]['_Items'] as any[]; + expect(items[0]['__HP']).toBeNull(); + }); + + test('should skip patching root records where nav prop is not an array', async () => { + const mainRows = [ + { OrderID: 'ORD1', _Items: null }, // null — not an array + { OrderID: 'ORD2' } // missing property entirely + ]; + const navRows = [{ OrderID: 'ORD1', ItemID: '10', __HP: { NodeId: 'node-1' } }]; + + (mockOdataService.get as jest.Mock) + .mockResolvedValueOnce({ data: '', odata: () => mainRows }) + .mockResolvedValueOnce({ data: '', odata: () => navRows }); + + const selectedEntities = [ + { fullPath: '_Items', entity: { entitySetName: 'OrderItems', entityPath: '_Items' } } + ] as any[]; + + expect(async () => + fetchData(listEntity, mockOdataService, selectedEntities, 1, undefined, [navHierarchy]) + ).not.toThrow(); + }); }); diff --git a/packages/generator-odata-downloader/test/prompts/__snapshots__/prompt-helpers.test.ts.snap b/packages/generator-odata-downloader/test/prompts/__snapshots__/prompt-helpers.test.ts.snap index 039ce7e77bc..80e0a3a1dd8 100644 --- a/packages/generator-odata-downloader/test/prompts/__snapshots__/prompt-helpers.test.ts.snap +++ b/packages/generator-odata-downloader/test/prompts/__snapshots__/prompt-helpers.test.ts.snap @@ -162,14 +162,18 @@ exports[`Test createEntityChoices should create entity set choices based on app ], "entitySetsFlat": { "_Agency": "TravelAgency", - "_BookSupplement": "BookingSupplement", + "_Agency/_Country": "Country", "_Booking": "Booking", - "_Carrier": "Airline", - "_Country": "Country", + "_Booking/_BookSupplement": "BookingSupplement", + "_Booking/_BookSupplement/_Product": "Supplement", + "_Booking/_BookSupplement/_SupplementText": "SupplementText", + "_Booking/_Carrier": "Airline", + "_Booking/_Carrier/_Currency": "Currency", + "_Booking/_Customer": "Passenger", + "_Booking/_Customer/_Country": "Country", "_Currency": "Currency", "_Customer": "Passenger", - "_Product": "Supplement", - "_SupplementText": "SupplementText", + "_Customer/_Country": "Country", }, } `; diff --git a/packages/generator-odata-downloader/test/prompts/prompt-helpers.test.ts b/packages/generator-odata-downloader/test/prompts/prompt-helpers.test.ts index 2f9e61988d3..7b7ad1e3b2a 100644 --- a/packages/generator-odata-downloader/test/prompts/prompt-helpers.test.ts +++ b/packages/generator-odata-downloader/test/prompts/prompt-helpers.test.ts @@ -336,8 +336,8 @@ describe('Test createEntityChoices', () => { // Verify entitySetsFlat contains all entity sets expect(result!.entitySetsFlat).toEqual({ _Booking: 'Booking', - _BookSupplement: 'BookingSupplement', - _Carrier: 'Airline' + '_Booking/_BookSupplement': 'BookingSupplement', + '_Booking/_Carrier': 'Airline' }); }); @@ -414,6 +414,76 @@ describe('Test createEntityChoices', () => { expect(result!.choices.find((c) => c.name === '_Booking')?.checked).toBe(false); }); + test('should show disabled hierarchy indicator and skip self-referential nav prop when hierarchy entities are provided', () => { + const rootEntity: Entity = { + entitySetName: 'SalesOrganizations', + entityPath: 'SalesOrganizations', + entityType: { + name: 'SalesOrgType', + fullyQualifiedName: 'SalesOrgType' + } as EntityType, + navPropEntities: [ + { + entitySetName: 'SalesOrganizations', + entityPath: '_Superordinate', + entityType: { + name: 'SalesOrgType', + fullyQualifiedName: 'SalesOrgType' + } as EntityType, + navPropEntities: [] + }, + { + entitySetName: 'Country', + entityPath: '_Country', + entityType: { name: 'CountryType', fullyQualifiedName: 'CountryType' } as EntityType, + navPropEntities: [] + } + ] + }; + + const result = createEntityChoices(rootEntity); + + expect(result).toBeDefined(); + // Self-ref nav prop should NOT be a selectable choice; only _Country is selectable + expect(result!.choices).toHaveLength(1); + expect(result!.choices[0].name).toBe('_Country'); + }); + + test('should skip self-referential nav prop when no hierarchy entities provided', () => { + const rootEntity: Entity = { + entitySetName: 'SalesOrganizations', + entityPath: 'SalesOrganizations', + entityType: { + name: 'SalesOrgType', + fullyQualifiedName: 'SalesOrgType' + } as EntityType, + navPropEntities: [ + { + entitySetName: 'SalesOrganizations', + entityPath: '_Superordinate', + entityType: { + name: 'SalesOrgType', + fullyQualifiedName: 'SalesOrgType' + } as EntityType, + navPropEntities: [] + }, + { + entitySetName: 'Country', + entityPath: '_Country', + entityType: { name: 'CountryType', fullyQualifiedName: 'CountryType' } as EntityType, + navPropEntities: [] + } + ] + }; + + const result = createEntityChoices(rootEntity); + + expect(result).toBeDefined(); + // Self-referential nav prop should be excluded without hierarchy info + expect(result!.choices).toHaveLength(1); + expect(result!.choices[0].name).toBe('_Country'); + }); + it('should create entity set choices based on app model (from specification)', async () => { // Prevent spec from fetching versions and writing on test jobs jest.spyOn(commandMock, 'execNpmCommand').mockResolvedValueOnce('{"latest": "1.142.1"}'); diff --git a/packages/generator-odata-downloader/test/prompts/prompts.test.ts b/packages/generator-odata-downloader/test/prompts/prompts.test.ts index 6b44a8a200c..f158182bc7b 100644 --- a/packages/generator-odata-downloader/test/prompts/prompts.test.ts +++ b/packages/generator-odata-downloader/test/prompts/prompts.test.ts @@ -669,6 +669,9 @@ describe('Test prompts', () => { const result = await getODataDownloaderPrompts(); result.answers.application.relatedEntityChoices.choices = mockChoices; + result.answers.application.referencedEntities = { + listEntity: createListEntity([{ name: 'TravelID', type: 'Edm.String', value: 'testKey' }]) + }; const freshEntityPrompt = result.questions.find( (q: any) => q.name === promptNames.relatedEntitySelection @@ -698,6 +701,9 @@ describe('Test prompts', () => { const result = await getODataDownloaderPrompts(); result.answers.application.relatedEntityChoices.choices = mockChoices; + result.answers.application.referencedEntities = { + listEntity: createListEntity([{ name: 'TravelID', type: 'Edm.String', value: 'testKey' }]) + }; const freshEntityPrompt = result.questions.find( (q: any) => q.name === promptNames.relatedEntitySelection @@ -734,6 +740,9 @@ describe('Test prompts', () => { const result = await getODataDownloaderPrompts(); result.answers.application.relatedEntityChoices.choices = mockChoices; + result.answers.application.referencedEntities = { + listEntity: createListEntity([{ name: 'TravelID', type: 'Edm.String', value: 'testKey' }]) + }; const freshEntityPrompt = result.questions.find( (q: any) => q.name === promptNames.relatedEntitySelection @@ -1207,17 +1216,45 @@ describe('Test prompts', () => { }); it('should validate range values', async () => { - const keyPrompt = keyPrompts[0]; - const result = await keyPrompt.validate!('1-10'); + const result = await getODataDownloaderPrompts(); + const appConfig = result.answers.application; + appConfig.referencedEntities = { + listEntity: { + entitySetName: 'TestSet', + semanticKeys: [{ name: 'TravelID', type: 'Edm.String', value: undefined }], + entityPath: 'TestSet', + entityType: undefined + } + }; + const rangeKeyPrompts = result.questions.filter((q: any) => + q.name?.startsWith('entityKeyIdx:') + ) as InputQuestion[]; + const keyPrompt = rangeKeyPrompts[0]; + const validateResult = await keyPrompt.validate!('1-10'); - expect(result).toBe(true); + expect(validateResult).toBe(true); }); it('should reject invalid range specification', async () => { - const keyPrompt = keyPrompts[0]; - const result = await keyPrompt.validate!('1-10-20'); + const result = await getODataDownloaderPrompts(); + const appConfig = result.answers.application; + appConfig.referencedEntities = { + listEntity: { + entitySetName: 'TestSet', + semanticKeys: [{ name: 'TravelID', type: 'Edm.String', value: undefined }], + entityPath: 'TestSet', + entityType: undefined + } + }; + const rangeKeyPrompts = result.questions.filter((q: any) => + q.name?.startsWith('entityKeyIdx:') + ) as InputQuestion[]; + const keyPrompt = rangeKeyPrompts[0]; + const validateResult = await keyPrompt.validate!('1-10-20'); - expect(result).toBe("Invalid range specified, only the lowest and highest values allowed. e.g. '1-10'"); + expect(validateResult).toBe( + "Invalid range specified, only the lowest and highest values allowed. e.g. '1-10'" + ); }); it('should not validate UUIDs as ranges', async () => { @@ -1251,6 +1288,99 @@ describe('Test prompts', () => { expect(validateResult).toBe(true); }); + it('should reject invalid GUID format', async () => { + (getHostEnvironment as jest.Mock).mockReturnValue(hostEnvironment.vscode); + (getSystemSelectionQuestions as jest.Mock).mockResolvedValue({ + prompts: [], + answers: {} + }); + + const result = await getODataDownloaderPrompts(); + const appConfig = result.answers.application; + + appConfig.referencedEntities = { + listEntity: { + entitySetName: 'TestSet', + semanticKeys: [{ name: 'ID', type: 'Edm.Guid', value: undefined }], + entityPath: 'TestSet', + entityType: undefined + } + }; + + const newKeyPrompts = result.questions.filter((q: any) => + q.name?.startsWith('entityKeyIdx:') + ) as InputQuestion[]; + const keyPrompt = newKeyPrompts[0]; + + const validateResult = await keyPrompt.validate!('not-a-valid-guid'); + + expect(validateResult).toBe('Invalid GUID format. Expected format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'); + }); + + it('should accept valid GUID format', async () => { + (getHostEnvironment as jest.Mock).mockReturnValue(hostEnvironment.vscode); + (getSystemSelectionQuestions as jest.Mock).mockResolvedValue({ + prompts: [], + answers: {} + }); + + const result = await getODataDownloaderPrompts(); + const appConfig = result.answers.application; + + appConfig.referencedEntities = { + listEntity: { + entitySetName: 'TestSet', + semanticKeys: [{ name: 'ID', type: 'Edm.Guid', value: undefined }], + entityPath: 'TestSet', + entityType: undefined + } + }; + + const newKeyPrompts = result.questions.filter((q: any) => + q.name?.startsWith('entityKeyIdx:') + ) as InputQuestion[]; + const keyPrompt = newKeyPrompts[0]; + + const validateResult = await keyPrompt.validate!('550e8400-e29b-41d4-a716-446655440000'); + + expect(validateResult).toBe(true); + }); + + it('should validate comma-separated GUIDs', async () => { + (getHostEnvironment as jest.Mock).mockReturnValue(hostEnvironment.vscode); + (getSystemSelectionQuestions as jest.Mock).mockResolvedValue({ + prompts: [], + answers: {} + }); + + const result = await getODataDownloaderPrompts(); + const appConfig = result.answers.application; + + appConfig.referencedEntities = { + listEntity: { + entitySetName: 'TestSet', + semanticKeys: [{ name: 'ID', type: 'Edm.Guid', value: undefined }], + entityPath: 'TestSet', + entityType: undefined + } + }; + + const newKeyPrompts = result.questions.filter((q: any) => + q.name?.startsWith('entityKeyIdx:') + ) as InputQuestion[]; + const keyPrompt = newKeyPrompts[0]; + + // Valid comma-separated GUIDs + const validResult = await keyPrompt.validate!( + '550e8400-e29b-41d4-a716-446655440000,a1b2c3d4-e5f6-7890-abcd-ef1234567890' + ); + expect(validResult).toBe(true); + + // One invalid GUID in comma-separated list + const invalidResult = await keyPrompt.validate!('550e8400-e29b-41d4-a716-446655440000,invalid-guid'); + expect(invalidResult).toBe('Invalid GUID format. Expected format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'); + }); + it('should validate boolean values', async () => { // Create a mock app config with a boolean key (getHostEnvironment as jest.Mock).mockReturnValue(hostEnvironment.vscode); diff --git a/packages/generator-odata-downloader/test/test-data/test-apps/purchaseorder/webapp/localService/mainService/metadata.xml b/packages/generator-odata-downloader/test/test-data/test-apps/purchaseorder/webapp/localService/mainService/metadata.xml new file mode 100644 index 00000000000..4b41de116f1 --- /dev/null +++ b/packages/generator-odata-downloader/test/test-data/test-apps/purchaseorder/webapp/localService/mainService/metadata.xml @@ -0,0 +1,36833 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_ocemrecrole/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitememail.outputrequestitememailrole'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _OutputRequest + _OutputRequestItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __HierarchyPropertiesForR_PPS_POItmNvtnPrtnRefHNRltn + + + + + + + + + __HierarchyPropertiesForR_PPS_POItmNvtnPrtnRefHNRltn + + + + + + + + + + + + + + + + + + + + _Parent + + + + + + + + + + + + + + + PartnerFunction + + + + + + + + + + + + filter + orderby + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + __EntityControl + + + + + + + + + __EntityControl + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PPSExtPubgSystemRelation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSExtPubgSystLogHandle + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrderQuantityUnit + + + + + + + + + + + + + + + + + + DocumentCurrency + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DocumentCurrency + + + + + + + + + + + DocumentCurrency + + + + + + + + + DocumentCurrency + + + + + + + + + DocumentCurrency + + + + + + + + + PurchaseOrderQuantityUnit + + + + + + + + + PurchaseOrderQuantityUnit + + + + + + + + + + DocumentCurrency + + + + + + + + + + + DocumentCurrency + + + + + + + + DocumentCurrency + + + + + + + + + PurchaseOrderQuantityUnit + + + + + + + + + DocumentCurrency + + + + + + + + + PurchaseOrderQuantityUnit + + + + + + + + + PurchaseOrderQuantityUnit + + + + + + + + + PurchaseOrderQuantityUnit + + + + + + + + + DocumentCurrency + + + + + + + + + DocumentCurrency + + + + + + + + + + + filter + identity + orderby + search + skip + top + groupby + aggregate + concat + + + + + AccountAssignmentCategory + AcctAssignmentCategoryName + ActivePurchasingDocument + DocumentCurrency + Material + MaterialGroup + MaterialGroupName + MaterialName + Plant + PlantName + PPSConfigurableLineItemNumber + PPSOptionalItemStatus + PPSOptionalItemStatusText + PPSPurOrderItemStatus + PPSPurOrderItemStatusText + PPSPurOrdItemStatusCriticality + ProductTypeCode + ProductTypeName + PurchaseOrder + PurchaseOrderItem + PurchaseOrderItemText + PurchaseOrderQuantityUnit + PurchasingParentItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrder + PurchaseOrderItem + PPSPurOrdItemStatusCriticality + + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + eq + ne + gt + ge + lt + le + and + or + contains + startswith + endswith + any + all + + + + + + + + + + + application/json + application/pdf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AccountAssignmentCategory + + + + + + + + + + MaterialGroup + + + + + + + + + + Material + + + + + + + + + + + Plant + + + + + + + + + PPSOptionalItemStatus + + + + + + + + PPSPurOrderItemStatus + + + + + + + + + + + + ProductTypeCode + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LegalTransaction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UnasLiObFrLgTrnExIsEnabled + UpdtLglDocAgreementIsEnabled + UpdtLglTransFrmPurOrdIsEnabled + CrteLglDocAmendmentIsEnabled + CreateLegalDocumentIsEnabled + UICT_HideUnassgLglTransacActn + DocumentDescription + NumberOfDocuments + LegalTransactionLinkdObjUUID + LegalTransactionUUID + LglCntntMLinkdObj + LglCntntMIntegrationLink + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + LegalTransactionIsTriggerObj + LegalDocument + NumberOfDocuments + DocumentDescription + LglCntntMDocStatusName + LglCntntMDocAgrmtBizStatus + LglCntntMContractTypeName + LglCntntMAgreementSystemID + LglCntntMAgreementName + CreateLegalDocumentIsEnabled + CrteLglDocAmendmentIsEnabled + UpdtLglTransFrmPurOrdIsEnabled + UpdtLglDocAgreementIsEnabled + UnasLiObFrLgTrnExIsEnabled + + + + + + + + + LegalTransactionIsTriggerObj + LegalDocument + NumberOfDocuments + DocumentDescription + LglCntntMDocStatusName + LglCntntMDocAgrmtBizStatus + LglCntntMContractTypeName + LglCntntMAgreementSystemID + LglCntntMAgreementName + CreateLegalDocumentIsEnabled + CrteLglDocAmendmentIsEnabled + UpdtLglTransFrmPurOrdIsEnabled + UpdtLglDocAgreementIsEnabled + UnasLiObFrLgTrnExIsEnabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + FileName + FileSize + __EntityControl + __FieldControl + + + + + + + + + + + + + + + + + + + + + + FileName + FileSize + __EntityControl + __FieldControl + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _OutputRequest + _OutputRequestItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _OutputRequestItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_plantvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.plant'/$metadata + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_currencystdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.documentcurrency'/$metadata + + + + + + + + + + + ../../../../srvd_f4/sap/c_productunitofmeasurevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.purchaseorderquantityunit'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorditemcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.purordexternalitemcategory'/$metadata + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_materialvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.manufacturermaterial'/$metadata + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_materialgroupvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.materialgroup'/$metadata + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_producttypevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.producttypecode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_storlocvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.storagelocation'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_serviceperformervaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.serviceperformer'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_productunitofmeasurevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.orderpriceunit'/$metadata + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_incotermvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.incotermsclassification'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_confirmationcontrolvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.supplierconfirmationcontrolkey'/$metadata + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_acctassgmtcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.accountassignmentcategory'/$metadata + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_acctassgmtdistrindvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.multipleacctassgmtdistribution'/$metadata + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_partialinvoiceindvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.partialinvoicedistribution'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purordertaxcodevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.taxcode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_contractforlimitsvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.purcontractforoveralllimit'/$metadata + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_commitmentitemvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.commitmentitemshortid'/$metadata + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_fundvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.fund'/$metadata + + + + + + + + + + + ../../../../srvd_f4/sap/i_budgetperiodstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.budgetperiod'/$metadata + + + + + + + + + + + ../../../../srvd_f4/sap/i_fundscenterlatestvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.fundscenter'/$metadata + + + + + + + + + + + + ../../../../srvd_f4/sap/i_fndsmgmtfuncnlareastdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.functionalarea'/$metadata + + + + + + + + + + + ../../../../srvd_f4/sap/i_grantstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.grantid'/$metadata + + + + + + + + + + + ../../../../srvd_f4/sap/i_emrkdfndsdocumentitemmmvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.earmarkedfundsdocument'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_pricingarrangementtypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.ppspricingarrangementtype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorderitemstatusvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.ppspurorderitemstatus'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdoctolerancekeyvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.ppsdeliverytolerancekey'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_pps_optionalitemstatusvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.ppsoptionalitemstatus'/$metadata + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_contactbusinessuservh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.ppsresponsiblepurchaser'/$metadata + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_downpaymentcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchy.downpaymenttype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AcctAssgmtUndistributedQty + AcctAssgmtUndistributedAmt + AcctAssgmtUndistributedPct + UICT_AcctAssgmtUndistriQty + UICT_HideOpenText + UICT_AcctAssgmtUndistriAmt + UICT_PartInvcDistribution + UICT_AcctAssgmtUndistriPct + UICT_HideMaterial + UICT_HideNetPriceAmount + UICT_HideScheduleline + UICT_HideNetPriceAmtEnhLim + UICT_PriceArrngIsNotEnabled + UICT_PACeilingAmount + UICT_PAMaximumFees + UICT_PAMinimumFees + UICT_PAGovtShareAbove + UICT_PAGovtShareBelow + UICT_PriceArrngMatCollFacet + UICT_PAVALUESISNOTENABLED + UICT_PASHARESISNOTENABLED + AccountAssignmentIsAddable + ScheduleLineIsAddable + PurchaseOrderItemNetAmount + UICT_AccAssCategoryFields + UICT_PurgDocItmIsNotOptnl + UICT_HideItemStatusHeaderFacet + UICT_OptionsIsNotEnabled + UICT_PurOrderItemNetAmount + UICT_HideSmartNumberItem + UICT_HideRespPurchaser + UICT_HideSmrtNmbrItemIsManual + UICT_HideDocumentHistoryFacet + UICT_HideProcessFlowFacet + UICT_HidePricingFacet + UICT_HidePricingSubtotalsFacet + UICT_HidePurOrdAmtInAccAssn + UICT_HidePurOrdAmtCalInAccAssn + UICT_HidePurOrdPercInAccAssn + UICT_HidePurOrdPercCalInAccAss + UICT_HideServicePerformer + UICT_HideOverallLimit + UICT_HideExpectedValue + UICT_HideContractForLimits + UICT_HideQuantity + UICT_HideOrderPriceUnit + UICT_HidePaymentPlanFacet + UICT_HideItemPartnerFacet + UICT_HideSourceofSupplyFacet + UICT_Hide_OpentextItemFacet + UICT_HideToleranceKey + UICT_HideIsIncrmtlFnddItm + UICT_IsUnfunded + UICT_StorageLocation + UICT_OpenTextURL + UICT_JuridictionCode + UICT_HideFundsRequest + UICT_HideDownpayment + UICT_HideRetention + UICT_HideAcceptanceAtOrigin + UICT_HideDownpaymentfields + UICT_HideSuppConfirmationFacet + UICT_HideSuppConfSubFacet + UICT_HideRetentionitempct + UICT_PPSIsAttachmentEnabled + PPSPurchaseOrderItemUUID + UICT_HideItemCommitmentItem + UICT_HideItemFund + UICT_HideItemFundsCenter + UICT_HideItemEmrkdFndsDocItem + UICT_HideItemEmrkdFundsDoc + UICT_HideItemGrant + UICT_HideItemBudgetPeriod + UICT_HideItemFunctionalArea + __HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn + + + + + + + + + AcctAssgmtUndistributedQty + AcctAssgmtUndistributedAmt + AcctAssgmtUndistributedPct + UICT_AcctAssgmtUndistriQty + UICT_HideOpenText + UICT_AcctAssgmtUndistriAmt + UICT_PartInvcDistribution + UICT_AcctAssgmtUndistriPct + UICT_HideMaterial + UICT_HideNetPriceAmount + UICT_HideScheduleline + UICT_HideNetPriceAmtEnhLim + UICT_PriceArrngIsNotEnabled + UICT_PACeilingAmount + UICT_PAMaximumFees + UICT_PAMinimumFees + UICT_PAGovtShareAbove + UICT_PAGovtShareBelow + UICT_PriceArrngMatCollFacet + UICT_PAVALUESISNOTENABLED + UICT_PASHARESISNOTENABLED + AccountAssignmentIsAddable + ScheduleLineIsAddable + PurchaseOrderItemNetAmount + UICT_AccAssCategoryFields + UICT_PurgDocItmIsNotOptnl + UICT_HideItemStatusHeaderFacet + UICT_OptionsIsNotEnabled + UICT_PurOrderItemNetAmount + UICT_HideSmartNumberItem + UICT_HideRespPurchaser + UICT_HideSmrtNmbrItemIsManual + UICT_HideDocumentHistoryFacet + UICT_HideProcessFlowFacet + UICT_HidePricingFacet + UICT_HidePricingSubtotalsFacet + UICT_HidePurOrdAmtInAccAssn + UICT_HidePurOrdAmtCalInAccAssn + UICT_HidePurOrdPercInAccAssn + UICT_HidePurOrdPercCalInAccAss + UICT_HideServicePerformer + UICT_HideOverallLimit + UICT_HideExpectedValue + UICT_HideContractForLimits + UICT_HideQuantity + UICT_HideOrderPriceUnit + UICT_HidePaymentPlanFacet + UICT_HideItemPartnerFacet + UICT_HideSourceofSupplyFacet + UICT_Hide_OpentextItemFacet + UICT_HideToleranceKey + UICT_HideIsIncrmtlFnddItm + UICT_IsUnfunded + UICT_StorageLocation + UICT_OpenTextURL + UICT_JuridictionCode + UICT_HideFundsRequest + UICT_HideDownpayment + UICT_HideRetention + UICT_HideAcceptanceAtOrigin + UICT_HideDownpaymentfields + UICT_HideSuppConfirmationFacet + UICT_HideSuppConfSubFacet + UICT_HideRetentionitempct + UICT_PPSIsAttachmentEnabled + PPSPurchaseOrderItemUUID + UICT_HideItemCommitmentItem + UICT_HideItemFund + UICT_HideItemFundsCenter + UICT_HideItemEmrkdFndsDocItem + UICT_HideItemEmrkdFundsDoc + UICT_HideItemGrant + UICT_HideItemBudgetPeriod + UICT_HideItemFunctionalArea + __HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn + + + + + + + + + + + + + + + + + + + + _Parent + _PricingElementSubtotals + _PurchaseOrderDocumentHistory + _PurOrdFundsRequest + _PurOrdItemParentToChild + _PurOrdSupplierConfirmation + _ToleranceKey + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrderItem + PurchaseOrder + + + + + + + + + + + + filter + orderby + search + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSPurchaseOrderItemUUID + TaxCalculationProcedure + PPSPurchaseOrderIsThirdParty + PPSPricingArrangementTypeText + PPSIsPrcgArrgmtChildItm + PPSPricingArrangementType + UICT_OptionsIsNotEnabled + UICT_PurgDocItmIsNotOptnl + PurchasingParentItem + PurgExternalSortNumber + IsDeleted + PurchasingDocumentDeletionCode + PurchasingIsItemSet + + + + + @SAP__UI.LineItem + + + + + + + ManufacturerMaterial + MaterialGroup + Plant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_plantvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.plant'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_currency/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.documentcurrency'/$metadata + + + + + + + + + + + + ../../../../srvd_f4/sap/c_productunitofmeasurevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.purchaseorderquantityunit'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorditemcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.purordexternalitemcategory'/$metadata + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_materialvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.manufacturermaterial'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_materialgroupvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.materialgroup'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_producttypevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.producttypecode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_storlocvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.storagelocation'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_serviceperformervaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.serviceperformer'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_productunitofmeasurevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.orderpriceunit'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_incotermvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.incotermsclassification'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_confirmationcontrolvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.supplierconfirmationcontrolkey'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_acctassgmtcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.accountassignmentcategory'/$metadata + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_acctassgmtdistrindvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.multipleacctassgmtdistribution'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_partialinvoiceindvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.partialinvoicedistribution'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purordertaxcodevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.taxcode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_ppsitemprocesstypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.ppsitemprocesstype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_contractforlimitsvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.purcontractforoveralllimit'/$metadata + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_commitmentitemvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.commitmentitemshortid'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_fundvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.fund'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_budgetperiodstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.budgetperiod'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_fundscenterlatestvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.fundscenter'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_fndsmgmtfuncnlareastdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.functionalarea'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_grantstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.grantid'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_earmarkedfundsstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.earmarkedfundsdocument'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_pricingarrangementtypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.ppspricingarrangementtype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorderitemstatusvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.ppspurorderitemstatus'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdoctolerancekeyvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.ppsdeliverytolerancekey'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_pps_optionalitemstatusvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.ppsoptionalitemstatus'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_contactbusinessuservh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.ppsresponsiblepurchaser'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_downpaymentcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemhierarchytp_2.downpaymenttype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + AcctAssgmtUndistributedQty + ValidityEndDateIsHdn + PPSPurOrderItemNotesFacetIsHdn + AcctAssgmtUndistributedAmt + AcctAssgmtUndistributedPct + UICT_AcctAssgmtUndistriQty + UICT_HideOpenText + UICT_PPSBusinessWrkspcIsHidden + CreateItemBusinessWrkspcIsHdn + CreatePaymentPlanIsHidden + UICT_AcctAssgmtUndistriAmt + UICT_PartInvcDistribution + UICT_AcctAssgmtUndistriPct + UICT_HideMaterial + UICT_HideNetPriceAmount + UICT_HideScheduleline + UICT_HideNetPriceAmtEnhLim + PPSBusinessWorkspaceURL + UICT_PPSBusinessWorkspaceEnbld + UICT_PriceArrngIsNotEnabled + UICT_PACeilingAmount + UICT_PAMaximumFees + UICT_PAMinimumFees + UICT_PAGovtShareAbove + UICT_PAGovtShareBelow + UICT_PriceArrngMatCollFacet + UICT_PAVALUESISNOTENABLED + UICT_PASHARESISNOTENABLED + AccountAssignmentIsAddable + ScheduleLineIsAddable + UICT_HidePPAFacet + PurchaseOrderItemNetAmount + UICT_AccAssCategoryFields + UICT_PurgDocItmIsNotOptnl + UICT_HideItemStatusHeaderFacet + UICT_OptionsIsNotEnabled + UICT_PurOrderItemNetAmount + UICT_HideSmartNumberItem + UICT_HideRespPurchaser + UICT_HideSmrtNmbrItemIsManual + UICT_HideDocumentHistoryFacet + UICT_HideProcessFlowFacet + UICT_HidePricingFacet + UICT_HidePricingSubtotalsFacet + UICT_HidePurOrdAmtInAccAssn + UICT_HidePurOrdAmtCalInAccAssn + UICT_HidePurOrdPercInAccAssn + UICT_HidePurOrdPercCalInAccAss + UICT_HideServicePerformer + UICT_HideOverallLimit + UICT_HideExpectedValue + UICT_HideContractForLimits + UICT_HideQuantity + UICT_HideOrderPriceUnit + UICT_HidePaymentPlanFacet + PPSPurOrdItmNvtnPrtnFacetIsHdn + UICT_HideSourceofSupplyFacet + UICT_Hide_OpentextItemFacet + UICT_HideToleranceKey + PPSBizWorkspaceMessageText + PPSBusinessWorkspaceStatus + UICT_HideIsIncrmtlFnddItm + UICT_IsUnfunded + UICT_StorageLocation + UICT_OpenTextURL + UICT_JuridictionCode + UICT_HideFundsRequest + UICT_HideDownpayment + UICT_HideRetention + UICT_HideAcceptanceAtOrigin + UICT_HideDownpaymentfields + UICT_HideSuppConfirmationFacet + UICT_HideSuppConfSubFacet + UICT_HideRetentionitempct + UICT_PPSIsAttachmentEnabled + PPSPurchaseOrderItemUUID + UICT_HideItemCommitmentItem + UICT_HideItemFund + UICT_HideItemFundsCenter + UICT_HideItemEmrkdFndsDocItem + UICT_HideItemEmrkdFundsDoc + UICT_HideItemGrant + UICT_HideItemBudgetPeriod + UICT_HideItemFunctionalArea + UICT_OrderID + UICT_SalesOrder + UICT_HideActionBlockItem + UICT_HideActionUnblockItem + UICT_HideActionExerOptnlItm + UICT_HideActionCrItmBzWsp + PPSPurOrdItemPartnerFacetIsHdn + PPSPurgDItmHasLotBsdDistrIsHdn + __HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + + + + + + + + + + + + + AcctAssgmtUndistributedQty + ValidityEndDateIsHdn + PPSPurOrderItemNotesFacetIsHdn + AcctAssgmtUndistributedAmt + AcctAssgmtUndistributedPct + UICT_AcctAssgmtUndistriQty + UICT_HideOpenText + UICT_PPSBusinessWrkspcIsHidden + CreateItemBusinessWrkspcIsHdn + CreatePaymentPlanIsHidden + UICT_AcctAssgmtUndistriAmt + UICT_PartInvcDistribution + UICT_AcctAssgmtUndistriPct + UICT_HideMaterial + UICT_HideNetPriceAmount + UICT_HideScheduleline + UICT_HideNetPriceAmtEnhLim + PPSBusinessWorkspaceURL + UICT_PPSBusinessWorkspaceEnbld + UICT_PriceArrngIsNotEnabled + UICT_PACeilingAmount + UICT_PAMaximumFees + UICT_PAMinimumFees + UICT_PAGovtShareAbove + UICT_PAGovtShareBelow + UICT_PriceArrngMatCollFacet + UICT_PAVALUESISNOTENABLED + UICT_PASHARESISNOTENABLED + AccountAssignmentIsAddable + ScheduleLineIsAddable + UICT_HidePPAFacet + PurchaseOrderItemNetAmount + UICT_AccAssCategoryFields + UICT_PurgDocItmIsNotOptnl + UICT_HideItemStatusHeaderFacet + UICT_OptionsIsNotEnabled + UICT_PurOrderItemNetAmount + UICT_HideSmartNumberItem + UICT_HideRespPurchaser + UICT_HideSmrtNmbrItemIsManual + UICT_HideDocumentHistoryFacet + UICT_HideProcessFlowFacet + UICT_HidePricingFacet + UICT_HidePricingSubtotalsFacet + UICT_HidePurOrdAmtInAccAssn + UICT_HidePurOrdAmtCalInAccAssn + UICT_HidePurOrdPercInAccAssn + UICT_HidePurOrdPercCalInAccAss + UICT_HideServicePerformer + UICT_HideOverallLimit + UICT_HideExpectedValue + UICT_HideContractForLimits + UICT_HideQuantity + UICT_HideOrderPriceUnit + UICT_HidePaymentPlanFacet + PPSPurOrdItmNvtnPrtnFacetIsHdn + UICT_HideSourceofSupplyFacet + UICT_Hide_OpentextItemFacet + UICT_HideToleranceKey + PPSBizWorkspaceMessageText + PPSBusinessWorkspaceStatus + UICT_HideIsIncrmtlFnddItm + UICT_IsUnfunded + UICT_StorageLocation + UICT_OpenTextURL + UICT_JuridictionCode + UICT_HideFundsRequest + UICT_HideDownpayment + UICT_HideRetention + UICT_HideAcceptanceAtOrigin + UICT_HideDownpaymentfields + UICT_HideSuppConfirmationFacet + UICT_HideSuppConfSubFacet + UICT_HideRetentionitempct + UICT_PPSIsAttachmentEnabled + PPSPurchaseOrderItemUUID + UICT_HideItemCommitmentItem + UICT_HideItemFund + UICT_HideItemFundsCenter + UICT_HideItemEmrkdFndsDocItem + UICT_HideItemEmrkdFundsDoc + UICT_HideItemGrant + UICT_HideItemBudgetPeriod + UICT_HideItemFunctionalArea + UICT_OrderID + UICT_SalesOrder + UICT_HideActionBlockItem + UICT_HideActionUnblockItem + UICT_HideActionExerOptnlItm + UICT_HideActionCrItmBzWsp + PPSPurOrdItemPartnerFacetIsHdn + PPSPurgDItmHasLotBsdDistrIsHdn + __HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + ProductTypeCode + PurgConfigurableItemNumber + PurchaseContractItem + PurchaseContract + PurchaseRequisition + PurchaseRequisitionItem + PurchasingParentItem + PurchasingInfoRecord + SupplierMaterialNumber + PurgExternalSortNumber + PPSSupplierShareAbovePercent + PPSSupplierShareBelowPercent + PPSPurOrderItemStatus + RequirementTracking + + + + + + __EntityControl/Updatable + + + true + __EntityControl/Updatable + + + + + DraftAdministrativeData + SiblingEntity + _DeliveryAddress + _HDMRelation + _NoteBasic + _PricingElementSubtotals + _PurchaseOrder + _PurchaseOrderDocumentHistory + _PurchaseOrderScheduleLineTP + _PurOrdAccountAssignment + _PurOrdFundsRequest + _PurOrdItemNvtnPartner + _PurOrdItemParentToChild + _PurOrdItemPartner + _PurOrdPaymentPlan + _PurOrdPricingElement + _PurOrdSupplierConfirmation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/_PurchaseOrder/_PurchaseOrderItem/PurgConfigurableItemNumber + + + + + + + + + + + + _it/_PurchaseOrder/_PurchaseOrderItem + + + + + _it/_PurchaseOrder/* + _it/_PurchaseOrderScheduleLineTP/* + _it/_PurOrdAccountAssignment/* + _it/IsDeleted + _it/PurchasingDocumentDeletionCode + _it/SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/* + _it/_PurchaseOrder/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/_PurchaseOrder/* + + + + + + + + + + + + _it/* + _it/_PurOrdPaymentPlan/* + + + + + + + + + + + + + + + + + _it/_DeliveryAddress/* + _it/_PurchaseOrderScheduleLineTP/* + _it/_PurOrdAccountAssignment/* + _it/_PurOrdItemPartner/* + _it/_PurchaseOrder/DownPaymentAmount + _it/_PurchaseOrder/DownPaymentPercentageOfTotAmt + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paymentplantypevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_pps_purorditemhierarchytp_2.createpaymentplan.paymentplantype.PPS_PurchaseOrderItemType'/$metadata + + + + + + + + + + + + + + _it/* + _it/_PurOrdPaymentPlan/* + + + + + + + + + + + + + + + + + _it/_PurchaseOrder/DownPaymentAmount + _it/_PurchaseOrder/DownPaymentPercentageOfTotAmt + + + + + + + + + + + + _it/_PurchaseOrder/* + _it/_PurchaseOrder/_PurchaseOrderItem/* + _it/_PurOrdAccountAssignment/* + _it/IsDeleted + _it/PurchasingDocumentDeletionCode + + + + + + + + + + + + _it/_PurchaseOrder/* + _it/_PurchaseOrder/_PurchaseOrderItem/* + _it/_PurOrdAccountAssignment/* + _it/PPSOptionalItemStatus + _it/PPSPurOrderItemStatus + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorditmconditiontypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_pps_purorditemhierarchytp_2.createpricingelement.conditiontype.PPS_PurchaseOrderItemType'/$metadata + + + + + + + + + + + + + + + + _it/_PurOrdPricingElement + + + + + + + + + + + + _it/_PurOrdPaymentPlan/_PurOrdPaytPlanItmTP/* + + + + + + + + + + PurchaseOrderItem + ActivePurchasingDocument + + + + + + + + + + + + + + + + + _PurOrdAccountAssignment + + + + + + + + + AccountAssignmentCategory + + + + + _PurOrdAccountAssignment + + + + + * + SAP__Messages + + + + + + + + + DownPaymentAmount + + + + + * + + + + + + + + + DownPaymentPercentageOfTotAmt + + + + + * + + + + + + + + + DownPaymentType + + + + + * + SAP__Messages + + + + + + + + + ExpectedOverallLimitAmount + + + + + * + _PurchaseOrder/* + _PurchaseOrder/_PurchaseOrderItem/* + SAP__Messages + + + + + + + + + GoodsReceiptIsExpected + + + + + * + _PurchaseOrder/* + SAP__Messages + + + + + + + + + GoodsReceiptIsNonValuated + + + + + * + _PurchaseOrder/* + SAP__Messages + + + + + + + + + IncotermsClassification + + + + + * + + + + + + + + + InvoiceIsExpected + + + + + * + _PurchaseOrder/* + SAP__Messages + + + + + + + + + InvoiceIsGoodsReceiptBased + + + + + * + _PurchaseOrder/* + SAP__Messages + + + + + + + + + IsCompletelyDelivered + + + + + * + _PurchaseOrder/* + + + + + + + + + IsFinallyInvoiced + + + + + * + _PurchaseOrder/* + SAP__Messages + + + + + + + + + ManufacturerMaterial + + + + + * + _DeliveryAddress/* + _PurchaseOrderScheduleLineTP/* + _PurOrdPricingElement/* + SAP__Messages + + + + + + + + + MultipleAcctAssgmtDistribution + + + + + * + _PurOrdAccountAssignment/* + SAP__Messages + + + + + + + + + NetAmount + + + + + _PurchaseOrder/* + _PurchaseOrder/_PurchaseOrderItem/* + _PurOrdPaymentPlan/* + _PurOrdPaymentPlan/_PurOrdPaytPlanItmTP/* + _PurOrdPricingElement/* + SAP__Messages + + + + + + + + + NetPriceAmount + + + + + * + _PurchaseOrder/* + _PurchaseOrder/_PurchaseOrderItem/* + _PurOrdPaymentPlan/* + _PurOrdPaymentPlan/_PurOrdPaytPlanItmTP/* + _PurOrdPricingElement/* + SAP__Messages + + + + + + + + + NetPriceQuantity + + + + + * + _PurchaseOrder/* + _PurchaseOrderScheduleLineTP/* + SAP__Messages + + + + + + + + + OrderQuantity + + + + + * + _PurchaseOrder/* + _PurchaseOrder/_PurchaseOrderItem/* + _PurchaseOrderScheduleLineTP/* + _PurOrdAccountAssignment/* + _PurOrdPaymentPlan/* + _PurOrdPaymentPlan/_PurOrdPaytPlanItmTP/* + SAP__Messages + + + + + + + + + PartialInvoiceDistribution + + + + + * + _PurOrdAccountAssignment/* + SAP__Messages + + + + + + + + + Plant + + + + + * + _DeliveryAddress/* + _PurchaseOrderScheduleLineTP/* + SAP__Messages + + + + + + + + + PPSDeliveryToleranceKey + + + + + * + + + + + + + + + PPSGovtShareAbovePercent + + + + + PPSSupplierShareAbovePercent + SAP__Messages + + + + + + + + + PPSGovtShareBelowPercent + + + + + PPSSupplierShareBelowPercent + SAP__Messages + + + + + + + + + PPSIsIncrementalFundedItem + + + + + * + _PurOrdAccountAssignment/* + SAP__Messages + + + + + + + + + PPSIsOptionalItem + + + + + * + _PurchaseOrder/_PurchaseOrderItem/* + _PurchaseOrder/DownPaymentAmount + _PurchaseOrder/DownPaymentPercentageOfTotAmt + SAP__Messages + + + + + + + + + PPSItemProcessType + + + + + * + SAP__Messages + + + + + + + + + PPSOptionExerciseEndDate + + + + + _PurchaseOrder/_PurchaseOrderItem/* + + + + + + + + + PPSOptionExerciseStartDate + + + + + _PurchaseOrder/_PurchaseOrderItem/* + + + + + + + + + PPSPurOrderItemStatus + + + + + * + + + + + + + + + PPSSmartNumberItem + + + + + * + SAP__Messages + + + + + + + + + PPSSmartNumberItemIsManual + + + + + * + + + + + + + + + PurchaseOrderType + + + + + _PurOrdAccountAssignment/* + + + + + + + + + PurOrdExternalItemCategory + + + + + * + SAP__Messages + + + + + + + + + StorageLocation + + + + + * + _DeliveryAddress/* + SAP__Messages + + + + + + + + + TaxCode + + + + + * + + + + + + + + + S_BizWorkspaceStatusChanged + + + + + PPSPurOrderItemStatus + + + + + + + + + + + + + + + + filter + orderby + search + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSPurchaseOrderItemUUID + TaxCalculationProcedure + PPSPurchaseOrderIsThirdParty + PPSItemProcessType + PurOrdExternalItemCategory + PurchaseOrderType + PPSPricingArrangementTypeText + PPSIsPrcgArrgmtChildItm + PPSPricingArrangementType + UICT_OptionsIsNotEnabled + UICT_PurgDocItmIsNotOptnl + PurchasingOrganization + PurchasingParentItem + PurgExternalSortNumber + IsDeleted + PurchasingDocumentDeletionCode + PurchasingIsItemSet + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __HierarchyPropertiesForR_PPS_POItmPrtnRefHNRltnDrft + + + + + + + + + __HierarchyPropertiesForR_PPS_POItmPrtnRefHNRltnDrft + + + + + + + + + + + + + + + + + + + + _Parent + + + + + + + + + + + + + + + PartnerFunction + + + + + + + + + + + + filter + orderby + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __HierarchyPropertiesForR_PPS_PurOrdItmPrtnRefHNRltn + + + + + + + + + __HierarchyPropertiesForR_PPS_PurOrdItmPrtnRefHNRltn + + + + + + + + + + + + + + + + + + + + _Parent + + + + + + + + + + + + + + + PartnerFunction + + + + + + + + + + + + filter + orderby + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _OutputRequestItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/_OutputRequestItem + + + + + + + + + + ../../../../srvd_f4/sap/i_ocmergeoption/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_outputrequeststandard.determineoutputitems.outputrequestitemmergeoption.OutputRequestType'/$metadata + + + + + + + + + + + + + _it/_OutputRequestItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SequentialNmbrOfSuplrConf + PurchaseOrderItem + PurchaseOrder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paytplndatedescvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplanitmtp_2.paymentplandatedescriptioncode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paymentplanblockrsnvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplanitmtp_2.paymentplanblockreason'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paytplninvcrulevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplanitmtp_2.paymentplaninvoicerule'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paytplandatecategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplanitmtp_2.paymentplandatecategory'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + PaymentPlanInvoiceStatus + PaymentPlanInvoiceStatusText + __EntityControl + __FieldControl + + + + + + + + + + + + + + + + + + + + + + PaymentPlanInvoiceStatus + PaymentPlanInvoiceStatusText + __EntityControl + __FieldControl + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + _PurOrdPaytPlanTP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PaymentPlanItem + PaymentPlan + PurchaseOrder + + + + + + + PaymentPlanItemAmount + + + + + * + _PurOrdPaytPlanTP/* + + + + + + + + + PaymentPlanItemAmountPercent + + + + + * + _PurOrdPaytPlanTP/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _VersCompare + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSPurchaseOrderVersionOne + PPSPurchaseOrderVersionTwo + PurchasingDocumentTypeName + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LegalTransaction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LegalTransaction + LglCntntMContext + LglCntntMEntity + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSDocTotalKeyFigure + + + + + PPSDocTotalAmount + + + + + + + + + + + + + + + + + + + + PPSDocTotalKeyFigureText + + + + + PPSDocTotalAmount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchasingHistoryDocument + PurchaseOrderItem + PurchaseOrder + + + + + + + aggregate + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrderHistCategName + + + + + Currency + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TransactionCurrency + + + + + + + + + + + TransactionCurrency + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + filter + identity + orderby + skip + top + groupby + aggregate + concat + + + + + AmountTypeName + CommitmentItemFiscalYear + CommitmentItemName + CompanyCode + CompanyCodeName + CurCommitmentBdgtAmtInFMACrcy + FinancialManagementArea + FinMgmtAreaPeriod + FundName + FundsCenterName + FundsMgCarryForwardLevel + FundsMgmtAmountType + FundsMgmtReferenceDocumentItem + FundsMgmtSequenceNumber + FundsMgmtValueType + FundsMgmtValueTypeText + GLAccount + GLAccountName + IsStatisticalItem + MaterialDescription + PostedBudgetPeriod + PostedCommitmentItem + PostedFunctionalArea + PostedFund + PostedFundedProgram + PostedFundsCenter + PostedFundsMgmtCustomerField + PostedGrantID + PostingDate + PPSConfigurableLineItemNumber + PPSFndsMgmtCmtmtItmCompltnSts + ReferenceDocument + ReferenceDocumentType + Supplier + SupplierName + TransactionCurrency + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FundsMgmtReferenceDocumentItem + + + + + FundsMgmtReferenceDocumentItem + + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FundsMgmtAmountType + + + + + + + + + + PostedCommitmentItem + + + + + + + + CompanyCode + + + + + + + + + PostedFund + + + + + + + + + PostedFundsCenter + + + + + + + + ReferenceDocumentType + + + + + + + + + + GLAccount + + + + + + + + Supplier + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_outputcontroloutputtype/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.outputdocumenttype'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_occhannel/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.outputchannel'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_dispatchtime/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.dispatchtime'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + EmailTemplate + + + + + EmailBody + EmailSubject + + + + + + + + + OutputChannel + + + + + + + + + + + + + + OutputDocumentType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_ocemailtemplate/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.emailtemplate'/$metadata + + + + + + + + + + ../../../../srvd_f4/sap/i_outpreqitmpqvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.printqueue'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_oq_queue_vh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.outputqueue'/$metadata + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_datatransfermode/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.outputitemdatatransfermode'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_ocformtemplate/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.formtemplate'/$metadata + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_language/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.formtemplatelanguage'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_countryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_outputrequestitemstandard.formtemplatecountry'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + MimeType + OutputBinaryData + OutputBinaryDataIsNotAvailable + OutputItemStatusCriticality + OutputItemRefOriginalItem + OutputItemRecipientRoleDesc + OutputItemRecipientRoleConvert + OutputItemRecipientName + OutputItemRecipientConvert + UICT_HideSenderEmail + UICT_HidePrintQueue + UICT_HideOutputQueue + UICT_HideAttch + UICT_HideLog + UICT_HidePQPDLFltVH + UICT_HideSenderOrg + UICT_HideSenderOrgUnit + UICT_HideRecRoConv + UICT_HideRecIdConv + EmailSubject + EmailBody + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + + + + + + + + + + + + + + + + + MimeType + OutputBinaryData + OutputBinaryDataIsNotAvailable + OutputItemStatusCriticality + OutputItemRefOriginalItem + OutputItemRecipientRoleDesc + OutputItemRecipientRoleConvert + OutputItemRecipientName + OutputItemRecipientConvert + UICT_HideSenderEmail + UICT_HidePrintQueue + UICT_HideOutputQueue + UICT_HideAttch + UICT_HideLog + UICT_HidePQPDLFltVH + UICT_HideSenderOrg + UICT_HideSenderOrgUnit + UICT_HideRecRoConv + UICT_HideRecIdConv + EmailSubject + EmailBody + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _OutputRequest + _OutputRequestItemAttachment + _OutputRequestItemEmail + _OutputRequestItemEmailBcc + _OutputRequestItemEmailCc + _OutputRequestItemEmailTo + _OutputRequestItemLog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_outpreqitmassignatvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_outputrequestitemstandard.assignattachment.filename.OutputRequestItemType'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + _it/_OutputRequestItemAttachment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_ppsbdgtperdvaldtyenddtecatvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorderschedulelinetp_2.delivdatetype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + + + + + + + + + + + + + + + + + + + + + + + + + + ScheduleLine + PurchaseOrderItem + PurchaseOrder + + + + + + + + + + + + _PurchaseOrderItem + + + + + + + + + ScheduleLineOrderQuantity + + + + + * + _PurchaseOrderItem/* + _PurchaseOrderItem/_PurOrdAccountAssignment/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSDocTotalKeyFigureText + + + + + PPSDocTotalAmount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __HierarchyPropertiesForR_PPS_PurOrdItmPrtnRefHNRltn + + + + + + + + + __HierarchyPropertiesForR_PPS_PurOrdItmPrtnRefHNRltn + + + + + + + + + + + + + + + + + + + + _Parent + + + + + + + + + + + + + + + PartnerFunction + + + + + + + + + + + + filter + orderby + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purordercntctcatvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordercontacttp_2.ppscontactcategory'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_contactbusinessuservh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordercontacttp_2.ppscontactperson'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + __EntityControl + + + + + + + + + __EntityControl + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrder + PPSContactPersonUUID + + + + + + + PPSContactCategory + + + + + + + + + + SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchasingDocumentType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __HierarchyPropertiesForC_PPS_POVersCompareItemHNRltn + + + + + + + + + __HierarchyPropertiesForC_PPS_POVersCompareItemHNRltn + + + + + + + + + + + + + + + + + + + + _Parent + _ParentChild + + + + + + + + + + + + + + + + + + + + + + filter + orderby + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @SAP__UI.LineItem + + + + + + + _ParentChild/PPSPurchaseOrderVersionOne + _ParentChild/PPSPurchaseOrderVersionTwo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_costcentervaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.costcenter'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_fixedassetvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.masterfixedasset'/$metadata + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_projectnetworkvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.projectnetwork'/$metadata + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_networkactivityvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.networkactivity'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_glaccountvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.glaccount'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_businessareastdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.businessarea'/$metadata + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_salesordervaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.salesorder'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_fixedassetvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.fixedasset'/$metadata + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_logisticsordervh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.orderid'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_controllingareavh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.controllingarea'/$metadata + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_profitcentervalhelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.profitcenter'/$metadata + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_purordwbsvalhelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.wbselementexternalid'/$metadata + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_fundscenterlatestvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.fundscenter'/$metadata + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_fundvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.fund'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_fndsmgmtfuncnlareastdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.functionalarea'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_businessprocessstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.businessprocess'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_grantstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.grantid'/$metadata + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_budgetperiodstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.budgetperiod'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_emrkdfndsdocumentitemstdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.earmarkedfundsdocumentitem'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_acctgservicedocumenttypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.servicedocumenttype'/$metadata + + + + + + + + + + ../../../../srvd_f4/sap/i_acctgservicedocumentvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.servicedocument'/$metadata + + + + + + + + + + + ../../../../srvd_f4/sap/i_acctgservicedocumentitemvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.servicedocumentitem'/$metadata + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_companycodevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.companycode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_ppsbdgtperdvaldtyenddtecatvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.ppsbdgtperiodvaldtyenddatecat'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_mm_commitmentitemvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.commitmentitem'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + ValidityEndDateIsHdn + UICT_CostCenter + UICT_OrderID + UICT_NetworkActivity + UICT_WBSElementInternalID + UICT_ProjectNetwork + UICT_MasterFixedAsset + UICT_FixedAsset + UICT_BusinessArea + UICT_GLAccount + UICT_ControllingArea + UICT_Fund + UICT_FundsCenter + UICT_CommitmentItem + UICT_EarmarkedFundsDocument + UICT_EarmarkedFundsItem + UICT_FunctionalArea + UICT_GrantID + UICT_BudgetPeriod + UICT_Quantity + UICT_MultipleAcctAssgmtDistrPe + UICT_PurgDocNetAmount + PPSPurgDocNetAmount + PPSDspMultiAccAssDistrPct + UICT_SalesOrder + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + + + + + + + + + + + + + ValidityEndDateIsHdn + LeadingObjectDescription + UICT_CostCenter + UICT_OrderID + UICT_NetworkActivity + UICT_WBSElementInternalID + UICT_ProjectNetwork + UICT_MasterFixedAsset + UICT_FixedAsset + UICT_BusinessArea + UICT_GLAccount + UICT_ControllingArea + UICT_Fund + UICT_FundsCenter + UICT_CommitmentItem + UICT_EarmarkedFundsDocument + UICT_EarmarkedFundsItem + UICT_FunctionalArea + UICT_GrantID + UICT_BudgetPeriod + UICT_Quantity + UICT_MultipleAcctAssgmtDistrPe + UICT_PurgDocNetAmount + PPSPurgDocNetAmount + PPSDspMultiAccAssDistrPct + UICT_SalesOrder + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/* + _it/_PurchaseOrderItem/_PurOrdAccountAssignment/* + + + + + + + + + ../../../../srvd_f4/sap/i_emrkdfndsdocumentitemmmvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordacctassignmenttp_2.usfedgovernmentuuid'/$metadata + + + + + + + + + + + + + + AccountAssignmentCategory + + + + + * + _PurchaseOrderItem/_PurOrdAccountAssignment/* + + + + + + + + + BusinessArea + + + + + * + + + + + + + + + CostCenter + + + + + * + + + + + + + + + EarmarkedFundsDocument + + + + + _PurchaseOrderItem/_PurOrdAccountAssignment/* + + + + + + + + + Fund + + + + + * + SAP__Messages + + + + + + + + + FundsCenter + + + + + * + SAP__Messages + + + + + + + + + GLAccount + + + + + * + + + + + + + + + MasterFixedAsset + + + + + * + + + + + + + + + OrderID + + + + + * + + + + + + + + + PPSAccountAssignmentIsUnfunded + + + + + * + _PurchaseOrderItem/_PurOrdAccountAssignment/* + + + + + + + + + PPSMultiAcctAssgmtDistrPct + + + + + _PurchaseOrderItem + _PurchaseOrderItem/_PurOrdAccountAssignment + + + + + * + + + + + + + + + ProjectNetwork + + + + + * + + + + + + + + + PurgDocNetAmount + + + + + _PurchaseOrderItem + _PurchaseOrderItem/_PurOrdAccountAssignment + + + + + * + + + + + + + + + Quantity + + + + + _PurchaseOrderItem + _PurchaseOrderItem/_PurOrdAccountAssignment + + + + + * + + + + + + + + + WBSElementExternalID + + + + + * + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ValidityEndDateIsHdn + ValidityEndDate + AccountAssignmentCategory + FinancialManagementArea + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purchaseordervh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.activepurchasingdocument'/$metadata + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorddocumenttypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.purchaseordertype'/$metadata + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_uservh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.createdbyuser'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_companycodevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.companycode'/$metadata + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_purchasingorgvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.purchasingorganization'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_purchasinggroupvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.purchasinggroup'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_supplierpurchorgvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.supplier'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_paymenttermvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.paymentterms'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_downpaymentcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.downpaymenttype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_retentiontypevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.retentiontype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_incotermvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.incotermsclassification'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_currencystdvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.documentcurrency'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocclassificationvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.ppspurgdocclassfctncode'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocversionreasonvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.purchasingdocversionreasoncode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_booleanvaluevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.purgdocischgvers'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorderhdrstatusvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.ppspurorderheaderstatus'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_pricingarrangementtypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.ppspricingarrangementtype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_interestcalculationcodevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.interestcalculationcode'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocmodiftypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseordertp_2.ppsmodificationtype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.CrtePurOrdWtRfFrSrcgProjQtan + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.Copy + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.CloseoutPurchaseOrder + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.AddItemFromPurchaseRequisition + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.Revise + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.CrteWithRefFrmPurchaseContract + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.RestoreVersion + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.AddFund + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.WithdrawFromApproval + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.NovatePurchaseOrder + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.CreateWithRefFromPurReqn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrderNetAmount + PPSPurchaseOrderUUID + UICT_PPSIsAttachmentEnabled + PurchaseOrderLegalDocument + NumberOfPurchaseOrderItems + NumberOfItemsIsHidden + UICT_VersionIsNotEnabled + UICT_HideExchangeRate + UICT_HideFixedExchangeRate + PPSVersionTypeText + PPSSaveInPreparationIsAllowed + PurgDocHasActnRstrcn + UICT_HideOpenText + UICT_PPSBusinessWrkspcIsHidden + UICT_PPSBusinessWorkspaceEnbld + UICT_HideDocValHeaderFacet + UICT_HideOptValHeaderFacet + UICT_HideHdrPrtnrRefItm + PPSPurchaseOrderIsThirdParty + UICT_HideDownpayment + UICT_HideRetention + UICT_HideDownpaymentfields + UICT_HideRetentionhdrpct + UICT_HideRestoreVersion + UICT_PPSIsInterestEnabled + PPSBusinessWorkspaceURL + PPSBizWorkspaceMessageText + PPSBusinessWorkspaceStatus + UICT_HideModificationType + UICT_HideModificationNumber + UICT_HideModifIdentifier + UICT_HideSmartDocumentNumber + UICT_HideSmartNumberHeader + UICT_HideSmrtNmbrHdrIsManual + UICT_HideBudgetOverview + UICT_HideItemSmmryFacet + UICT_HideItemSmmryTable + UICT_HidePriceArrngButton + UICT_HideLegalTransaction + UICT_HideDirectOrder + UICT_HideItmPrtnRef + UICT_HidePartnerExt + UICT_HideOutputManagement + UICT_HideExtPubgSystFacet + UICT_PPSExtPubgSystIsHidden + UICT_PPSExtPubgSystIsEnabled + UICT_HideActionWthdrwFrmApprvl + UICT_HideActionCopy + UICT_HideActionDelete + UICT_HideActionRevise + UICT_HideActionEdit + UICT_HidePrtnrRefItm + PPSPurOrdNvtnPartnerFacetIsHdn + UICT_HidePrtnrRefItmDraft + CreateBusinessWorkspaceIsHdn + CrteLglTransacFrmPurOrdIsHdn + CreateLegalTransacAndDocIsHdn + CreateLegalDocumentIsHidden + CreateLegalDocAmendmentIsHdn + UpdtLglTransFrmPurOrdIsHidden + UpdateLegalDocAgreementIsHdn + AssignLinkdObjToLglTransIsHdn + UnasLiObFrLgTrnExIsHidden + CrteLglTransacFrmPurOrdIsEnbld + CrteLglTransacAndDocIsEnabled + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + PurchaseOrderNetAmount + PPSPurchaseOrderUUID + UICT_PPSIsAttachmentEnabled + PurchaseOrderLegalDocument + NumberOfPurchaseOrderItems + NumberOfItemsIsHidden + UICT_VersionIsNotEnabled + UICT_HideExchangeRate + UICT_HideFixedExchangeRate + PPSVersionTypeText + PPSSaveInPreparationIsAllowed + PurgDocHasActnRstrcn + UICT_HideOpenText + UICT_PPSBusinessWrkspcIsHidden + UICT_PPSBusinessWorkspaceEnbld + UICT_HideDocValHeaderFacet + UICT_HideOptValHeaderFacet + UICT_HideHdrPrtnrRefItm + PPSPurchaseOrderIsThirdParty + UICT_HideDownpayment + UICT_HideRetention + UICT_HideDownpaymentfields + UICT_HideRetentionhdrpct + UICT_HideRestoreVersion + UICT_PPSIsInterestEnabled + PPSBusinessWorkspaceURL + PPSBizWorkspaceMessageText + PPSBusinessWorkspaceStatus + UICT_HideModificationType + UICT_HideModificationNumber + UICT_HideModifIdentifier + UICT_HideSmartDocumentNumber + UICT_HideSmartNumberHeader + UICT_HideSmrtNmbrHdrIsManual + UICT_HideBudgetOverview + UICT_HideItemSmmryFacet + UICT_HideItemSmmryTable + UICT_HidePriceArrngButton + UICT_HideLegalTransaction + UICT_HideDirectOrder + UICT_HideItmPrtnRef + UICT_HidePartnerExt + UICT_HideOutputManagement + UICT_HideExtPubgSystFacet + UICT_PPSExtPubgSystIsHidden + UICT_PPSExtPubgSystIsEnabled + UICT_HideActionWthdrwFrmApprvl + UICT_HideActionCopy + UICT_HideActionDelete + UICT_HideActionRevise + UICT_HideActionEdit + UICT_HidePrtnrRefItm + PPSPurOrdNvtnPartnerFacetIsHdn + UICT_HidePrtnrRefItmDraft + CreateBusinessWorkspaceIsHdn + CrteLglTransacFrmPurOrdIsHdn + CreateLegalTransacAndDocIsHdn + CreateLegalDocumentIsHidden + CreateLegalDocAmendmentIsHdn + UpdtLglTransFrmPurOrdIsHidden + UpdateLegalDocAgreementIsHdn + AssignLinkdObjToLglTransIsHdn + UnasLiObFrLgTrnExIsHidden + CrteLglTransacFrmPurOrdIsEnbld + CrteLglTransacAndDocIsEnabled + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + PurchaseOrderType + PurchaseContract + PPSIsDirectPurchaseOrder + + + + + + __EntityControl/Updatable + + + true + __EntityControl/Updatable + + + + + DraftAdministrativeData + SiblingEntity + _HDMRelation + _ItemDocumentTotal + _LegalTransactions + _NoteBasic + _OutputRequest + _PaymentTerm + _PPSExtPubgSystemRelation + _PurchaseOrderContact + _PurchaseOrderItem + _PurchaseOrderPartner + _PurgDocBudgetOverview + _PurOrdDocTotalOptional + _PurOrdDocumentTotal + _PurOrdHdrNvtnPartner + _PurOrdItmNvtnPrtnRef + _PurOrdItmPrtnRef + _PurOrdItmPrtnRefDraft + _PurOrdVersionHistory + _SupplierDetail + _VersCompare + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/* + _it/SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_ppsitemprocesstypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_pps_purchaseordertp_2.createitemwithprocesstype.ppsitemprocesstype.PPS_PurchaseOrderType'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/_PurchaseOrderItem + + + + + _it/SAP__Messages + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorddocumenttypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_pps_purchaseordertp_2.createpurchaseorder.purchaseordertype.PPS_PurchaseOrderType.X'/$metadata + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorddocumenttypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_pps_purchaseordertp_2.copy.purchaseordertype.PPS_PurchaseOrderType'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_pricingarrangementtypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_pps_purchaseordertp_2.createpricingarrangement.ppspricingarrangementtype.PPS_PurchaseOrderType'/$metadata + + + + + + + + + + + + + _it/_PurchaseOrderItem + + + + + _it/SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_legaltransactionvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ae-c_pps_purchaseordertp_2.assignlinkdobjtolgltransext.legaltransaction.PPS_PurchaseOrderType'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/_PurchaseOrderItem/_PurchaseOrder/* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ActivePurchasingDocument + + + + + + + + + + + + CompanyCode + + + + + * + _PurchaseOrderItem/* + SAP__Messages + + + + + + + + + DocumentCurrency + + + + + * + _PurchaseOrderItem/* + SAP__Messages + + + + + + + + + DownPaymentAmount + + + + + DownPaymentPercentageOfTotAmt + + + + + + + + + DownPaymentPercentageOfTotAmt + + + + + * + + + + + + + + + DownPaymentType + + + + + * + SAP__Messages + + + + + + + + + IncotermsClassification + + + + + _PurchaseOrderItem/* + SAP__Messages + + + + + + + + + IncotermsVersion + + + + + _PurchaseOrderItem/* + SAP__Messages + + + + + + + + + PaymentTerms + + + + + _PurchaseOrderItem/* + SAP__Messages + + + + + + + + + PPSFuturePostingDate + + + + + * + + + + + + + + + PPSModificationType + + + + + * + + + + + + + + + PPSSmartNumberHeader + + + + + * + SAP__Messages + + + + + + + + + PPSSmartNumberHeaderIsManual + + + + + * + SAP__Messages + + + + + + + + + PurchaseOrderType + + + + + * + _PurchaseOrderContact/* + SAP__Messages + + + + + + + + + PurchasingGroup + + + + + _PurchaseOrderItem/* + ExchangeRate + SAP__Messages + + + + + + + + + PurchasingOrganization + + + + + * + _PurchaseOrderItem/* + _PurchaseOrderPartner/* + SAP__Messages + + + + + + + + + PurgDocHdrInvcRtntnPct + + + + + * + _PurchaseOrderItem/* + + + + + + + + + RetentionType + + + + + * + _PurchaseOrderItem/* + + + + + + + + + Supplier + + + + + * + _PurchaseOrderContact/* + _PurchaseOrderItem/* + _PurchaseOrderItem/_PurOrdPricingElement/* + _PurchaseOrderPartner/* + SAP__Messages + + + + + + + + + S_BizWorkspaceStatusChanged + + + + + PPSPurchaseOrderDescription + + + + + + + + + S_LegalTransacAndDocCreated + + + + + _LegalTransactions + + + + + SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UICT_HideRestoreVersion + PPSPurchaseOrderUUID + PurchaseOrderType + PurchaseOrderLegalDocument + + + + + @SAP__UI.LineItem + + + + + + + ActivePurchasingDocument + PurchaseOrderType + PPSPurOrderHeaderStatus + PurgDocIsChgVers + PPSSmartDocumentNumber + Supplier + PurchasingGroup + PurchasingOrganization + _PurchaseOrderItem/ManufacturerMaterial + _PurchaseOrderItem/MaterialGroup + + + + + + + + + + _it/SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pricingconditiontype_vh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditmprcgelement.conditiontype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrderItem + PricingProcedureCounter + PricingProcedureStep + PurchaseOrder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ConditionBaseValueIsAmount + ConditionBaseValueIsQuantity + ConditionRateValueIsRatio + ConditionRateValueIsAmount + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paymentplantypevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplantp_2.paymentplantype'/$metadata + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paytplnhrzndtedetnrulevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplantp_2.paytplnhrzndatedeterminerule'/$metadata + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paytplannxtinvcdterulevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplantp_2.paymentplannextinvoicedaterule'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_paytplnstartdaterulevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplantp_2.paymentplanstartdaterule'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_factorycalendarvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordpaytplantp_2.factorycalendar'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + PaymentPlanHorizonDate + UICT_HdeNnPartPymntPln + UICT_HdeNnPerdcPymntPln + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + + + + + + + + + + + + + + PaymentPlanHorizonDate + UICT_HdeNnPartPymntPln + UICT_HdeNnPerdcPymntPln + __CreateByAssociationControl + __EntityControl + __FieldControl + __OperationControl + + + + + + + + + PaymentPlan + + + + + + + + + + + PaymentPlanType + PaymentPlanTotalAmount + PaymentPlanTotalAmountPercent + + + + + + __EntityControl/Updatable + + + true + __EntityControl/Updatable + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + _PurOrdPaytPlanItmTP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _it/_PurOrdPaytPlanItmTP + + + + + + + + + + + + _it/_PurchaseOrderItem/* + + + + + + + + + + + + PaymentPlanStartDate + + + + + * + + + + + + + + + PaymentPlanStartDateRule + + + + + * + + + + + + + + + PaytPlnHrznDateDetermineRule + + + + + * + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BaseObjectKey + BaseObjectType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HDMObjectDesc + HDMObjectTypeDesc + HDMObjectStatusDesc + HDMReadContentStreamURI + HDMWriteContentStreamURI + SecureAccessToken + HDMObjectStateText + + + + + + + + + HDMObjectURI + HDMObjectDesc + HDMObjectTypeDesc + HDMObjectStatusDesc + HDMReadContentStreamURI + HDMWriteContentStreamURI + SecureAccessToken + HDMObjectStateText + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _HDMRelation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSDocTotalKeyFigureText + + + + + PPSDocTotalAmount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + __HierarchyPropertiesForR_PPS_POItmNvtnPrtnRefHNRltn + + + + + + + + + __HierarchyPropertiesForR_PPS_POItmNvtnPrtnRefHNRltn + + + + + + + + + + + + + + + + + + + + _Parent + + + + + + + + + + + + + + + PartnerFunction + + + + + + + + + + + + filter + orderby + ancestors + descendants + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FormattedAddress + + + + + + + + + FormattedAddress + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_draftadministrativeuservh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-i_draftadministrativedata.createdbyuser'/$metadata + + + + + + + + + + ../../../../srvd_f4/sap/i_draftadministrativeuservh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-i_draftadministrativedata.lastchangedbyuser'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pricingconditiontype_vh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditmprcgelementtp_2.conditiontype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ConditionRateRatio + + + + + _PurchaseOrderItem/* + _PurchaseOrderItem/_PurOrdPricingElement/* + _PurchaseOrder/PurchaseOrderNetAmount + + + + + + + + + ConditionRateValue + + + + + _PurchaseOrderItem/* + _PurchaseOrderItem/_PurOrdPricingElement/* + _PurchaseOrder/PurchaseOrderNetAmount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ConditionBaseValueIsAmount + ConditionBaseValueIsQuantity + ConditionRateValueIsRatio + ConditionRateValueIsAmount + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.ExecuteAction + + + + + + + + + + + + + + + + + + + + + + + + + + + + __CreateByAssociationControl + __EntityControl + __OperationControl + + + + + + + + + __CreateByAssociationControl + __EntityControl + __OperationControl + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PPSExtPubgSystemActionHistory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSExtPubgSystApplicationObj + PPSExtPubgSystApplObjectType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @SAP__UI.LineItem#ExternalPublishingRelation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + LogMessageText + UICT_Criticality + UICT_SeverityDescription + + + + + + + + + + + + + + + + + + + + + + LogMessageText + UICT_Criticality + UICT_SeverityDescription + + + + + + + + + + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _OutputRequest + _OutputRequestItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @SAP__UI.LineItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSDeliveryToleranceKey + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purordhdrprtnfuncvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseorderpartnertp_2.partnerfunctionforedit'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocpartnervh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purchaseorderpartnertp_2.purchasingdocumentpartner'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + UICT_HideHdrPrtnrRefItm + __EntityControl + __FieldControl + + + + + + + + + + + + + + + + + + + + + + UICT_HideHdrPrtnrRefItm + __EntityControl + __FieldControl + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PartnerFunction + PurchaseOrder + + + + + + + + + + + + _PurchaseOrder/_PurchaseOrderPartner + + + + + + + + + PartnerFunction + + + + + * + SAP__Messages + + + + + + + + + PurchasingDocumentPartner + + + + + _PurchaseOrder/InvoicingParty + SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CompanyCode + PurchasingDocumentType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BaseObjectKey + BaseObjectType + LinkedSAPObjectKey + SAPObjectNodeType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HDMObjectDesc + HDMObjectTypeDesc + HDMObjectStatusDesc + HDMReadContentStreamURI + HDMWriteContentStreamURI + SecureAccessToken + HDMRelationIsTrustedSourcePath + HarmonizedDocumentDraftUUID + DocumentUploadIsInProgress + HDMRelationIsOperationAllowed + HDMRelationHighlightStateCode + LinkedObjectName + LinkedObjectKey + LinkedObjectNavURI + LinkedObjectToggle + HDMRelationIsProtected + HDMRelationIsUploadFailed + HDMRelationIsRemoveAllowed + HrmnzdDocUpldPrgrsVal + __EntityControl + __OperationControl + + + + + + + + + HDMObjectURI + HDMObjectDesc + HDMObjectTypeDesc + HDMObjectStatusDesc + HDMReadContentStreamURI + HDMWriteContentStreamURI + SecureAccessToken + HDMRelationIsTrustedSourcePath + HarmonizedDocumentDraftUUID + DocumentUploadIsInProgress + HDMRelationIsOperationAllowed + HDMRelationHighlightStateCode + LinkedObjectName + LinkedObjectKey + LinkedObjectNavURI + LinkedObjectToggle + HDMRelationIsProtected + HDMRelationIsUploadFailed + HDMRelationIsRemoveAllowed + HrmnzdDocUpldPrgrsVal + __EntityControl + __OperationControl + + + + + + + + + + + + + + + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _HarmonizedDocument + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ContactPerson + PartnerCounter + PartnerFunction + PurchasingDocumentItem + PurchasingDocument + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorditmprtnfuncvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorderitempartnertp_2.partnerfunctionforedit'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocpartnervh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorderitempartnertp_2.purchasingdocumentpartner'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + __EntityControl + __FieldControl + + + + + + + + + + PartnerType + CreatedByUser + CreationDate + PurgConfigurableItemNumber + + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchasingDocumentType + PartnerFunction + PurchaseOrderItem + PurchaseOrder + + + + + + + + + + + + SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CompanyCode + PurchasingDocumentType + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @SAP__UI.LineItem#tqFundsRequestItemField + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PPSDocTotOptionalKeyFigure + + + + + PPSDocTotalOptionalAmount + + + + + + + + + + + + + + + + + + + PPSDocTotOptionalKeyFigureText + + + + + PPSDocTotalOptionalAmount + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @SAP__UI.Chart#OptionalValueMicroChart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_companycodevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.companycode'/$metadata + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_purchasingorgvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.purchasingorganization'/$metadata + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_purchasinggroupvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.purchasinggroup'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_interestcalculationcodevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.interestcalculationcode'/$metadata + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_downpaymentcategoryvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.downpaymenttype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_retentiontypevaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.retentiontype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocmodiftypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.ppsmodificationtype'/$metadata + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocversionreasonvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.purchasingdocversionreasoncode'/$metadata + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purorderhdrstatusvh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.ppspurorderheaderstatus'/$metadata + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_pricingarrangementtypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purordversionhistory_2.ppspricingarrangementtype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrderNetAmount + PPSVersionTypeText + NumberOfPurchaseOrderItems + PPSChangeVersionDocumentNumber + PPSChgVersionIsAvailable + UICT_HideOptValHeaderFacet + UICT_HidePartnerExt + UICT_HideItmPrtnRef + UICT_PPSIsInterestEnabled + UICT_HideDirectOrder + UICT_HidePriceArrngButton + UICT_HideDownpaymentfields + UICT_HideRetentionhdrpct + UICT_HideRetention + UICT_PPSExtPubgSystIsHidden + UICT_PPSExtPubgSystIsEnabled + PPSPurOrdNvtnPartnerFacetIsHdn + + + + + + + + + PurchaseOrderNetAmount + PPSVersionTypeText + PPSChangeVersionDocumentNumber + PPSChgVersionIsAvailable + UICT_HideOptValHeaderFacet + UICT_HidePartnerExt + UICT_HideItmPrtnRef + UICT_PPSIsInterestEnabled + UICT_HideDirectOrder + UICT_HidePriceArrngButton + UICT_HideDownpaymentfields + UICT_HideRetentionhdrpct + UICT_HideRetention + UICT_PPSExtPubgSystIsHidden + UICT_PPSExtPubgSystIsEnabled + PPSPurOrdNvtnPartnerFacetIsHdn + + + + + + + + + + + + + + + + + + + + _PaymentTerm + _POVersHistItmNvtnPrtnRef + _PurchaseOrderContact + _PurchaseOrderItem + _PurchaseOrderPartner + _PurOrdDocTotalOptional + _PurOrdPartnerExtension + _PurOrdVersHistItmPrtnRef + _SupplierDetail + _VersionHistory + + + + + + + + + + + + + + + + + + + + + + + + + PurchasingDocumentVersion + PurchaseOrder + ActivePurchasingDocument + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurgDocChangeRequestStatus + PPSPurOrderHeaderStatus + + + + + @SAP__UI.LineItem + + + + + + + PurchasingDocumentVersion + Supplier + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_countryvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemdelivaddrtp_2.country'/$metadata + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_mm_regionvaluehelp/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemdelivaddrtp_2.region'/$metadata + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocaddresstitlevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemdelivaddrtp_2.formofaddress'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/c_pps_purgdocaddresstypevh/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_pps_purorditemdelivaddrtp_2.purchasingdeliveryaddresstype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + UICT_HideCustomer + __EntityControl + __FieldControl + + + + + + + + + + + + + + + + + + + + + + UICT_HideCustomer + __EntityControl + __FieldControl + + + + + + + + + + DeliveryAddressID + + + + + + __EntityControl/Updatable + + + true + __EntityControl/Updatable + + + + + DraftAdministrativeData + SiblingEntity + _PurchaseOrder + _PurchaseOrderItem + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PurchaseOrderItem + PurchaseOrder + + + + + + + PurchasingDeliveryAddressType + + + + + + + + + + SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ../../../../srvd_f4/sap/i_notebasictype/0001;ps='srvd-ui_pps_purchaseorder_manage_2-0001';va='com.sap.gateway.srvd.ui_pps_purchaseorder_manage_2.v0001.et-c_notebasictp.notebasictype'/$metadata + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NoteBasicContent + + + + + SAP__Messages + + + + + + + + + NoteBasicLanguage + + + + + SAP__Messages + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NoteBasicType + NoteBasicTitle + NoteBasicLanguage + NoteBasicLastChangedByUser + NoteBasicContent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP__self.Container/OutputRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + P_BPFLayout + P_BPFDocument + P_BPFDocumentFieldName + P_BPFDocumentItem + P_BPFDocumentItemFieldName + P_FiscalYear + P_BPFFiscalYearFieldName + P_CompanyCode + P_BPFCompanyCodeFieldName + + + + + + + + + P_BPFLayout + P_BPFDocument + P_BPFDocumentFieldName + P_BPFDocumentItem + P_BPFDocumentItemFieldName + P_FiscalYear + P_BPFFiscalYearFieldName + P_CompanyCode + P_BPFCompanyCodeFieldName + + + + + + + + + + + + + + + + + + + + + + + + + Set + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ContactPerson + PartnerCounter + PartnerFunction + PurchasingDocumentItem + PurchasingDocument + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/generator-odata-downloader/test/utils.test.ts b/packages/generator-odata-downloader/test/utils.test.ts index ebb112d3c86..af7616306fe 100644 --- a/packages/generator-odata-downloader/test/utils.test.ts +++ b/packages/generator-odata-downloader/test/utils.test.ts @@ -1,7 +1,13 @@ -import type { ReferencedEntities } from '../src/data-download/types'; -import { createEntitySetData } from '../src/data-download/utils'; +import type { HierarchyEntity, ReferencedEntities } from '../src/data-download/types'; +import { + clearRootHierarchyParentProperty, + createEntitySetData, + getHierarchyEntities, + normalizeHierarchyNodeIds +} from '../src/data-download/utils'; import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; +import type { ConvertedMetadata, EntitySet, EntityType } from '@sap-ux/vocabularies-types'; describe('Test utils', () => { describe('createEntitySetData', () => { @@ -171,4 +177,416 @@ describe('Test utils', () => { ); }); }); + + describe('getHierarchyEntities', () => { + function createMockEntitySet( + name: string, + entityType: Partial, + hierarchyKey?: string, + keys?: { name: string; type: string }[], + entityProperties?: { name: string; type: string }[], + isDraft?: boolean + ): EntitySet { + const annotations: Record = {}; + if (hierarchyKey) { + annotations.Aggregation = { + [hierarchyKey]: { + NodeProperty: { + type: 'PropertyPath', + value: 'ID', + $target: { name: 'ID', type: 'Edm.String' } + }, + ParentNavigationProperty: { + type: 'NavigationPropertyPath', + value: 'Superordinate', + $target: { + name: 'Superordinate', + referentialConstraint: [{ sourceProperty: 'Parent', targetProperty: 'ID' }] + } + } + } + }; + } + + const entitySetAnnotations: Record = {}; + if (isDraft) { + entitySetAnnotations.Common = { DraftRoot: { type: 'Org.OData.Common.V1.DraftRootType' } }; + } + + return { + name, + entityTypeName: entityType.fullyQualifiedName ?? name + 'Type', + annotations: entitySetAnnotations, + entityType: { + ...entityType, + keys: keys ?? [{ name: 'ID', type: 'Edm.String' }], + entityProperties: entityProperties ?? [{ name: 'Parent', type: 'Edm.String' }], + annotations + } as EntityType + } as EntitySet; + } + + test('should return empty array when no hierarchy annotations exist', () => { + const metadata = { + entitySets: [createMockEntitySet('Travel', { fullyQualifiedName: 'TravelType' })] + } as ConvertedMetadata; + + const result = getHierarchyEntities(metadata); + expect(result).toEqual([]); + }); + + test('should detect hierarchy entity with RecursiveHierarchy annotation', () => { + const metadata = { + entitySets: [ + createMockEntitySet('Travel', { fullyQualifiedName: 'TravelType' }), + createMockEntitySet( + 'SalesOrganizations', + { fullyQualifiedName: 'SalesOrgType' }, + 'RecursiveHierarchy#SalesOrgHierarchy' + ) + ] + } as ConvertedMetadata; + + const result = getHierarchyEntities(metadata); + expect(result).toHaveLength(1); + expect(result[0]).toEqual({ + entitySetName: 'SalesOrganizations', + entityTypeName: 'SalesOrgType', + qualifier: 'SalesOrgHierarchy', + nodeProperty: 'ID', + parentProperty: 'Parent', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: ['ID'] + }); + }); + + test('should detect multiple hierarchy entities', () => { + const metadata = { + entitySets: [ + createMockEntitySet('SalesOrgs', { fullyQualifiedName: 'SalesOrgType' }, 'RecursiveHierarchy#H1'), + createMockEntitySet( + 'CostCenters', + { fullyQualifiedName: 'CostCenterType' }, + 'RecursiveHierarchy#H2' + ) + ] + } as ConvertedMetadata; + + const result = getHierarchyEntities(metadata); + expect(result).toHaveLength(2); + }); + + test('should handle unqualified RecursiveHierarchy annotation', () => { + const metadata = { + entitySets: [ + createMockEntitySet('SalesOrgs', { fullyQualifiedName: 'SalesOrgType' }, 'RecursiveHierarchy') + ] + } as ConvertedMetadata; + + const result = getHierarchyEntities(metadata); + expect(result).toHaveLength(1); + expect(result[0].qualifier).toBe(''); + expect(result[0].isDraft).toBe(false); + }); + + test('should detect draft-enabled hierarchy entities', () => { + const draftKeys = [ + { name: 'ID', type: 'Edm.Guid' }, + { name: 'IsActiveEntity', type: 'Edm.Boolean' } + ]; + const metadata = { + entitySets: [ + createMockEntitySet( + 'Companies', + { fullyQualifiedName: 'CompanyType' }, + 'RecursiveHierarchy#CompanyHierarchy', + draftKeys, + [{ name: 'Parent', type: 'Edm.Guid' }], + true + ) + ] + } as ConvertedMetadata; + + const result = getHierarchyEntities(metadata); + expect(result).toHaveLength(1); + expect(result[0].isDraft).toBe(true); + expect(result[0].parentPropertyType).toBe('Edm.Guid'); + }); + }); + + describe('normalizeHierarchyNodeIds', () => { + test('should convert uppercase hex NodeId to GUID format when parent property is Edm.Guid', () => { + const entityFileData: { [key: string]: object[] } = { + Companies: [ + { + Company: 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9', + OwnerCompany: '', + NodeId: 'CB565AACB20E1FE18BA0BDC76E7CAEE9' + }, + { + Company: 'cb565aac-b20e-1fe1-8ba0-be99f8d2cefd', + OwnerCompany: 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9', + NodeId: 'CB565AACB20E1FE18BA0BE99F8D2CEFD' + } + ] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'Companies', + entityTypeName: 'CompanyType', + qualifier: 'CompanyHierarchy', + nodeProperty: 'NodeId', + parentProperty: 'OwnerCompany', + parentPropertyType: 'Edm.Guid', + isDraft: true, + entityTypeKeys: [] + } + ]; + + normalizeHierarchyNodeIds(entityFileData, hierarchies); + + expect((entityFileData.Companies[0] as Record).NodeId).toBe( + 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9' + ); + expect((entityFileData.Companies[1] as Record).NodeId).toBe( + 'cb565aac-b20e-1fe1-8ba0-be99f8d2cefd' + ); + }); + + test('should handle complex type node property path', () => { + const entityFileData: { [key: string]: object[] } = { + Companies: [ + { + Company: 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9', + OwnerCompany: '', + __HierProps: { NodeId: 'CB565AACB20E1FE18BA0BDC76E7CAEE9' } + }, + { + Company: 'cb565aac-b20e-1fe1-8ba0-be99f8d2cefd', + OwnerCompany: 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9', + __HierProps: { NodeId: 'CB565AACB20E1FE18BA0BE99F8D2CEFD' } + } + ] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'Companies', + entityTypeName: 'CompanyType', + qualifier: 'CompanyHierarchy', + nodeProperty: '__HierProps/NodeId', + parentProperty: 'OwnerCompany', + parentPropertyType: 'Edm.Guid', + isDraft: true, + entityTypeKeys: [] + } + ]; + + normalizeHierarchyNodeIds(entityFileData, hierarchies); + + expect( + ((entityFileData.Companies[0] as Record).__HierProps as Record).NodeId + ).toBe('cb565aac-b20e-1fe1-8ba0-bdc76e7caee9'); + expect( + ((entityFileData.Companies[1] as Record).__HierProps as Record).NodeId + ).toBe('cb565aac-b20e-1fe1-8ba0-be99f8d2cefd'); + }); + + test('should skip normalization when parent property is not Edm.Guid or Edm.UUID', () => { + const entityFileData: { [key: string]: object[] } = { + SalesOrgs: [{ ID: 'ABC123', Parent: 'XYZ', NodeId: 'ABC123' }] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'SalesOrgs', + entityTypeName: 'SalesOrgType', + qualifier: 'H1', + nodeProperty: 'NodeId', + parentProperty: 'Parent', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: [] + } + ]; + + normalizeHierarchyNodeIds(entityFileData, hierarchies); + + expect((entityFileData.SalesOrgs[0] as Record).NodeId).toBe('ABC123'); + }); + + test('should skip NodeId values that are not 32-char uppercase hex', () => { + const entityFileData: { [key: string]: object[] } = { + Companies: [ + { + Company: 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9', + OwnerCompany: '', + NodeId: 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9' + } + ] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'Companies', + entityTypeName: 'CompanyType', + qualifier: 'H1', + nodeProperty: 'NodeId', + parentProperty: 'OwnerCompany', + parentPropertyType: 'Edm.Guid', + isDraft: false, + entityTypeKeys: [] + } + ]; + + normalizeHierarchyNodeIds(entityFileData, hierarchies); + + // Already in GUID format, should not be changed + expect((entityFileData.Companies[0] as Record).NodeId).toBe( + 'cb565aac-b20e-1fe1-8ba0-bdc76e7caee9' + ); + }); + + test('should also normalize for Edm.UUID parent property type', () => { + const entityFileData: { [key: string]: object[] } = { + Items: [ + { + ID: '550e8400-e29b-41d4-a716-446655440000', + ParentID: '', + NodeId: '550E8400E29B41D4A716446655440000' + } + ] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'Items', + entityTypeName: 'ItemType', + qualifier: 'H1', + nodeProperty: 'NodeId', + parentProperty: 'ParentID', + parentPropertyType: 'Edm.UUID', + isDraft: false, + entityTypeKeys: [] + } + ]; + + normalizeHierarchyNodeIds(entityFileData, hierarchies); + + expect((entityFileData.Items[0] as Record).NodeId).toBe( + '550e8400-e29b-41d4-a716-446655440000' + ); + }); + }); + + describe('clearRootHierarchyParentProperty', () => { + test('should clear parent property only on root nodes (DistanceFromRoot === 0)', () => { + const entityFileData: { [key: string]: object[] } = { + SalesOrganizations: [ + { ID: 'Root1', Parent: 'SomeValue', DistanceFromRoot: 0 }, + { ID: 'Child1', Parent: 'Root1', DistanceFromRoot: 1 }, + { ID: 'Child2', Parent: 'Child1', DistanceFromRoot: 2 } + ] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'SalesOrganizations', + entityTypeName: 'SalesOrgType', + qualifier: 'SalesOrgHierarchy', + nodeProperty: 'ID', + parentProperty: 'Parent', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: [] + } + ]; + + clearRootHierarchyParentProperty(entityFileData, hierarchies); + + expect((entityFileData.SalesOrganizations[0] as Record).Parent).toBe(''); + expect((entityFileData.SalesOrganizations[1] as Record).Parent).toBe('Root1'); + expect((entityFileData.SalesOrganizations[2] as Record).Parent).toBe('Child1'); + }); + + test('should handle complex type node property path', () => { + const entityFileData: { [key: string]: object[] } = { + Companies: [ + { Company: 'A', OwnerCompany: 'X', __HierProps: { NodeId: 'A', DistanceFromRoot: 0 } }, + { Company: 'B', OwnerCompany: 'A', __HierProps: { NodeId: 'B', DistanceFromRoot: 1 } } + ] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'Companies', + entityTypeName: 'CompanyType', + qualifier: 'CompanyHierarchy', + nodeProperty: '__HierProps/NodeId', + parentProperty: 'OwnerCompany', + parentPropertyType: 'Edm.Guid', + isDraft: true, + entityTypeKeys: [] + } + ]; + + clearRootHierarchyParentProperty(entityFileData, hierarchies); + + expect((entityFileData.Companies[0] as Record).OwnerCompany).toBe(''); + expect((entityFileData.Companies[1] as Record).OwnerCompany).toBe('A'); + }); + + test('should skip entity sets without the parent property', () => { + const entityFileData: { [key: string]: object[] } = { + SalesOrganizations: [{ ID: 'Root1', Parent: 'X', DistanceFromRoot: 0 }], + Employees: [{ ID: 'E1', Name: 'John' }] + }; + const hierarchies: HierarchyEntity[] = [ + { + entitySetName: 'SalesOrganizations', + entityTypeName: 'SalesOrgType', + qualifier: 'H1', + nodeProperty: 'ID', + parentProperty: 'Parent', + parentPropertyType: 'Edm.String', + isDraft: false, + entityTypeKeys: [] + } + ]; + + clearRootHierarchyParentProperty(entityFileData, hierarchies); + + expect((entityFileData.SalesOrganizations[0] as Record).Parent).toBe(''); + expect((entityFileData.Employees[0] as Record).Name).toBe('John'); + }); + }); + + describe('getHierarchyEntities (integration)', () => { + test('should detect hierarchy entities from real purchase order service metadata', async () => { + const metadataXml = await readFile( + join(__dirname, './test-data/test-apps/purchaseorder/webapp/localService/mainService/metadata.xml'), + 'utf-8' + ); + const { convert } = await import('@sap-ux/annotation-converter'); + const { parse } = await import('@sap-ux/edmx-parser'); + const convertedMetadata = convert(parse(metadataXml)); + + const result = getHierarchyEntities(convertedMetadata); + + // Real metadata has 8 entity sets with SAP__aggregation.RecursiveHierarchy annotations + expect(result.length).toBeGreaterThanOrEqual(7); + + // PPS_PurchaseOrderItem: self-referential hierarchy, no referentialConstraint in EDMX + const poItem = result.find((h) => h.entitySetName === 'PPS_PurchaseOrderItem'); + expect(poItem).toBeDefined(); + expect(poItem?.qualifier).toBe('I_PPS_PurchaseOrderItemHNRltn'); + expect(poItem?.nodeProperty).toBe('__HierarchyPropertiesForI_PPS_PurchaseOrderItemHNRltn/NodeId'); + expect(poItem?.parentProperty).toBe('PurchasingParentItem'); + expect(poItem?.isDraft).toBe(true); + + // PPS_PurOrdItemHierarchy: companion source entity, same qualifier + const hierarchy = result.find((h) => h.entitySetName === 'PPS_PurOrdItemHierarchy'); + expect(hierarchy).toBeDefined(); + expect(hierarchy?.qualifier).toBe('I_PPS_PurchaseOrderItemHNRltn'); + expect(hierarchy?.parentProperty).toBe('PurchasingParentItem'); + expect(hierarchy?.isDraft).toBe(false); + expect(hierarchy?.entityTypeKeys).toContain('PurchaseOrder'); + expect(hierarchy?.entityTypeKeys).toContain('PurchaseOrderItem'); + }); + }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3430cddecef..ec68dcf41ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2868,10 +2868,10 @@ importers: version: 6.3.0(@types/node@20.19.37)(mem-fs@2.1.0)(yeoman-environment@3.19.3(@types/node@20.19.37))(yeoman-generator@5.10.0(mem-fs@2.1.0)(yeoman-environment@3.19.3(@types/node@20.19.37))) packages/generator-odata-downloader: - devDependencies: + dependencies: '@sap-devx/yeoman-ui-types': - specifier: 1.23.0 - version: 1.23.0 + specifier: 1.22.0 + version: 1.22.0 '@sap-ux/annotation-converter': specifier: 0.10.21 version: 0.10.21 @@ -2924,8 +2924,8 @@ importers: specifier: 8.2.6 version: 8.2.6 '@types/yeoman-generator': - specifier: 5.2.14 - version: 5.2.14 + specifier: 5.2.11 + version: 5.2.11 '@vscode-logging/logger': specifier: 2.0.8 version: 2.0.8 @@ -2933,14 +2933,14 @@ importers: specifier: 4.3.1 version: 4.3.1 i18next: - specifier: 25.10.10 - version: 25.10.10(typescript@5.9.3) + specifier: 25.8.18 + version: 25.8.18(typescript@5.9.3) inquirer: specifier: 8.2.7 version: 8.2.7(@types/node@22.19.10) odata-query: - specifier: 8.0.7 - version: 8.0.7 + specifier: 8.0.5 + version: 8.0.5 os-name: specifier: 4.0.1 version: 4.0.1 @@ -8699,6 +8699,9 @@ packages: resolution: {integrity: sha512-MXjbREcdN4+ghj9LF0lkPLLDyb0vxxoC59CCkpz9uNUnpjSN/OWL1g/LNR1lkJ0+7MjaAhK95afo9Jhr02yQjQ==} engines: {node: '>=14.21.2'} + '@sap-devx/yeoman-ui-types@1.22.0': + resolution: {integrity: sha512-t2BgSyRL700OSVlVW/6OC3pAED9V7nlp8PcZOijwAVn7sAPM0oNTKrDhz0yg+F79/AhmhzUkuIBiWHN6/An6cQ==} + '@sap-devx/yeoman-ui-types@1.23.0': resolution: {integrity: sha512-dtJF8TsUimKV/lt0i6oipftbfseA6Ie9E7emBoGBS+hvOFVdj4Dusa/W6bQYJk2JgCRIm9ZExxcOP2OFw3HWOg==} @@ -9563,9 +9566,6 @@ packages: '@types/cross-spawn@6.0.6': resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} @@ -13460,6 +13460,14 @@ packages: typescript: optional: true + i18next@25.8.18: + resolution: {integrity: sha512-lzY5X83BiL5AP77+9DydbrqkQHFN9hUzWGjqjLpPcp5ZOzuu1aSoKaU3xbBLSjWx9dAzW431y+d+aogxOZaKRA==} + peerDependencies: + typescript: ^5 + peerDependenciesMeta: + typescript: + optional: true + ibm-cloud-sdk-core@5.4.9: resolution: {integrity: sha512-340fGcZEwUBdxBOPmn8V8fIiFRWF92yFqSFRNLwPQz4h+PS4jcAyd3JGqU6CpFqzUTt+PatVX/jHFwzUTVdmxQ==} engines: {node: '>=20'} @@ -15380,8 +15388,8 @@ packages: obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - odata-query@8.0.7: - resolution: {integrity: sha512-IB/iQjcK/B8omLGCXcWolP/Vkk+7gTC5maiTBbe02HhBKG8JCl5FWuKg1Sl6gim8LBsb3vVIrYG8vU7486gpcg==} + odata-query@8.0.5: + resolution: {integrity: sha512-uteX6kmx4Y8LkEjdLuhXagI2GXQbJHvmfbI6z4PKcGj7vv5bLM6cX3vrBQsLr2JQStk0MUouRtkcja4pQhFKhg==} on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} @@ -23246,6 +23254,8 @@ snapshots: dependencies: node-cache: 5.1.2 + '@sap-devx/yeoman-ui-types@1.22.0': {} + '@sap-devx/yeoman-ui-types@1.23.0': {} '@sap-ux/annotation-converter@0.10.21': @@ -24735,10 +24745,6 @@ snapshots: dependencies: '@types/node': 20.0.0 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 @@ -25132,8 +25138,8 @@ snapshots: '@types/yeoman-generator@5.2.11': dependencies: - '@types/debug': 4.1.12 - '@types/ejs': 3.1.2 + '@types/debug': 4.1.13 + '@types/ejs': 3.1.5 '@types/inquirer': 8.2.6 '@types/mem-fs-editor': 7.0.1 '@types/yeoman-environment': 2.10.11 @@ -29554,6 +29560,12 @@ snapshots: optionalDependencies: typescript: 5.9.3 + i18next@25.8.18(typescript@5.9.3): + dependencies: + '@babel/runtime': 7.29.2 + optionalDependencies: + typescript: 5.9.3 + ibm-cloud-sdk-core@5.4.9: dependencies: '@types/debug': 4.1.13 @@ -32007,7 +32019,7 @@ snapshots: obuf@1.1.2: {} - odata-query@8.0.7: + odata-query@8.0.5: dependencies: tslib: 2.8.1