Skip to content

Recruitment Integrations for External ATS Vendor SmartRecruiters

The purpose of this page is to provide the development guidelines about the implementations to third party recruitment integration with SmartRecruiters on IFS Cloud Human Capital Management solutions.

Main functionalities are in co-operated with the external recruitment vendor SmartRecruiters;

  • Publishing a Job Vacancy
  • Retrieving the candidates applied

Publishing a Job Vacancy

General Information

As seen in the above image, once the recruitment requisition is approved. The user will be able to see the "Send Job" button in the "Job Posting" data submenu. Once the user click on the "Send Job" button, after filling the mandatory values given below the job vacancy will be created in the SmartRecruiters side with the state "CREATED".

Mapping Information

In order to successfully send the job vacancy details to the SmartRecruiters following mandatory values should be defined in IFS before the integration,

  • Industry Areas
  • Job Functional Areas
  • Employment Type
  • Job Grade

For the integration, following data should available in each page mentioned above.

Basic Data for Industry Areas;

Industry AreaIndustry Area Description
accountingAccounting
airlines_aviationAirlines/Aviation
alternative_dispute_resolutionAlternative Dispute Resolution
alternative_medicineAlternative Medicine
animationAnimation
apparel_and_fashionApparel And Fashion
architecture_and_planningArchitecture And Planning
arts_and_craftsArts And Crafts
automotiveAutomotive
aviation_and_aerospaceAviation And Aerospace
bankingBanking
biotechnologyBiotechnology
broadcast_mediaBroadcast Media
building_materialsBuilding Materials
business_supplies_and_equipmentBusiness Supplies And Equipment
capital_marketsCapital Markets
chemicalsChemicals
civic_and_social_organizationCivic And Social Organization
civil_engineeringCivil Engineering
commercial_real_estateCommercial Real Estate
computer_and_network_securityComputer And Network Security
computer_gamesComputer Games
computer_hardwareComputer Hardware
computer_networkingComputer Networking
computer_softwareComputer Software
constructionConstruction
consumer_electronicsConsumer Electronics
consumer_goodsConsumer Goods
consumer_servicesConsumer Services
cosmeticsCosmetics
dairyDairy
defense_and_spaceDefense And Space
designDesign
elearningE-Learning
education_managementEducation Management
electrical_manufacturingElectrical And Electronic Manufacturing
entertainmentEntertainment
environmental_servicesEnvironmental Services
events_servicesEvents Services
executive_officeExecutive Office
facilities_servicesFacilities Services
farmingFarming
financial_servicesFinancial Services
fine_artFine Art
fisheryFishery
food_and_beveragesFood And Beverages
food_productionFood Production
fundraisingFundraising
furnitureFurniture
gambling_and_casinosGambling And Casinos
glass_ceramics_concreteGlass, Ceramics And Concrete
government_administrationGovernment Administration
government_relationsGovernment Relations
graphic_designGraphic Design
health_wellness_fitnessHealth, Wellness And Fitness
higher_educationHigher Education
hospital_and_health_careHospital And Health Care
hospitalityHospitality
human_resourcesHuman Resources
import_and_exportImport And Export
individual_and_family_servicesIndividual And Family Services
industrial_automationIndustrial Automation
information_servicesInformation Services
it_and_servicesInformation Technology And Services
insuranceInsurance
international_affairsInternational Affairs
international_trade_and_devInternational Trade And Development
internetInternet
investment_banking_ventureInvestment Banking/Venture
investment_managementInvestment Management
judiciaryJudiciary
law_enforcementLaw Enforcement
law_practiceLaw Practice
legal_servicesLegal Services
legislative_officeLegislative Office
leisure_and_travelLeisure And Travel
librariesLibraries
logistics_and_supply_chainLogistics And Supply Chain
luxury_goods_and_jewelryLuxury Goods And Jewelry
machineryMachinery
management_consultingManagement Consulting
maritimeMaritime
market_researchMarket Research
marketing_and_advertisingMarketing And Advertising
mechanical_engineeringMechanical Or Industrial Engineering
media_productionMedia Production
medical_deviceMedical Device
medical_practiceMedical Practice
mental_health_careMental Health Care
militaryMilitary
mining_and_metalsMining And Metals
motion_pictures_and_filmMotion Pictures And Film
museums_and_institutionsMuseums And Institutions
musicMusic
nanotechnologyNanotechnology
newspapersNewspapers
nonprofit_organization_mgmtNon-Profit Organization Management
oil_and_energyOil And Energy
online_publishingOnline Publishing
outsourcing_offshoringOutsourcing/Offshoring
package_freight_deliveryPackage/Freight Delivery
packaging_and_containersPackaging And Containers
paper_and_forest_productsPaper And Forest Products
performing_artsPerforming Arts
pharmaceuticalsPharmaceuticals
philanthropyPhilanthropy
photographyPhotography
plasticsPlastics
political_organizationPolitical Organization
primary_secondary_educationPrimary/Secondary Education
printingPrinting
professional_trainingProfessional Training
program_developmentProgram Development
public_policyPublic Policy
public_relationsPublic Relations
public_safetyPublic Safety
publishingPublishing
railroad_manufactureRailroad Manufacture
ranchingRanching
real_estateReal Estate
recreational_servicesRecreational Facilities And Services
religious_institutionsReligious Institutions
renewables_and_environmentRenewables And Environment
researchResearch
restaurantsRestaurants
retailRetail
security_and_investigationsSecurity And Investigations
semiconductorsSemiconductors
shipbuildingShipbuilding
sporting_goodsSporting Goods
sportsSports
staffing_and_recruitingStaffing And Recruiting
supermarketsSupermarkets
telecommunicationsTelecommunications
textilesTextiles
think_tanksThink Tanks
tobaccoTobacco
translation_and_localizationTranslation And Localization
transportation_trucking_railroadTransportation/Trucking/Railroad
utilitiesUtilities
venture_capitalVenture Capital
veterinaryVeterinary
warehousingWarehousing
wholesaleWholesale
wine_and_spiritsWine And Spirits
wirelessWireless
writing_and_editingWriting And Editing

Basic Data for Job Functional Areas;

Functional AreaFunctional Area Description
accounting_auditingAccounting/Auditing
administrativeAdministrative
advertisingAdvertising
analystAnalyst
art_creativeArt/Creative
business_developmentBusiness Development
consultingConsulting
customer_serviceCustomer Service
designDesign
distributionDistribution
educationEducation
engineeringEngineering
financeFinance
general_businessGeneral Business
health_care_providerHealth Care Provider
human_resourcesHuman Resources
information_technologyInformation Technology
legalLegal
managementManagement
manufacturingManufacturing
marketingMarketing
otherOther
product_managementProduct Management
productionProduction
project_managementProject Management
public_relationsPublic Relations
purchasingPurchasing
quality_assuranceQuality Assurance
researchResearch
salesSales
scienceScience
strategy_planningStrategy/Planning
supply_chainSupply Chain
trainingTraining
writing_editingWriting/Editing

Basic Data for Employment Types;

Employment TypeEmployment Type Description
part-timePart-time
contractContract
permanentFull-time
internIntern

Basic Data for Job Grades;

Job GradeJob Grade Description
associateAssociate
directorDirector
entry_levelEntry Level
executiveExecutive
internshipInternship
mid_senior_levelMid-Senior Level
not_applicableNot Applicable

Following are the other fields that needs to be filled to send a job vacancy to SmartRecruiters other than the above mentioned required Basic Data;

  • City - Retrieving via the Company work location city details.
  • Country - Need to fill when recruitment requisition is created.
  • Default Language - Retrieving the default language for the company.
  • Job Title - Retrieving when creating the recruitment requisition connected to a Job.

When sending details to SmartRecruiters we are building a JSON template including the details relevant to the job posting; The following is the sample JSON template;

{
  "title": "string",
  "refNumber": "string",
  "targetHiringDate": "2021-07-19T10:03:48.856Z",
  "location": {
    "countryCode": "string",
     "city": "string"
  },
  "industry": {
    "id": "string"
  },
  "function": {
    "id": "string"
  },
  "typeOfEmployment": {
    "id": "string"
  },
  "experienceLevel": {
    "id": "string"
  }
  "template": true,
  "compensation": {
    "min": 0,
    "max": 0,
    "currency": "string"
  },
  "jobAd": {
    "sections": {
      "companyDescription": {
        "title": "string",
        "text": "string"
      },
      "jobDescription": {
        "title": "string",
        "text": "string"
      },
      "qualifications": {
        "title": "string",
        "text": "string"
      },
      "additionalInformation": {
        "title": "string",
        "text": "string"
      },
    },
    "language": {
      "code": "string",
      "label": "string",
      "labelNative": "string"
    }
  }
}

The relevant industry, function, typeOfEmployment, experienceLevel data fields are mapped directly with the above entered basic data under industry areas, Job functional areas, employment types and job grades pages.

Job Functional Area, Job Grade details should add under the general details and set as default when it comes to the Job. Employment Type and Industry Area can be selected via the Recruitment Requisition page when creating a request.

Implementation Details

Send Job Vacancy logic is mainly written in the RcruitIntegration utility file under the RCRUIT component.

Structures

  • JobAdvertisementStructure- Main structure to load the job advertisement / vacancy information.

    ParameterData TypeDescription
    job_titleVARCHAR2(4000)-- defines job title in Recruitment Requisition
    company_idVARCHAR2(4000)-- defines company id in Recruitment Requisition
    personnel_req_noVARCHAR2(4000)-- defines personnel requisition no in Recruitment Requisition
    target_hiring_dateVARCHAR2(4000)-- defines earliest date in Recruitment Requisition
    country_dbVARCHAR2(4000)-- defines country in Recruitment Requisition
    cityVARCHAR2(4000)-- defines city in Recruitment Requisition
    industryVARCHAR2(4000)-- defines industry area in Recruitment Requisition
    functionVARCHAR2(4000)-- Retrieves default functional area per the job in job window
    type_of_employmentVARCHAR2(4000)-- defines employment type in Recruitment Requisition
    experience_levelBOOLEAN-- Retrieves default job grade per the job in job window
    templateVARCHAR2(4000)-- set to true if using a template in SmartRecruiters
    company_descriptionVARCHAR2(4000)-- defines company description in Recruitment Requisition
    job_opp_summaryVARCHAR2(4000)-- defines job description in Recruitment Requisition
    key_qualification_neededVARCHAR2(4000)-- defines qualifications in Recruitment Requisition
    additional_informationVARCHAR2(4000)-- defines additional information in Recruitment Requisition
    language_dbVARCHAR2(4000)-- defines language in Company Defaults
    languageVARCHAR2(4000)-- defines language in Company Defaults
    min_estimated_salaryNUMBER-- defines minimum estimated salary in Recruitment Requisition
    max_estimated_salaryNUMBER-- defines maximum estimated salary in Recruitment Requisition
    currency_codeVARCHAR2(4000)-- defines currency code in Recruitment Requisition

Publish Advertisement Function

PublishAdvertisement function in RcruitIntegration integration projection is used to send OR update the job vacancy details.

Function ParameterData Type
CompanyIdText
PersonnelReqNoText
ActionText

Action Parameter can be "POST" to Publish the vacancy and "SYNC" to update an existing job vacancy.

Once the Job is posted successfully, you will see the "Sync Job" button visible to post updates related to the job vacancy.

Detailing the above function

When the above function is called with a specific action the relevant request header is mapped towards the REST API. When the action is "POST" the request header is "POST", and when the action is "SYNC" the request header is "PUT".

How the data transferring happens;

Plsql_Rest_Sender_API.Call_Rest_Endpoint_Json_Sync(   rest_service_        => 'ATS_SENDER',
                                                      json_                => json_detail_,
                                                      url_params_          =>  url_params_,
                                                      http_method_         => 'POST',
                                                      sender_              => 'ATS_SENDER',
                                                      message_type_        => 'EVENT',
                                                      accepted_res_codes_  => '201,400,401,403,409,422');

'ATS_SENDER' is the message function we have defined in the Routing Rules to identify the Routing Address related to external recruitment vendor integration.

Error Handling

This is handled in both internally and externally. When it comes to error handling the required fields for the job posting is checked in internally, so the error handling is done internally. When it comes to errors when publishing or the incorrect fields mapped it is handled via retrieving the external error through IFS Application.

Retrieving Applicants - General Information

Once candidates have been hired to jobs and their onboarding status is set to 'Ready to onboard', these candidates are ready to be retrieved into IFS Cloud as Applicants.

Retrieving of candidates and creation of applicants is handled through the background scheduled task 'Get Ready to Onboard Applicants from SmartRecruiters'.

Retrieving Applicants - Implementation Details

The logic for retrieving applicants is mainly written inside the RcruitIntegration utility file under the RCRUIT component.

Get Candidates

The logic to call the SmartRecruiters candidate endpoint to get applicant data is written inside the procedure SR_Get_Hired_Applicants__.

PROCEDURE SR_Get_Hired_Applicants__(
   page_id_ IN VARCHAR2 DEFAULT NULL)

Calling the endpoint is done as below;

Plsql_Rest_Sender_API.Call_Rest_Endpoint_Json_Sync(rest_service_       => 'ATS_SENDER',
                                                   json_               => json_payload_,
                                                   url_params_         => url_params_,
                                                   http_method_        => 'GET',
                                                   query_parameters_   =>  query_params_,
                                                   sender_             => 'REST_SENDER1',
                                                   accepted_res_codes_ => '200,201,400,401');

URL Details

The above REST call is directed to https://api.smartrecruiters.com/candidates with the following query parameters.

  • onboardingStatus=READY_TO_ONBOARD
  • status=HIRED
  • limit=25
  • If not null, pageId=page_id_

This will return an array of contents containing candidates who have been hired for a job and their onboarding status set as 'Ready to onboard'.

Note: The candidate data returned is not tied to any job. Therefore, the jobs that the candidate has applied will have to be iterated through separately in order to get the jobs in which they have been hired.

Note: If a nextPageId value is found from the above GET call, a recurring call will be done at the end of the procedure, passing the value of nextPageId.

Getting applied jobs

The candidate json object has two parts with information about the applied jobs.

  1. primaryAssignment - This object contains data about the latest job the candidate has been updated in.
  2. secondaryAssignments - This array contains objects of all the other jobs the candidate has applied to.

Using the candidate's id and the above job ids, a GET call is sent to https://api.smartrecruiters.com/candidates/{candidate_id}/jobs/{job_id}/onboardingStatus to get each onboarding status. If the onboarding status is 'READY_TO_ONBOARD', an applicant is created in IFS Cloud with the candidate details.

Creating Applicants

The function to create applicants is as below;

FUNCTION SR_Add_Applicant__(
   ats_applicant_uid_ IN VARCHAR2,
   ats_job_uid_       IN VARCHAR2) RETURN VARCHAR2

The parameter ats_applicant_uid_ is the smart recruiters candidate id and ats_job_uid_ is the smart recruiters job id which the candidate was hired and onboarding status was 'Ready to onboard'.

To get a detailed object of the candidate, a GET call is sent to https://api.smartrecruiters.com/candidates/{ats_applicant_uid_}.

Candidate json object

{
    id                      string
    internal                boolean
    firstName               string
    lastName                string
    email                   string
    phoneNumber             string
    location                CandidateLocation{...}
    web                     WebProfile{...}
    createdOn               string($date-time)
    updatedOn               string($date-time)
    tags                    [...]
    averageRating           number
    education               [...]
    experience              [...]
    primaryAssignment       {...}
    secondaryAssignments    [...]
    actions                 {...}
}

Below values are used to create the applicant.

Table ColumnValue
APPLICANT_IDRecruitment_Identity_API.Get_Applicant_Id
FIRST_NAMEcandidate_obj_.firstName
LAST_NAMEcandidate_obj_.lastName
APPLICANT_TYPE'External'
SOURCE_SEQ_NOSourceSeqNo of 'ATS' from ApplicantDefinedSource
DATE_APPLIEDSYSDATE
DATE_AVAILABLESYSDATE
KEEP_ON_FILE_DURATION6
ATS_APPLICANT_UIDats_applicant_uid_
ATS_JOB_UIDats_job_uid_
TARGET_START_DATE'startsOn' from candidate's job
ATS_JOB_REF'{refNumber} - {title}' from Job

Add Communication Method

The procedure to add a communication method to an applicant is as below;

PROCEDURE SR_Add_Applicant_Comm_Method__(
   applicant_id_ IN VARCHAR2,
   comm_data_    IN VARCHAR2,
   comm_method_  IN VARCHAR2)

Parameter Details

ParameterDescription
applicant_id_Applicant ID of the IFS Cloud applicant
comm_data_CommData of ApplicantInfoCommMethod
comm_method_MethodId of ApplicantInfoCommMethod

Using the above data, a record will be created in ApplicantInfoCommMethod.

Add Address

The procedure to add the default address of the applicant is as below;

PROCEDURE SR_Add_Applicant_Address__(
   applicant_id_ IN VARCHAR2,
   address_obj_  IN JSON_OBJECT_T)

Parameter Details

ParameterDescription
applicant_id_Applicant ID of the IFS Cloud applicant
address_obj_Json object containing location details

Location json object

{
    country         string
    countryCode     string
    regionCode      string
    region          string
    city            string
    lat             number($float)
    lng             number($float)
}

Below values are used to create address records.

Table ColumnValue
VALID_FROMsysdate
VALID_TOto_date('9999/12/31', 'YYYY/MM/DD')
APPLICANT_IDapplicant_id_
ADDRESS_DEFAULT_FLAG'1'
CITYaddress_obj_.city
COUNTRYaddress_obj_.country
COUNTRY_STATEaddress_obj_.region

Add Education

Below procedure is used to add education entries of the applicants.

PROCEDURE SR_Add_Applicant_Education__(
   applicant_id_  IN VARCHAR2,
   education_arr_ IN JSON_ARRAY_T)

Parameter Details

ParameterDescription
applicant_id_Applicant ID of the IFS Cloud applicant
education_arr_Json array containing education objects

Education json object

{
    institution     string
    degree          string
    major           string
    current         boolean
    location        string
    startDate       Whenstring($when)
                    date in YYYY, YYYY-MM or YYYY-MM-dd format, ex. "2016", "2016-11", "2016-11-29"
    endDate         Whenstring($when)
                    date in YYYY, YYYY-MM or YYYY-MM-dd format, ex. "2016", "2016-11", "2016-11-29"
    description     string
}

Below values are used to create the education record.

Table ColumnValue
APPLICANT_IDapplicant_id_
APPLICANT_EDU_NUMAPPLICANT_INFO_EDUCATION_SEQ.NEXTVAL
EDUCATION_FIELD_NAMEeducation_obj_.major
EDU_INSTITUTION_NAMEeducation_obj_.institution
START_YEAReducation_obj_.startDate OR SYSDATE
END_YEAReducation_obj_.endDate OR Database_SYS.Get_Last_Calendar_Date
EDUCATION_LEVEL_NAMEeducation_obj_.degree
REMARKeducation_obj_.description

Add Work Experience

Below procedure is used to add work experience of the applicants.

PROCEDURE SR_Add_Applicant_Experience__(
   applicant_id_   IN VARCHAR2,
   experience_arr_ IN JSON_ARRAY_T)

Parameter Details

ParameterDescription
applicant_id_Applicant ID of the IFS Cloud applicant
experience_arr_Json array containing experience objects

Location json object

{
    title           string
    company         string
    current         boolean
    startDate       Whenstring($when)
                    date in YYYY, YYYY-MM or YYYY-MM-dd format, ex. "2016", "2016-11", "2016-11-29"
    endDate         Whenstring($when)
                    date in YYYY, YYYY-MM or YYYY-MM-dd format, ex. "2016", "2016-11", "2016-11-29"
    location        string
    description     string
}

Below values are used to create the experience record.

Table ColumnValue
APPLICANT_IDapplicant_id_
APP_WORK_EXPERIENCE_NOAPPLICANT_INFO_WORK_EXP_SEQ.NEXTVAL
JOB_TITLEexperience_obj_.title
COMPANYexperience_obj_.company
LOCATIONexperience_obj_.location
JOB_DESCRIPTIONexperience_obj_.description
START_DATEexperience_obj_.startDate OR SYSDATE
END_DATEexperience_obj_.endDate OR Database_SYS.Get_Last_Calendar_Date
CURRENT_EMPLOYERexperience_obj_.current

Connecting to a Requisition

Below procedure is used to connect an applicant to a requisition.

PROCEDURE Connect_To_Requisition__(
   applicant_id_ IN VARCHAR2,
   ats_job_uid_  IN VARCHAR2)

Using the ats_job_uid, the application will try to connect the applicant to a requisition. The procedure will search for the CONNECTION_ID of a recruitment requisition in PersonnelRequisition.

If found, a record will be created in JobApplicant, which connects the applicant to the requisition. This will transfer the applicant to the 'In Recruitement' state.

If a requisition is not found, the applicant will be put to the 'Reserved' state.

Update SmartRecruiters Onboarding Status

After an applicant created through the integration is employed, a PUT call is sent to https://api.smartrecruiters.com/candidates/{ats_applicant_uid}/jobs/ats_job_uid}/onboardingStatus with the following body;

{
    "onboardingStatus": "ONBOARDING_SUCCESSFUL"
}

Plsql call:

Plsql_Rest_Sender_API.Call_Rest_Endpoint_Json_Sync(rest_service_        => 'ATS_SENDER',
                                                   json_                => json_payload_,
                                                   url_params_          => url_params_,
                                                   http_method_         => 'PUT',
                                                   sender_              => 'REST_SENDER1',
                                                   accepted_res_codes_  => '200,201,400,401,404,422');

This will update the candidate's onboarding status for the job as 'Onboarding successful' when they are employed, which will prevent them from being fetched again when retrieving.

Database Task Schedule

In order for candidates to be retrieved from SmartRecruiters and new applicants to be created, a database task has been added in the RCRUIT component.

Task NameMethodDescription
Get Ready To Onboard applicants from SmartRecruitersRcruit_Integration_API.SR_Get_Hired_Applicants__This will only pull candidates which have been hired and the onboarding status set to 'Ready to Onboard' in SmartRecruiters. Applicants will be created using the candidate's details.