diff --git a/generate_schema.py b/generate_schema.py index 8547e03..418bfea 100644 --- a/generate_schema.py +++ b/generate_schema.py @@ -2,7 +2,7 @@ import os from genson import SchemaBuilder from tap_adp.tap import TapADP -from tap_adp.streams import WorkersStream, PayrollInstructionStream, PayDataInputStream, USTaxProfileStream +from tap_adp.streams import JobRequisitionStream, JobApplicationStream from dotenv import load_dotenv from decimal import Decimal @@ -67,22 +67,13 @@ def main(): tap = TapADP(config=config) # Configure this part as-needed for the streams you want to generate schemas for. - parent = WorkersStream(tap=tap) children = { - "payroll_instruction": PayrollInstructionStream(tap=tap), - "pay_data_input": PayDataInputStream(tap=tap), - "us_tax_profile": USTaxProfileStream(tap=tap), + "job_requisition": JobRequisitionStream(tap=tap), + "job_application": JobApplicationStream(tap=tap), } - - gen = parent.get_records(context=None) - first = next(gen, None) - if not first: - raise RuntimeError("no parent entries found") - context = parent.get_child_context(record=first, context=None) - for child_name, child_stream in children.items(): - generate_schema(child_stream, context=context, output_file=f'tap_adp/schemas/{child_name}.json') + generate_schema(child_stream, context=None, output_file=f'tap_adp/schemas/{child_name}.json') if __name__ == '__main__': main() diff --git a/tap_adp/schemas/job_application.json b/tap_adp/schemas/job_application.json new file mode 100644 index 0000000..f1998a0 --- /dev/null +++ b/tap_adp/schemas/job_application.json @@ -0,0 +1,794 @@ +{ + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "jobRequisitionReference": { + "type": [ + "object", + "null" + ], + "properties": { + "requisitionID": { + "type": [ + "string", + "null" + ] + }, + "requisitionTitle": { + "type": [ + "string", + "null" + ] + }, + "clientRequisitionID": { + "type": [ + "string", + "null" + ] + }, + "internalIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "externalIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "hiringManager": { + "type": [ + "object", + "null" + ], + "properties": { + "associateOID": { + "type": [ + "string", + "null" + ] + }, + "workerID": { + "type": [ + "object", + "null" + ], + "properties": { + "idValue": { + "type": [ + "string", + "null" + ] + } + } + }, + "personName": { + "type": [ + "object", + "null" + ], + "properties": { + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "givenName": { + "type": [ + "string", + "null" + ] + }, + "familyName1": { + "type": [ + "string", + "null" + ] + }, + "formattedName": { + "type": [ + "string", + "null" + ] + } + } + } + } + }, + "recruiter": { + "type": [ + "object", + "null" + ], + "properties": { + "personName": { + "type": [ + "object", + "null" + ], + "properties": { + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "givenName": { + "type": [ + "string", + "null" + ] + }, + "familyName1": { + "type": [ + "string", + "null" + ] + }, + "formattedName": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + } + }, + "applicationStatusCode": { + "type": [ + "object", + "null" + ], + "properties": { + "effectiveDate": { + "type": [ + "string", + "null" + ] + }, + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "applicationSource": { + "type": [ + "object", + "null" + ], + "properties": { + "postingChannelID": { + "type": [ + "string", + "null" + ] + }, + "postingChannelNameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "submittedBy": { + "type": [ + "object", + "null" + ], + "properties": { + "associateOID": { + "type": [ + "string", + "null" + ] + }, + "personName": { + "type": [ + "object", + "null" + ], + "properties": { + "givenName": { + "type": [ + "string", + "null" + ] + }, + "familyName1": { + "type": [ + "string", + "null" + ] + } + } + } + } + }, + "submittedDate": { + "type": [ + "string", + "null" + ] + } + } + }, + "applicant": { + "type": [ + "object", + "null" + ], + "properties": { + "personOID": { + "type": [ + "string", + "null" + ] + }, + "associateOID": { + "type": [ + "string", + "null" + ] + }, + "internalApplicantIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "person": { + "type": [ + "object", + "null" + ], + "properties": { + "personName": { + "type": [ + "object", + "null" + ], + "properties": { + "givenName": { + "type": [ + "string", + "null" + ] + }, + "familyName1": { + "type": [ + "string", + "null" + ] + }, + "formattedName": { + "type": [ + "string", + "null" + ] + }, + "middleName": { + "type": [ + "string", + "null" + ] + } + } + }, + "communication": { + "type": [ + "object", + "null" + ], + "properties": { + "mobiles": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + } + } + }, + "countryDialing": { + "type": [ + "string", + "null" + ] + }, + "areaDialing": { + "type": [ + "string", + "null" + ] + }, + "dialNumber": { + "type": [ + "string", + "null" + ] + }, + "formattedNumber": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "emails": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "emailUri": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "landlines": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + } + } + }, + "countryDialing": { + "type": [ + "string", + "null" + ] + }, + "areaDialing": { + "type": [ + "string", + "null" + ] + }, + "dialNumber": { + "type": [ + "string", + "null" + ] + }, + "formattedNumber": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + }, + "address": { + "type": [ + "object", + "null" + ], + "properties": { + "lineOne": { + "type": [ + "string", + "null" + ] + }, + "lineTwo": { + "type": [ + "string", + "null" + ] + }, + "cityName": { + "type": [ + "string", + "null" + ] + }, + "countrySubdivisionLevel1": { + "type": [ + "object", + "null" + ], + "properties": { + "subdivisionType": { + "type": [ + "string", + "null" + ] + }, + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "countryCode": { + "type": [ + "string", + "null" + ] + }, + "postalCode": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + } + }, + "comments": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "entryDateTime": { + "type": [ + "string", + "null" + ] + }, + "author": { + "type": [ + "object", + "null" + ], + "properties": { + "formattedName": { + "type": [ + "string", + "null" + ] + } + } + }, + "textValue": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "appliedLocations": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + }, + "longName": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + }, + "requestedPayRate": { + "type": [ + "object", + "null" + ], + "properties": { + "annualRateAmount": { + "type": [ + "object", + "null" + ], + "properties": { + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "amountValue": { + "type": [ + "number", + "null" + ] + }, + "currencyCode": { + "type": [ + "string", + "null" + ] + } + } + }, + "hourlyRateAmount": { + "type": [ + "object", + "null" + ], + "properties": { + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "amountValue": { + "type": [ + "number", + "null" + ] + }, + "currencyCode": { + "type": [ + "string", + "null" + ] + } + } + } + } + }, + "attachments": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "attachmentLink": { + "type": [ + "object", + "null" + ], + "properties": { + "payLoadArguments": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "argumentPath": { + "type": [ + "string", + "null" + ] + }, + "argumentValue": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + }, + "resumeIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "textValue": { + "type": [ + "string", + "null" + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/tap_adp/schemas/job_requisition.json b/tap_adp/schemas/job_requisition.json new file mode 100644 index 0000000..91c28ed --- /dev/null +++ b/tap_adp/schemas/job_requisition.json @@ -0,0 +1,822 @@ +{ + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "postingInstructions": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "longName": { + "type": [ + "string", + "null" + ] + } + } + }, + "postingChannel": { + "type": [ + "object", + "null" + ], + "properties": { + "channelID": { + "type": [ + "string", + "null" + ] + }, + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + }, + "longName": { + "type": [ + "string", + "null" + ] + } + } + }, + "internetAddress": { + "type": [ + "object", + "null" + ], + "properties": { + "uri": { + "type": [ + "string", + "null" + ] + } + } + }, + "externalIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "defaultIndicator": { + "type": [ + "boolean", + "null" + ] + } + } + }, + "internalIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "resumeRequiredIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "postDate": { + "type": [ + "string", + "null" + ] + }, + "expireDate": { + "type": [ + "string", + "null" + ] + }, + "applicationMethods": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "contact": { + "type": [ + "object", + "null" + ], + "properties": { + "personName": { + "type": [ + "object", + "null" + ], + "properties": { + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "formattedName": { + "type": [ + "string", + "null" + ] + } + } + }, + "communication": { + "type": [ + "object", + "null" + ], + "properties": { + "emails": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "emailUri": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + } + } + } + } + } + }, + "validityAttestationIndicator": { + "type": [ + "boolean", + "null" + ] + } + } + } + }, + "links": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "href": { + "type": [ + "string", + "null" + ] + }, + "rel": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + } + } + } + }, + "supportedLocaleCodes": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "string", + "null" + ] + } + }, + "clientRequisitionID": { + "type": [ + "string", + "null" + ] + }, + "requisitionStatusCode": { + "type": [ + "object", + "null" + ], + "properties": { + "effectiveDate": { + "type": [ + "string", + "null" + ] + }, + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "job": { + "type": [ + "object", + "null" + ], + "properties": { + "jobCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "longName": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "jobTitle": { + "type": [ + "string", + "null" + ] + }, + "occupationalClassifications": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "classificationCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + }, + "longName": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + } + } + }, + "requisitionLocations": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + }, + "longName": { + "type": [ + "string", + "null" + ] + } + } + }, + "address": { + "type": [ + "object", + "null" + ], + "properties": { + "lineOne": { + "type": [ + "string", + "null" + ] + }, + "lineTwo": { + "type": [ + "string", + "null" + ] + }, + "cityName": { + "type": [ + "string", + "null" + ] + }, + "countrySubdivisionLevel1": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + } + } + }, + "countryCode": { + "type": [ + "string", + "null" + ] + }, + "postalCode": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + }, + "compensationVisibleIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "locationVisibleIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "organizationalUnits": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "object", + "null" + ], + "properties": { + "itemID": { + "type": [ + "string", + "null" + ] + }, + "nameCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "typeCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + }, + "lieDetectorAcknowledgementIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "companyName": { + "type": [ + "string", + "null" + ] + }, + "payGradeRange": { + "type": [ + "object", + "null" + ], + "properties": { + "minimumRate": { + "type": [ + "object", + "null" + ], + "properties": { + "amountValue": { + "type": [ + "number", + "null" + ] + }, + "currencyCode": { + "type": [ + "string", + "null" + ] + }, + "unitCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + } + } + }, + "maximumRate": { + "type": [ + "object", + "null" + ], + "properties": { + "amountValue": { + "type": [ + "number", + "null" + ] + }, + "currencyCode": { + "type": [ + "string", + "null" + ] + }, + "unitCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + } + }, + "workerTypeCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "shortName": { + "type": [ + "string", + "null" + ] + } + } + }, + "projectedStartDate": { + "type": [ + "string", + "null" + ] + }, + "openingsQuantity": { + "type": [ + "integer", + "null" + ] + }, + "openingsFilledQuantity": { + "type": [ + "integer", + "null" + ] + }, + "visibleToJobSeekerIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "evergreenIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "internalIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "externalIndicator": { + "type": [ + "boolean", + "null" + ] + }, + "workedInCountry": { + "type": [ + "string", + "null" + ] + }, + "openingsNewPositionQuantity": { + "type": [ + "integer", + "null" + ] + }, + "requisitionReasonCode": { + "type": [ + "object", + "null" + ], + "properties": { + "codeValue": { + "type": [ + "string", + "null" + ] + }, + "longName": { + "type": [ + "string", + "null" + ] + } + } + }, + "hiringManager": { + "type": [ + "object", + "null" + ], + "properties": { + "associateOID": { + "type": [ + "string", + "null" + ] + }, + "workerID": { + "type": [ + "object", + "null" + ], + "properties": { + "idValue": { + "type": [ + "string", + "null" + ] + } + } + }, + "personName": { + "type": [ + "object", + "null" + ], + "properties": { + "givenName": { + "type": [ + "string", + "null" + ] + }, + "familyName1": { + "type": [ + "string", + "null" + ] + }, + "formattedName": { + "type": [ + "string", + "null" + ] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/tap_adp/streams.py b/tap_adp/streams.py index 29b96b3..92fab3d 100644 --- a/tap_adp/streams.py +++ b/tap_adp/streams.py @@ -124,3 +124,25 @@ def validate_response(self, response): self.logger.warning(msg) return super().validate_response(response) + +class JobRequisitionStream(PaginatedADPStream): + """ + Docs: https://developers.adp.com/build/api-explorer/hcm-offrg-wfn/hcm-offrg-wfn-staffing-job-requisitions-v1-job-requisitions + """ + + name = "job_requisition" + path = "/staffing/v1/job-requisitions" + primary_keys = ["itemID"] + records_jsonpath = "$.jobRequisitions[*]" + schema_filepath = SCHEMAS_DIR / "job_requisition.json" + +class JobApplicationStream(PaginatedADPStream): + """ + Docs: https://developers.adp.com/build/api-explorer/hcm-offrg-wfn/hcm-offrg-wfn-staffing-job-applications-v2-job-applications + """ + + name = "job_application" + path = "/staffing/v2/job-applications" + primary_keys = ["itemID"] + records_jsonpath = "$.jobApplications[*]" + schema_filepath = SCHEMAS_DIR / "job_application.json" diff --git a/tap_adp/tap.py b/tap_adp/tap.py index 5a9b59d..e5e71b9 100644 --- a/tap_adp/tap.py +++ b/tap_adp/tap.py @@ -62,6 +62,8 @@ def discover_streams(self) -> list[streams.ADPStream]: streams.PayDataInputStream(self), streams.PayrollInstructionStream(self), streams.USTaxProfileStream(self), + streams.JobRequisitionStream(self), + streams.JobApplicationStream(self), ]