Skip to content

Promotion Nomination Extend App example - #20

Open
abhi-matti wants to merge 14 commits into
Workday:mainfrom
abhi-matti:promotion-nomination-example-submission
Open

abhi-matti wants to merge 14 commits into
Workday:mainfrom
abhi-matti:promotion-nomination-example-submission

Conversation

@abhi-matti

Copy link
Copy Markdown

What this PR adds or changes

Adds a new Workday Extend App example for the promotion nomination flow (examples/promotion-nomination).

Core Features

  • Manager Self-Service Nomination: Allows managers to select eligible direct reports, propose target job profiles, and submit structured promotion justifications.
  • Dynamic Worker Data Lookup: Uses WQL queries to automatically populate current job profile, tenure, and reporting hierarchy for selected direct reports.
  • Approval Workflow & Tracking: Routes submitted nominations to HR Business Partners and leadership for review, approval, or revision requests.

Checklist for new or changed examples

  • The example lives entirely in its own folder under examples/
  • node scripts/validate-examples.mjs --check passes
  • The README says what the artifact is, how to use it, and what to change before deploying it
  • No credentials, tenant names, or real personal data anywhere in the folder
  • node scripts/audit-examples.mjs --changed passes

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example audit: 40 inline comment(s). The summary comment on this PR has the full list.

Comment thread examples/promotion-nomination/presentation/eventDetails.pmd
Comment thread examples/promotion-nomination/presentation/eventDetails.pmd
Comment thread examples/promotion-nomination/presentation/eventDetails.pmd
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/promotionNomination_rvylxm.amd Outdated

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example audit, continued (21 to 40 of 40).

Comment thread examples/promotion-nomination/presentation/promotionNomination_rvylxm.amd Outdated
Comment thread examples/promotion-nomination/presentation/promotionNomination_rvylxm.amd Outdated
Comment thread examples/promotion-nomination/presentation/promotionNomination_rvylxm.amd Outdated
Comment thread examples/promotion-nomination/presentation/promotionNomination_rvylxm.amd Outdated
Comment thread examples/promotion-nomination/presentation/eventDetails.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
Comment thread examples/promotion-nomination/presentation/managerNomination.pmd Outdated
@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Example audit

Audited examples/promotion-nomination. Passed: hub packaging checks (folder name, example.json, README sections); no hardcoded Workday URLs or app ids; no debug logging.

0 to fix and 5 suggestion(s).

Suggestions (5, never block)
Where Rule What to change
examples/promotion-nomination ArcaneAuditorWarning Arcane Auditor could not parse part of this folder, so some script rules were skipped: * EQUALS
examples/promotion-nomination/presentation/managerNomination.pmd line 25 PMDSectionOrderingRule PMD sections are not in the correct order. Expected: [1. id, 2. securityDomains, 3. endPoints, 4. outboundData, 5. presentation, 6. deferred, 7. name, 8. baseUrlType, 9. authType, 10. url, 11. failOnStatusCodes] Actual: [1. id, 2. securityDomains, 3. endPoints, 4. deferred, 5. name, 6. baseUrlType, 7. authType, 8. url, 9. failOnStatusCodes, 10. outboundData, 11. presentation]
examples/promotion-nomination/presentation/managerNomination.pmd line 29 ScriptStringConcatRule Inbound endpoint 'getEmployeeData' uses string concatenation with + operator: ''/data?query=' + string:urlEncodeSELECT worker, location, manager_Level01, hireDate, timeInJobProfile, jobProfile, jobTitle, lastPromotionDate FROM myDirectReports WHERE worker in "{{selectedWorkerIdQuery}}"'. Consider using PMD template strings with backticks and {{ }} syntax instead (e.g., Hello {{name}}!). Replace '/data?query=' + string:urlEncodeSELECT worker, location, manager_Level01, hireDate, timeInJobProfile, jobProfile, jobTitle, lastPromotionDate FROM myDirectReports WHERE worker in "{{selectedWorkerIdQuery}}"with/data?query={{string:urlEncodeSELECT worker, location, manager_Level01, hireDate, timeInJobProfile, jobProfile, jobTitle, lastPromotionDate FROM myDirectReports WHERE worker in "{{selectedWorkerIdQuery}}"}}``.
examples/promotion-nomination/presentation/managerNomination.pmd line 38 ScriptStringConcatRule Inbound endpoint 'getJobProfiles' uses string concatenation with + operator: ''/data?query=' + string:urlEncodeSELECT jobProfileName, workdayID FROM allActiveJobProfiles (dataSourceFilter = defaultFilter) WHERE jobProfileName startswith "{{instanceListQuery}}"'. Consider using PMD template strings with backticks and {{ }} syntax instead (e.g., Hello {{name}}!). Replace '/data?query=' + string:urlEncodeSELECT jobProfileName, workdayID FROM allActiveJobProfiles (dataSourceFilter = defaultFilter) WHERE jobProfileName startswith "{{instanceListQuery}}"with/data?query={{string:urlEncodeSELECT jobProfileName, workdayID FROM allActiveJobProfiles (dataSourceFilter = defaultFilter) WHERE jobProfileName startswith "{{instanceListQuery}}"}}``.
examples/promotion-nomination/presentation/managerNomination.pmd line 131 EndpointNameLowerCamelCaseRule Outbound Endpoint 'ExtensionResponse' doesn't follow naming conventions. Must follow lowerCamelCase convention (e.g., 'myField', 'userName').

Run it yourself: ./scripts/install-arcane.sh once, then node scripts/audit-examples.mjs --changed. Rule explanations and fixes: docs/EXAMPLE_BEST_PRACTICES.md.

ACTION items fail the Audit examples check. ADVICE never blocks. Maintainers can add the audit-override label to merge with open ACTION items.

Updated the README to clarify the purpose and functionality of the Promotion Nomination App, including detailed usage instructions and key capabilities.
Updated the description to provide more detailed information about the promotion nomination process.
Clarified app reference ID details and updated instructions for tenant-specific configurations.
Added details about the site definition and security domain usage.
Updated API endpoint values to use dynamic gateway endpoint.
Removed duplicate siteId and applicationId fields, and adjusted JSON structure.
Updated the manager nomination presentation file to include additional failOnStatusCodes and modified query construction for various endpoints.
Clarified instructions for app reference ID and provided guidance for handling errors in the app builder.
@abhi-matti

Copy link
Copy Markdown
Author

All comments have been fixed.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example audit: 4 inline comment(s). The summary comment on this PR has the full list.

"failOnStatusCodes": [{"code": 400}, {"code": 403}]
},
{
"deferred": true,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PMDSectionOrderingRule (ADVICE)

PMD sections are not in the correct order.
Expected: [1. id, 2. securityDomains, 3. endPoints, 4. outboundData, 5. presentation, 6. deferred, 7. name, 8. baseUrlType, 9. authType, 10. url, 11. failOnStatusCodes]
Actual: [1. id, 2. securityDomains, 3. endPoints, 4. deferred, 5. name, 6. baseUrlType, 7. authType, 8. url, 9. failOnStatusCodes, 10. outboundData, 11. presentation]

Why: Ensures PMD file root-level sections follow consistent ordering for better readability

Read more

"name": "getEmployeeData",
"baseUrlType": "workday-wql",
"authType": "sso",
"url": "<% return '/data?query=' + string:urlEncode(`SELECT worker, location, manager_Level01, hireDate, timeInJobProfile, jobProfile, jobTitle, lastPromotionDate FROM myDirectReports WHERE worker in \"{{selectedWorkerIdQuery}}\"`); %>",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ScriptStringConcatRule (ADVICE)

Inbound endpoint 'getEmployeeData' uses string concatenation with + operator: ''/data?query=' + string:urlEncodeSELECT worker, location, manager_Level01, hireDate, timeInJobProfile, jobProfile, jobTitle, lastPromotionDate FROM myDirectReports WHERE worker in "{{selectedWorkerIdQuery}}"'. Consider using PMD template strings with backticks and {{ }} syntax instead (e.g., Hello {{name}}!).

Why: Detects string concatenation with + operator - use PMD templates with backticks and {{ }} instead

Suggested change:

`/data?query={{string:urlEncode`SELECT worker, location, manager_Level01, hireDate, timeInJobProfile, jobProfile, jobTitle, lastPromotionDate FROM myDirectReports WHERE worker in "{{selectedWorkerIdQuery}}"`}}`

Read more

},
{
"type": "outboundVariable",
"name": "ExtensionResponse",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EndpointNameLowerCamelCaseRule (ADVICE)

Outbound Endpoint 'ExtensionResponse' doesn't follow naming conventions. Must follow lowerCamelCase convention (e.g., 'myField', 'userName').

Why: Ensures endpoint names follow lowerCamelCase naming convention (style guide)

Read more

@@ -0,0 +1,19 @@
{
"id": "promotionNomination_rvylxm",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HubAppReferenceIdRule (ADVICE)

"promotionNomination_rvylxm" is the app reference id Workday generated for the original tenant (the _rvylxm suffix). Anyone who imports this example gets a different suffix. Add a "## Before you deploy" section to the README that tells readers to replace it, or reference it dynamically with site.applicationId in scripts.

Why: A tenant-generated app reference id (the _xxxxxx suffix) is baked into the example without telling readers to replace it.

Read more

@chumphrey-wd

Copy link
Copy Markdown
Collaborator

Hey @abhi-matti!

Just one small tweak needed - can you change your README to be README.md? Right now it has an uppercase extension, and I'd like to keep it consistent across projects. Once you do that, we should be able to get it merged in!

Thanks so much for the contribution!

@abhi-matti

Copy link
Copy Markdown
Author

Hello @chumphrey-wd

Updated the readme.md as specified and added the example to the main README too. Please check.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants