diff --git a/independent-publisher-connectors/Sap Successfactors/ConnectorPackage.zip b/independent-publisher-connectors/Sap Successfactors/ConnectorPackage.zip new file mode 100644 index 0000000000..e93ee11abb Binary files /dev/null and b/independent-publisher-connectors/Sap Successfactors/ConnectorPackage.zip differ diff --git a/independent-publisher-connectors/Sap Successfactors/apiDefinition.swagger.json b/independent-publisher-connectors/Sap Successfactors/apiDefinition.swagger.json new file mode 100644 index 0000000000..e171db29ce --- /dev/null +++ b/independent-publisher-connectors/Sap Successfactors/apiDefinition.swagger.json @@ -0,0 +1,753 @@ +{ + "swagger": "2.0", + "info": { + "title": "PremiumConnector SF", + "description": "Connector for SAP SuccessFactors Modules.", + "version": "1.0.0", + "contact": { + "name": "Sascha Bajonczak", + "url": "https://sap-connectors.bajonczak.com", + "email": "xbeejayx@hotmail.com" + } + }, + "host": "sap-api.bajonczak.com", + "basePath": "/", + "schemes": [ + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "x-ms-connector-metadata": [ + { + "propertyName": "Website", + "propertyValue": "https://sap-connectors.bajonczak.com" + }, + { + "propertyName": "Privacy policy", + "propertyValue": "https://blog.bajonczak.com/privacy-policy/" + } + ], + "securityDefinitions": { + "oauth2_auth": { + "type": "oauth2", + "flow": "accessCode", + "authorizationUrl": "https://sap-api.bajonczak.com/oauth2/authorize", + "tokenUrl": "https://sap-api.bajonczak.com/oauth2/token", + "refreshUrl": "https://sap-api.bajonczak.com/oauth2/token", + "clientId": "c6917df8-0049-46b5-8136-11b10d8d7e59", + "clientSecret": "Dummy value - replace in production", + "scopes": { + "premiumconnector.read": "Read access to PremiumConnector resources", + "premiumconnector.write": "Write access to PremiumConnector resources" + } + } + }, + "security": [ + { + "oauth2_auth": [ + "premiumconnector.read" + ] + } + ], + "paths": { + "/api/v1/plans": { + "get": { + "summary": "List plans", + "description": "Returns all active plans for pricing and onboarding.", + "operationId": "Plans_GetAll", + "x-ms-summary": "List plans", + "security": [], + "responses": { + "200": { + "description": "Plan list", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PlanDto" + } + } + } + } + } + }, + "/api/v1/job-postings": { + "get": { + "summary": "List job postings", + "description": "Returns job requisitions from SuccessFactors through PremiumConnector.", + "operationId": "JobPosting_GetJobPostings", + "x-ms-summary": "List job postings", + "parameters": [ + { + "name": "templateType", + "in": "query", + "type": "string", + "required": false, + "x-ms-summary": "Template type", + "x-ms-visibility": "advanced", + "description": "Optional template type filter, for example JOB_REQ." + }, + { + "name": "activeOnly", + "in": "query", + "type": "boolean", + "required": false, + "default": false, + "x-ms-summary": "Active only", + "description": "When true, returns only active postings." + }, + { + "name": "top", + "in": "query", + "type": "integer", + "format": "int32", + "required": false, + "default": 50, + "x-ms-summary": "Page size", + "x-ms-visibility": "advanced", + "description": "Maximum number of results to return." + }, + { + "name": "skip", + "in": "query", + "type": "integer", + "format": "int32", + "required": false, + "default": 0, + "x-ms-summary": "Offset", + "x-ms-visibility": "advanced", + "description": "Number of items to skip for paging." + } + ], + "responses": { + "200": { + "description": "Job posting list", + "schema": { + "$ref": "#/definitions/JobPostingListResponse" + } + } + } + } + }, + "/api/v1/job-postings/{id}": { + "get": { + "summary": "Get job posting by id", + "description": "Returns a single job requisition by id.", + "operationId": "JobPosting_GetJobPostingById", + "x-ms-summary": "Get job posting by id", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int32", + "x-ms-summary": "Job posting id", + "description": "Internal PremiumConnector job posting identifier." + } + ], + "responses": { + "200": { + "description": "Job posting", + "schema": { + "$ref": "#/definitions/JobRequisition" + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/api/v1/job-applications": { + "get": { + "summary": "List job applications", + "description": "Returns paged job applications and supports filtering by jobReqId and status.", + "operationId": "JobApplication_GetJobApplications", + "x-ms-summary": "List job applications", + "parameters": [ + { + "name": "jobReqId", + "in": "query", + "type": "integer", + "format": "int64", + "required": false, + "x-ms-summary": "Job requisition id", + "x-ms-visibility": "advanced" + }, + { + "name": "status", + "in": "query", + "type": "string", + "required": false, + "x-ms-summary": "Application status", + "x-ms-visibility": "advanced" + }, + { + "name": "top", + "in": "query", + "type": "integer", + "format": "int32", + "required": false, + "default": 50, + "x-ms-summary": "Page size", + "x-ms-visibility": "advanced" + }, + { + "name": "skip", + "in": "query", + "type": "integer", + "format": "int32", + "required": false, + "default": 0, + "x-ms-summary": "Offset", + "x-ms-visibility": "advanced" + } + ], + "responses": { + "200": { + "description": "Job application list", + "schema": { + "$ref": "#/definitions/JobApplicationListResponse" + } + } + } + } + }, + "/api/v1/job-applications/{id}": { + "get": { + "summary": "Get job application by id", + "description": "Returns a single job application by its id.", + "operationId": "JobApplication_GetJobApplicationById", + "x-ms-summary": "Get job application by id", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer", + "format": "int64", + "x-ms-summary": "Application id" + } + ], + "responses": { + "200": { + "description": "Job application", + "schema": { + "$ref": "#/definitions/JobApplication" + } + }, + "404": { + "description": "Not found" + } + } + } + }, + "/api/v1/job-interviews": { + "post": { + "summary": "Create interview", + "description": "Creates a new interview for an existing job application.", + "operationId": "JobInterview_CreateInterview", + "x-ms-summary": "Create interview", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateJobInterviewRequest" + } + } + ], + "responses": { + "201": { + "description": "Interview created", + "schema": { + "$ref": "#/definitions/CreateJobInterviewResponse" + } + } + } + } + }, + "/api/v1/candidates": { + "get": { + "summary": "List candidates", + "description": "Returns a list of candidates.", + "operationId": "Candidate_GetCandidates", + "x-ms-summary": "List candidates", + "parameters": [ + { + "name": "top", + "in": "query", + "type": "integer", + "format": "int32", + "required": false, + "default": 20, + "x-ms-summary": "Max results", + "x-ms-visibility": "advanced" + } + ], + "responses": { + "200": { + "description": "Candidate list", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/CandidateResponse" + } + } + } + } + }, + "post": { + "summary": "Create candidate", + "description": "Creates a candidate in SuccessFactors.", + "operationId": "Candidate_CreateCandidate", + "x-ms-summary": "Create candidate", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CandidateRequest" + } + } + ], + "responses": { + "201": { + "description": "Candidate created", + "schema": { + "$ref": "#/definitions/CandidateResponse" + } + } + } + } + }, + "/api/v1/candidates/{candidateId}": { + "get": { + "summary": "Get candidate by id", + "description": "Returns a candidate by SuccessFactors candidate id.", + "operationId": "Candidate_GetCandidateById", + "x-ms-summary": "Get candidate by id", + "parameters": [ + { + "name": "candidateId", + "in": "path", + "required": true, + "type": "string", + "x-ms-summary": "Candidate id" + } + ], + "responses": { + "200": { + "description": "Candidate", + "schema": { + "$ref": "#/definitions/CandidateResponse" + } + } + } + }, + "patch": { + "summary": "Update candidate", + "description": "Updates an existing candidate.", + "operationId": "Candidate_UpdateCandidate", + "x-ms-summary": "Update candidate", + "parameters": [ + { + "name": "candidateId", + "in": "path", + "required": true, + "type": "string", + "x-ms-summary": "Candidate id" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CandidateRequest" + } + } + ], + "responses": { + "200": { + "description": "Candidate updated", + "schema": { + "$ref": "#/definitions/CandidateResponse" + } + } + } + } + }, + "/api/v1/picklists/{picklistId}": { + "get": { + "summary": "Get picklist values", + "description": "Returns all values for the given picklist id.", + "operationId": "Picklist_GetPicklist", + "x-ms-summary": "Get picklist values", + "parameters": [ + { + "name": "picklistId", + "in": "path", + "required": true, + "type": "string", + "x-ms-summary": "Picklist id" + } + ], + "responses": { + "200": { + "description": "Picklist values", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PicklistOption" + } + } + } + } + } + }, + "/api/v1/metadata/entities/{entityName}/fields": { + "get": { + "summary": "Get entity fields", + "description": "Returns available field names for a SuccessFactors entity.", + "operationId": "Metadata_GetEntityFields", + "x-ms-summary": "Get entity fields", + "parameters": [ + { + "name": "entityName", + "in": "path", + "required": true, + "type": "string", + "x-ms-summary": "Entity name" + } + ], + "responses": { + "200": { + "description": "Entity fields", + "schema": { + "$ref": "#/definitions/EntityFieldsResponse" + } + } + } + } + }, + "/api/v1/metadata/raw": { + "get": { + "summary": "Get raw metadata", + "description": "Returns raw EDMX metadata XML as text.", + "operationId": "Metadata_GetRawMetadata", + "x-ms-summary": "Get raw metadata", + "produces": [ + "application/xml", + "application/json" + ], + "responses": { + "200": { + "description": "Raw metadata", + "schema": { + "type": "string" + } + } + } + } + } + }, + "definitions": { + "PlanDto": { + "type": "object", + "required": [ + "id", + "name", + "requestQuota", + "pricePerMonth" + ], + "properties": { + "id": { + "type": "string", + "format": "uuid" + }, + "name": { + "type": "string" + }, + "requestQuota": { + "type": "integer", + "format": "int32" + }, + "maxApiKeys": { + "type": "integer", + "format": "int32" + }, + "pricePerMonth": { + "type": "number", + "format": "double" + } + } + }, + "JobPostingListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/JobRequisition" + } + }, + "top": { + "type": "integer", + "format": "int32" + }, + "skip": { + "type": "integer", + "format": "int32" + } + } + }, + "JobRequisition": { + "type": "object", + "properties": { + "jobReqId": { + "type": "string" + }, + "jobReqLocale": { + "type": "string" + }, + "title": { + "type": "string" + }, + "templateType": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "JobApplicationListResponse": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/JobApplication" + } + }, + "count": { + "type": "integer", + "format": "int32" + }, + "top": { + "type": "integer", + "format": "int32" + }, + "skip": { + "type": "integer", + "format": "int32" + } + } + }, + "JobApplication": { + "type": "object", + "properties": { + "applicationId": { + "type": "string" + }, + "jobReqId": { + "type": "string" + }, + "status": { + "type": "string" + }, + "candidateId": { + "type": "string" + }, + "candidateNameLF": { + "type": "string" + }, + "applicationDate": { + "type": "string" + }, + "lastModifiedDate": { + "type": "string" + } + }, + "additionalProperties": true + }, + "CreateJobInterviewRequest": { + "type": "object", + "required": [ + "applicationId" + ], + "properties": { + "applicationId": { + "type": "string" + }, + "startDate": { + "type": "string", + "format": "date-time" + }, + "endDate": { + "type": "string", + "format": "date-time" + }, + "isTimeSet": { + "type": "boolean" + }, + "templateType": { + "type": "string" + }, + "source": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "interviewerUserId": { + "type": "string" + } + } + }, + "CreateJobInterviewResponse": { + "type": "object", + "properties": { + "applicationId": { + "type": "string" + }, + "startDate": { + "type": "string", + "format": "date-time" + }, + "endDate": { + "type": "string", + "format": "date-time" + }, + "isTimeSet": { + "type": "boolean" + }, + "templateType": { + "type": "string" + }, + "source": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "interviewerUserId": { + "type": "string" + } + } + }, + "CandidateRequest": { + "type": "object", + "required": [ + "firstName", + "lastName", + "country", + "primaryEmail" + ], + "properties": { + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "country": { + "type": "string" + }, + "primaryEmail": { + "type": "string", + "format": "email" + }, + "address": { + "type": "string" + }, + "cellPhone": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "minAnnualSal": { + "type": "string" + }, + "city": { + "type": "string" + } + }, + "additionalProperties": true + }, + "CandidateResponse": { + "type": "object", + "properties": { + "candidateId": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "primaryEmail": { + "type": "string", + "format": "email" + }, + "country": { + "type": "string" + }, + "cellPhone": { + "type": "string" + }, + "gender": { + "type": "string" + }, + "minAnnualSal": { + "type": "string" + } + }, + "additionalProperties": true + }, + "PicklistOption": { + "type": "object", + "properties": { + "picklistId": { + "type": "string" + }, + "optionId": { + "type": "string" + }, + "externalCode": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "additionalProperties": true + }, + "EntityFieldsResponse": { + "type": "object", + "properties": { + "entityName": { + "type": "string" + }, + "fields": { + "type": "array", + "items": { + "type": "string" + } + }, + "count": { + "type": "integer", + "format": "int32" + } + } + } + } +} \ No newline at end of file diff --git a/independent-publisher-connectors/Sap Successfactors/apiProperties.json b/independent-publisher-connectors/Sap Successfactors/apiProperties.json new file mode 100644 index 0000000000..81e168af83 --- /dev/null +++ b/independent-publisher-connectors/Sap Successfactors/apiProperties.json @@ -0,0 +1,41 @@ +{ + "properties": { + "publisher": "Sascha Bajonczak", + "stackOwner": "Sascha Bajonczak", + "connectionParameters": { + "token": { + "type": "oauthSetting", + "oAuthSettings": { + "identityProvider": "oauth2", + "clientId": "c6917df8-0049-46b5-8136-11b10d8d7e59", + "clientSecret": "DUMMY VALUE - REPLACE IN PRODUCTION", + "scopes": [ + "premiumconnector.read", + "premiumconnector.write" + ], + "redirectMode": "Global", + "redirectUrl": "https://global.consent.azure-apim.net/redirect", + "properties": { + "IsFirstParty": "False" + }, + "customParameters": { + "authorizationUrl": { + "value": "https://test-sf-premium-connector-api.realapps.org/oauth2/authorize" + }, + "tokenUrl": { + "value": "https://test-sf-premium-connector-api.realapps.org/oauth2/token" + }, + "refreshUrl": { + "value": "https://test-sf-premium-connector-api.realapps.org/oauth2/token" + } + } + } + } + }, + "iconBrandColor": "#0A66C2", + "capabilities": [ + "actions" + ], + "policyTemplateInstances": [] + } +} diff --git a/independent-publisher-connectors/Sap Successfactors/intro.md b/independent-publisher-connectors/Sap Successfactors/intro.md new file mode 100644 index 0000000000..b56634f873 --- /dev/null +++ b/independent-publisher-connectors/Sap Successfactors/intro.md @@ -0,0 +1,87 @@ +# SuccessFactors Career Connector + +## Introduction + +The SuccessFactors Career Connector provides a structured integration layer for creating and maintaining career-related data in SAP SuccessFactors. The connector is designed to simplify the interaction between external systems, automation platforms, and SuccessFactors by exposing clear and reusable actions for common recruiting and career-management scenarios. + +In its current version, the connector focuses on the **Candidate** area of SAP SuccessFactors. It supports the creation and modification of candidate records and is intended to help automate candidate intake processes from external sources such as Copilot Studio, Power Automate, custom business applications, HR portals, or other integration services. + +The connector is being developed step by step. The first major implementation phase concentrates on the **Career / Recruiting module**, starting with candidate management and gradually extending into related recruiting objects and processes. + +## Current Capabilities + +The initial version of the connector supports core candidate operations in SuccessFactors. + +This includes the ability to create new candidates and update existing candidate information. Candidate data can be enriched with additional metadata to provide a more complete candidate profile inside SuccessFactors. + +Examples of supported or planned candidate-related metadata include: + +- Personal candidate information +- Contact details +- Education history +- Outside work experience +- Job position references +- Career-related background information +- Additional recruiting metadata required for downstream processes + +The goal is to provide a reliable and reusable connector interface that hides the complexity of the underlying SuccessFactors API and allows consuming systems to work with a simplified and business-oriented model. + +## Planned Extension of the Career Module + +After the candidate-management functionality has been completed and stabilized, the next development step is to extend the connector further into the recruiting process. + +The planned roadmap includes support for creating and managing job-related objects, especially job offerings and job requisition-related data. This will allow external systems not only to submit and enrich candidate data, but also to support the creation and maintenance of job opportunities within SuccessFactors. + +The intended flow is: + +1. Create or update candidate records. +2. Enrich candidates with relevant metadata such as education, work experience, and job-position information. +3. Extend the connector to support job offering creation. +4. Build a broader integration layer for recruiting and career-related SuccessFactors processes. + +## Purpose of the Connector + +The main purpose of this connector is to provide a clean, reusable, and automation-friendly interface for SAP SuccessFactors Career and Recruiting scenarios. + +Instead of requiring every consuming application or automation flow to deal directly with the complexity of the SuccessFactors OData API, the connector offers dedicated actions with clear input and output structures. + +This makes it easier to: + +- Integrate SuccessFactors with Copilot Studio +- Build HR automation workflows +- Standardize candidate creation processes +- Reduce manual data entry +- Improve data quality through structured metadata enrichment +- Reuse the same integration logic across multiple business scenarios +- Prepare future extensions for job offerings and additional recruiting processes + +## Target Scenario + +A typical scenario for this connector is an HR or recruiting automation where candidate information is collected through an external interface and then transferred into SuccessFactors. + +For example, a Copilot Studio agent could collect candidate information during a conversation, extract structured data such as name, contact details, education, work experience, and job interests, and then use this connector to create or update the candidate record in SuccessFactors. + +In a later stage, the same connector family can be extended to support the creation of job offers or job postings, allowing a more complete end-to-end recruiting automation scenario. + +## Development Status + +This connector is currently in an early implementation phase. + +The current focus is: + +- Candidate creation +- Candidate modification +- Candidate metadata enrichment +- Preparation for additional career-module functionality + +Future development will focus on expanding the recruiting scope, especially around job offerings and related career objects. + +## Summary + +The SuccessFactors Career Connector is intended to become a dedicated integration layer for SAP SuccessFactors recruiting and career processes. The first implementation step focuses on candidates and candidate metadata enrichment. Future versions will expand the connector to support job offerings and broader recruiting workflows. + +This phased approach allows the connector to deliver value early while keeping the architecture flexible for future SuccessFactors Career module extensions. + +# Contact +Sascha Bajonczak (xbeejayx@hotxxxx.com) +https://blog.bajonczak.com \ No newline at end of file diff --git a/independent-publisher-connectors/Sap Successfactors/readme.md b/independent-publisher-connectors/Sap Successfactors/readme.md new file mode 100644 index 0000000000..b8dedbbed8 --- /dev/null +++ b/independent-publisher-connectors/Sap Successfactors/readme.md @@ -0,0 +1,59 @@ +# PremiumConnector SF +PremiumConnector SF is an connector for SAP SuccessFactors recruiting and metadata scenarios, exposed through the PremiumConnector API. It is designed for Microsoft Power Platform and can be imported as a custom connector. + +PremiumConnector SF is not affiliated with, associated with, authorized by, endorsed by, or officially connected to SAP SE (including SAP SuccessFactors), Microsoft, or any of their affiliates. SAP, SuccessFactors, and related names are trademarks of their respective owners. + +## Publisher: Sascha Bajonczak + +## Prerequisites +There are no speciel requirements needed. Only the Authentication settings described below. + +## Authentication +- Connector authentication in Power Platform: OAuth 2.0 (authorization code flow). +- The client ID is provided +- I will share the secred on a secure channel with you. please tell me your prefered way to send this secret to you + +## Supported Operations + +### List plans +Returns all active plans for pricing and onboarding. + +### List job postings +Returns job requisitions from SuccessFactors through PremiumConnector. + +### Get job posting by id +Returns a single job requisition by id. + +### List job applications +Returns paged job applications and supports filtering by jobReqId and status. + +### Get job application by id +Returns a single job application by its id. + +### Create interview +Creates a new interview for an existing job application. + +### List candidates +Returns a list of candidates. + +### Create candidate +Creates a candidate in SuccessFactors. + +### Get candidate by id +Returns a candidate by SuccessFactors candidate id. + +### Update candidate +Updates an existing candidate. + +### Get picklist values +Returns all values for the given picklist id. + +### Get entity fields +Returns available field names for a SuccessFactors entity. + +### Get raw metadata +Returns raw EDMX metadata XML as text. + +## Notes +- Operation availability depends on backend configuration and SuccessFactors role permissions. +- If an action fails with authorization or missing field errors, verify SuccessFactors API permissions, entity access, and environment-specific endpoint settings. \ No newline at end of file diff --git a/schemas/RunSuccess-1.png b/schemas/RunSuccess-1.png new file mode 100644 index 0000000000..8c0c883474 Binary files /dev/null and b/schemas/RunSuccess-1.png differ diff --git a/schemas/RunSuccess-2.png b/schemas/RunSuccess-2.png new file mode 100644 index 0000000000..6349767504 Binary files /dev/null and b/schemas/RunSuccess-2.png differ diff --git a/schemas/RunSuccess-3.png b/schemas/RunSuccess-3.png new file mode 100644 index 0000000000..059511b1ff Binary files /dev/null and b/schemas/RunSuccess-3.png differ