From 7c831d6eb02a0b26d7ab7c6a141bd37ddb1c4aea Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Fri, 16 Dec 2022 20:29:17 -0800 Subject: [PATCH 01/12] Task/v3 (#14) support hrpws v3 person resource --- uw_hrp/models.py | 276 ++-- uw_hrp/person.py | 94 ++ ...hanged_since_date_2022-12-12_page_size_200 | 777 ++++++++++ .../hrpws/file/hrp/v3/person/000000005.json | 1251 ++++++++++++++++ .../9136CCB8F66711D5BE060004AC494FFE.json | 1298 +++++++++++++++++ .../hrpws/file/hrp/v3/person/faculty.json | 1251 ++++++++++++++++ .../v3/person/faculty.json_future_worker_true | 1251 ++++++++++++++++ uw_hrp/tests/test_models.py | 657 +++++---- uw_hrp/tests/test_person.py | 89 ++ uw_hrp/tests/test_worker.py | 121 -- uw_hrp/worker.py | 101 -- 11 files changed, 6488 insertions(+), 678 deletions(-) create mode 100644 uw_hrp/person.py create mode 100644 uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 create mode 100644 uw_hrp/resources/hrpws/file/hrp/v3/person/000000005.json create mode 100644 uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json create mode 100644 uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json create mode 100644 uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json_future_worker_true create mode 100644 uw_hrp/tests/test_person.py delete mode 100644 uw_hrp/tests/test_worker.py delete mode 100644 uw_hrp/worker.py diff --git a/uw_hrp/models.py b/uw_hrp/models.py index 7989418..6f8de1f 100644 --- a/uw_hrp/models.py +++ b/uw_hrp/models.py @@ -12,10 +12,6 @@ def get_now(): return datetime.now(timezone.utc) -def is_future_end_date(end_date): - return end_date is None or end_date > get_now() - - def date_to_str(d_obj): if d_obj is not None: return str(d_obj) @@ -28,29 +24,47 @@ def parse_date(date_str): return None +def get_emp_program_job_class(job_classification_summaries): + # process JobClassificationSummaries, extract employment program job code + if job_classification_summaries and len(job_classification_summaries) > 0: + for summary in job_classification_summaries: + jcg = summary.get("JobClassificationGroup") + if (jcg and jcg.get("Name") == "Employment Program" and + summary.get("JobClassification")): + emp_program_name = summary["JobClassification"].get("Name") + if " - " in emp_program_name: + name_data = emp_program_name.split(" - ", 1) + emp_program_name = name_data[1] + + if " (" in emp_program_name: + return emp_program_name.split(" (", 1)[0] + return emp_program_name.strip() + + +def get_org_code_name(organization_name): + if organization_name and ": " in organization_name: + (org_code, org_name) = organization_name.split(": ", 1) + if " (" in org_name: + org_name = org_name.split(" (", 1)[0] + return org_code.strip(), org_name.strip() + + class EmploymentStatus(models.Model): status = models.CharField(max_length=32) - status_code = models.CharField(max_length=8) is_active = models.BooleanField(default=False) is_retired = models.BooleanField(default=False) is_terminated = models.BooleanField(default=False) hire_date = models.DateTimeField(null=True, default=None) - end_emp_date = models.DateTimeField(null=True, default=None) retirement_date = models.DateTimeField(null=True, default=None) termination_date = models.DateTimeField(null=True, default=None) - def is_active_employment(self): - return self.is_active and is_future_end_date(self.end_emp_date) - def to_json(self): - return {'end_emp_date': date_to_str(self.end_emp_date), + return {'status': self.status, 'hire_date': date_to_str(self.hire_date), 'is_active': self.is_active, 'is_retired': self.is_retired, 'is_terminated': self.is_terminated, 'retirement_date': date_to_str(self.retirement_date), - 'status': self.status, - 'status_code': self.status_code, 'termination_date': date_to_str(self.termination_date)} def __init__(self, *args, **kwargs): @@ -59,11 +73,9 @@ def __init__(self, *args, **kwargs): return super(EmploymentStatus, self).__init__(*args, **kwargs) self.status = data.get("EmployeeStatus") - self.status_code = data.get("EmployeeStatusCode") - self.end_emp_date = parse_date(data.get("EndEmploymentDate")) - self.is_active = data.get("IsActive") - self.is_retired = data.get("IsRetired") - self.is_terminated = data.get("IsTerminated") + self.is_active = data.get("Active") + self.is_retired = data.get("Retired") + self.is_terminated = data.get("Terminated") self.hire_date = parse_date(data.get("HireDate")) self.retirement_date = parse_date(data.get("RetirementDate")) self.termination_date = parse_date(data.get("TerminationDate")) @@ -77,82 +89,76 @@ class JobProfile(models.Model): description = models.CharField(max_length=96, null=True, default=None) def to_json(self): - return {'job_code': self.job_code, - 'description': self.description} + return { + 'job_code': self.job_code, + 'description': self.description + } def __init__(self, *args, **kwargs): data = kwargs.get("data") if data is None: return super(JobProfile, self).__init__(*args, **kwargs) - self.job_code = data.get("JobProfileID") - self.description = data.get("JobProfileDescription") + self.description = data.get("Name") + ids = data.get("IDs") + if ids is not None and len(ids): + for id_data in ids: + if id_data.get("Type") == "Job_Profile_ID": + self.job_code = id_data.get("Value") def __str__(self): return json.dumps(self.to_json()) class SupervisoryOrganization(models.Model): - budget_code = models.CharField(max_length=16, null=True, default=None) - org_code = models.CharField(max_length=16, null=True, default=None) - org_name = models.CharField(max_length=128, null=True, default=None) + budget_code = models.CharField(max_length=16, default="") + org_code = models.CharField(max_length=16, default="") + org_name = models.CharField(max_length=128, default="") def to_json(self): - return {'budget_code': self.budget_code, + return { + 'budget_code': self.budget_code, 'org_code': self.org_code, - 'org_name': self.org_name} + 'org_name': self.org_name + } def __init__(self, *args, **kwargs): data = kwargs.get("data") if data is None: return super(SupervisoryOrganization, self).__init__(*args, **kwargs) - - if data.get("CostCenter") is not None: - self.budget_code = data["CostCenter"].get("OrganizationCode") - self.org_code = data.get("Code").strip() - self.org_name = data.get("Name").strip() + self.org_code, self.org_name = get_org_code_name(data.get("Name")) def __str__(self): return json.dumps(self.to_json()) -class WorkerPosition(models.Model): +class EmploymentDetails(models.Model): start_date = models.DateTimeField(null=True, default=None) end_date = models.DateTimeField(null=True, default=None) - ecs_job_cla_code_desc = models.CharField(max_length=96, - null=True, default=None) - is_future_date = models.BooleanField(default=False) + job_class = models.CharField(max_length=128, null=True, default=None) + job_title = models.CharField(max_length=128, null=True, default=None) is_primary = models.BooleanField(default=False) location = models.CharField(max_length=96, null=True, default=None) - payroll_unit_code = models.CharField(max_length=8, - null=True, default=None) + org_unit_code = models.CharField(max_length=10, default="") pos_type = models.CharField(max_length=64, null=True, default=None) - pos_time_type_id = models.CharField(max_length=64, - null=True, default=None) - fte_percent = models.FloatField(null=True, blank=True, default=None) supervisor_eid = models.CharField(max_length=16, null=True, default=None) - title = models.CharField(max_length=128, null=True, default=None) - - def is_active_position(self): - return is_future_end_date(self.end_date) def to_json(self): - data = {'start_date': date_to_str(self.start_date), + data = { 'end_date': date_to_str(self.end_date), - 'ecs_job_cla_code_desc': self.ecs_job_cla_code_desc, - 'fte_percent': self.fte_percent, - 'is_future_date': self.is_future_date, 'is_primary': self.is_primary, + 'job_title': self.title, + 'job_class': self.job_class, 'location': self.location, - 'payroll_unit_code': self.payroll_unit_code, + 'org_unit_code': self.org_unit_code, 'pos_type': self.pos_type, - 'pos_time_type_id': self.pos_time_type_id, - 'title': self.title, + 'start_date': date_to_str(self.start_date), 'supervisor_eid': self.supervisor_eid, 'job_profile': None, - 'supervisory_org': None} + 'supervisory_org': None + } if self.job_profile is not None: data['job_profile'] = self.job_profile.to_json() if self.supervisory_org is not None: @@ -167,48 +173,52 @@ def __init__(self, *args, **kwargs): self.job_profile = None self.supervisory_org = None if data is None: - return super(WorkerPosition, self).__init__(*args, **kwargs) + return super(EmploymentDetails, self).__init__(*args, **kwargs) - self.job_profile = JobProfile( - data=data.get("JobProfileSummary")) + self.title = data.get("BusinessTitle") + self.job_profile = JobProfile(data=data.get("JobProfile")) - self.supervisory_org = SupervisoryOrganization( - data=data.get("SupervisoryOrganization")) + self.job_class = get_emp_program_job_class( + data.get("JobClassificationSummaries")) - self.ecs_job_cla_code_desc = \ - data.get("EcsJobClassificationCodeDescription") - self.payroll_unit_code = data.get("PayrollUnitCode") - self.is_future_date = data.get("IsFutureDate") - self.is_primary = data.get("IsPrimaryPosition") if data.get("Location") is not None: - self.location = data["Location"]["ID"] - self.title = data.get("PositionBusinessTitle") - self.pos_type = data.get("PositionType") - self.pos_time_type_id = data.get("PositionTimeTypeID") - self.fte_percent = float(data.get("PositionFTEPercent")) - self.start_date = parse_date(data.get("PositionStartDate")) - self.end_date = parse_date(data.get("PositionEndDate")) - if data.get("PositionSupervisor") is not None: - self.supervisor_eid = data["PositionSupervisor"]["EmployeeID"] - - -class Worker(models.Model): - netid = models.CharField(max_length=32) - regid = models.CharField(max_length=32) - employee_id = models.CharField(max_length=16) - primary_manager_id = models.CharField(max_length=16, - null=True, default=None) + self.location = data["Location"].get("Name") - def to_json(self): - data = {"netid": self.netid, - 'regid': self.regid, - 'employee_id': self.employee_id, - 'employee_status': None, - 'primary_manager_id': self.primary_manager_id} + managers = data.get("Managers") + if managers is not None and len(managers) > 0: + ids = managers[0].get("IDs") + for id_data in ids: + if id_data.get("Type") == "Employee_ID": + self.supervisor_eid = id_data.get("Value") - if self.employee_status is not None: - data['employee_status'] = self.employee_status.to_json() + if data.get("PositionWorkerType") is not None: + self.pos_type = data["PositionWorkerType"].get("Name") + self.is_primary = data.get("PrimaryPosition") + self.end_date = parse_date(data.get("PositionVacateDate")) + self.start_date = parse_date(data.get("StartDate")) + self.supervisory_org = SupervisoryOrganization( + data=data.get("SupervisoryOrganization")) + + +class WorkerDetails(models.Model): + worker_wid = models.CharField(max_length=32) + is_active = models.BooleanField(default=False) + primary_job_title = models.CharField( + max_length=128, null=True, default=None) + primary_manager_id = models.CharField( + max_length=16, null=True, default=None) + + def to_json(self): + data = { + 'worker_wid': self.worker_wid, + 'employee_status': ( + self.employee_status.to_json() if self.employee_status + else None), + 'primary_job_title': self.primary_job_title, + 'primary_manager_id': self.primary_manager_id, + 'active_positions': [] + } positions = [] if self.primary_position is not None: positions.append(self.primary_position.to_json()) @@ -227,63 +237,79 @@ def __init__(self, *args, **kwargs): self.other_active_positions = [] # include the future position if data is None: - return super(Worker, self).__init__(*args, **kwargs) + return super(WorkerDetails, self).__init__(*args, **kwargs) + + self.worker_wid = data.get("WID") - self.netid = data.get("NetID") - self.regid = data.get("RegID") - self.employee_id = data.get("EmployeeID") self.employee_status = EmploymentStatus( - data=data.get("WorkerEmploymentStatus")) + data=data.get("EmploymentStatus")) - if self.employee_status.is_active_employment(): + if not (self.employee_status and self.employee_status.is_active): + return - positions = data.get("WorkerPositions") - if positions is not None and len(positions) > 0: - for position in positions: - position = WorkerPosition(data=position) - if position.is_active_position(): - if position.is_primary: - self.primary_manager_id = position.supervisor_eid - self.primary_position = position - else: - self.other_active_positions.append(position) + active_positions = data.get("EmploymentDetails") + if active_positions is not None and len(active_positions) > 0: + for emp_detail in active_positions: + position = EmploymentDetails(data=emp_detail) + if position and position.is_primary: + self.primary_job_title = position.job_title + self.primary_manager_id = position.supervisor_eid + self.primary_position = position + else: + self.other_active_positions.append(position) -class WorkerRef(models.Model): +class Person(models.Model): netid = models.CharField(max_length=32) regid = models.CharField(max_length=32) employee_id = models.CharField(max_length=16) - employee_status = models.CharField(max_length=32) - is_active = models.BooleanField(default=False) - is_current_faculty = models.BooleanField(default=False) - workday_person_type = models.CharField(max_length=64) - href = models.CharField(max_length=255) - - def is_terminated(self): - return self.employee_status == "Terminated" + student_id = models.CharField( + max_length=16, null=True, default=None) + is_active = models.BooleanField(default=False) # has active position + primary_manager_id = models.CharField( + max_length=16, null=True, default=None) def to_json(self): - return {"netid": self.netid, + data = { + "netid": self.netid, 'regid': self.regid, 'employee_id': self.employee_id, - 'employee_status': self.employee_status, + 'student_id': self.student_id, 'is_active': self.is_active, - 'is_current_faculty': self.is_current_faculty, - 'workday_person_type': self.workday_person_type, - 'href': self.href} + 'primary_manager_id': self.primary_manager_id + } + workers = [] + for worker_detail in self.worker_details: + workers.append(worker_detail.to_json()) + data['worker_details'] = workers + return data def __str__(self): return json.dumps(self.to_json()) def __init__(self, *args, **kwargs): data = kwargs.get("data") + self.worker_details = [] if data is None: - return super(WorkerRef, self).__init__(*args, **kwargs) - self.netid = data.get("NetID") - self.regid = data.get("RegID") + return super(Person, self).__init__(*args, **kwargs) + self.employee_id = data.get("EmployeeID") - self.employee_status = data.get("EmployeeStatus") - self.is_active = data.get("IsActive") - self.is_current_faculty = data.get("IsCurrentFaculty") - self.workday_person_type = data.get("WorkdayPersonType") - self.href = data.get("Href") + self.regid = data.get("RegID") + + for id in data.get("IDs"): + if id.get("Type") == "NetID": + self.netid = id.get("Value") + if id.get("Type") == "StudentID": + self.student_id = id.get("Value") + + for wk_detail in data.get("WorkerDetails"): + if wk_detail.get("ActiveAppointment") is False: + continue + + worker_obj = WorkerDetails(data=wk_detail) + if (worker_obj and worker_obj.employee_status and + worker_obj.employee_status.is_active): + self.is_active = True + self.worker_details.append(worker_obj) + if worker_obj.primary_manager_id is not None: + self.primary_manager_id = worker_obj.primary_manager_id diff --git a/uw_hrp/person.py b/uw_hrp/person.py new file mode 100644 index 0000000..515485e --- /dev/null +++ b/uw_hrp/person.py @@ -0,0 +1,94 @@ +# Copyright 2022 UW-IT, University of Washington +# SPDX-License-Identifier: Apache-2.0 + +""" +This is the interface for interacting with the HRP Web Service. +""" + +from datetime import datetime +import logging +import json +import re +from urllib.parse import urlencode +from restclients_core.exceptions import ( + InvalidRegID, InvalidNetID, InvalidEmployeeID) +from uw_hrp import get_resource +from uw_hrp.models import Person + + +logger = logging.getLogger(__name__) +re_netid = re.compile(r'^[a-z][a-z0-9\-\_\.]{,127}$', re.I) +re_regid = re.compile(r'^[A-F0-9]{32}$', re.I) +re_employee_id = re.compile(r'^\d{9}$') +URL_PREFIX = "/hrp/v3/person" +SUFFIX = "future_worker=true" + + +def get_person_by_employee_id(employee_id, include_future=False): + if not valid_employee_id(employee_id): + raise InvalidEmployeeID(employee_id) + return _get_person(employee_id, include_future) + + +def get_person_by_netid(netid, include_future=False): + if not valid_uwnetid(netid): + raise InvalidNetID(netid) + return _get_person(netid, include_future) + + +def get_person_by_regid(regid, include_future=False): + if not valid_uwregid(regid): + raise InvalidRegID(regid) + return _get_person(regid, include_future) + + +def _get_person(id, include_future): + """ + Return a restclients.models.hrp.WorkerDetails object + """ + url = "{0}/{1}.json".format(URL_PREFIX, id) + if include_future: + url = "{0}?{1}".format(url, SUFFIX) + return Person(data=json.loads(get_resource(url))) + + +def person_search(**kwargs): + """ + Returns a list of Person objects + Parameters can be: + active_appointment: true|false + changed_since_date: string + cost_center: string + current_faculty: true|false + future_worker: string + location: string + supervisory_organization: string + worker_wid: string + """ + url = "{0}.json?{1}&page_size=200".format(URL_PREFIX, urlencode(kwargs)) + persons = [] + while True: + data = json.loads(get_resource(url)) + if "Persons" in data: + for person_record in data.get("Persons"): + persons.append(Person(data=person_record)) + if "Next" in data and len(data["Next"].get("Href")) > 0: + url = data["Next"]["Href"] + else: + break + return persons + + +def valid_uwnetid(netid): + return (netid is not None and + re_netid.match(str(netid)) is not None) + + +def valid_uwregid(regid): + return (regid is not None and + re_regid.match(str(regid)) is not None) + + +def valid_employee_id(employee_id): + return (employee_id is not None and + re_employee_id.match(str(employee_id)) is not None) diff --git a/uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 b/uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 new file mode 100644 index 0000000..3f632d0 --- /dev/null +++ b/uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 @@ -0,0 +1,777 @@ +{ + "PageStart": "1", + "TotalCount": 154909, + "Current": { + "Href": "/hrp/v3/person.json?name=&page_start=1&page_size=1&worker_wid=&last_name=&first_name=&legal_last_name=&legal_first_name=&preferred_last_name=&preferred_first_name=&position=&retired=&terminated=¤t_faculty=&active_appointment=&supervisory_organization=&cost_center=&custom_organization_type=&custom_organization=&location=&future_worker=", + "ResourceName": null, + "PageStart": "1", + "PageSize": "1", + "WorkerWID": null, + "LastName": null, + "FirstName": null, + "LegalLastName": null, + "LegalFirstName": null, + "PreferredLastName": null, + "PreferredFirstName": null, + "Position": null, + "Retired": null, + "Terminated": null, + "CurrentFaculty": null, + "ActiveAppointment": null, + "SupervisoryOrganization": null, + "CostCenter": null, + "CustomOrganizationType": null, + "CustomOrganization": null, + "Location": null, + "FutureWorker": null + }, + "Next": { + "Href": "/hrp/v3/person.json?name=&page_start=2&page_size=1&worker_wid=&last_name=&first_name=&legal_last_name=&legal_first_name=&preferred_last_name=&preferred_first_name=&position=&retired=&terminated=¤t_faculty=&active_appointment=&supervisory_organization=&cost_center=&custom_organization_type=&custom_organization=&location=&future_worker=", + "ResourceName": null, + "PageStart": "2", + "PageSize": "1", + "WorkerWID": null, + "LastName": null, + "FirstName": null, + "LegalLastName": null, + "LegalFirstName": null, + "PreferredLastName": null, + "PreferredFirstName": null, + "Position": null, + "Retired": null, + "Terminated": null, + "CurrentFaculty": null, + "ActiveAppointment": null, + "SupervisoryOrganization": null, + "CostCenter": null, + "CustomOrganizationType": null, + "CustomOrganization": null, + "Location": null, + "FutureWorker": null + }, + "Previous": null, + "Persons": [ + { + "Name": "Contingent Worker", + "EmployeeID": "100000001", + "RegID": "00000000000000000000000000000001", + "IDs": [ + { + "Type": "RegID", + "Value": "00000000000000000000000000000001" + }, + { + "Type": "EmployeeID", + "Value": "100000001" + }, + { + "Type": "NetID", + "Value": "abcde" + }, + { + "Type": "StudentID", + "Value": "2131206" + }, + { + "Type": "PriorEmployeeID", + "Value": "T000072061" + } + ], + "Href": "/hrp/v3/person/00000000000000000000000000000001.json", + "RepositoryTimeStamp": "2022-11-29T10:47:11.676-08:00", + "FirstName": "Contingent", + "LastName": "Worker", + "PreferredName": null, + "WorkerDetails": [ + { + "Name": "Worker, Contingent [C] (Contract Ended)", + "WID": "6d879e625f930113010b92ad8a3d0000", + "IDs": [ + { + "Type": "WID", + "Value": "6d879e625f930113010b92ad8a3d0000" + }, + { + "Type": "Contingent_Worker_ID", + "Value": "100000001" + } + ], + "WorkerType": "Contingent Worker", + "HuskyCardOverride": null, + "EmploymentStatus": { + "HireDate": "2022-06-13T00:00:00-07:00", + "OriginalHireDate": "2022-06-13T00:00:00-07:00", + "ExpectedFixedTermEndDate": null, + "FirstDayOfWork": "2022-06-13T00:00:00-07:00", + "ActiveStatusDate": "2022-07-16T00:00:00-07:00", + "Active": false, + "EmployeeStatus": "Terminated", + "Terminated": true, + "TerminationDate": "2022-07-15T00:00:00-07:00", + "TerminationInvoluntary": null, + "TerminationReason": null, + "Retired": false, + "RetirementDate": null, + "RetirementApplicationDate": null, + "DisplayLeave": false, + "LeaveStatusDetails": [] + }, + "EmploymentDetails": [ + { + "Position": { + "Name": "PN-0226401 Peer Educator - Worker, Contingent [C]", + "WID": "6d879e625f930113010b93e1aeb20002", + "IDs": [ + { + "Type": "WID", + "Value": "6d879e625f930113010b93e1aeb20002" + }, + { + "Type": "Position_ID", + "Value": "PN-0226401" + } + ], + "Href": "/hrp/v3/position/6d879e625f930113010b93e1aeb20002.json" + }, + "PositionRestriction": null, + "PrimaryPosition": true, + "BusinessTitle": "FYP FIG Leader", + "PositionTitle": "Peer Educator", + "EffectiveDate": "2022-06-13T00:00:00-07:00", + "StartDate": "2022-06-13T00:00:00-07:00", + "PositionVacateDate": "2022-07-15T00:00:00-07:00", + "ExpectedFixedTermEndDate": null, + "PositionWorkerType": { + "Name": "Non-Academic Affiliate (General)", + "WID": "d957207a306801e5508c3ddf6a5c8e15", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e5508c3ddf6a5c8e15" + }, + { + "Type": "Contingent_Worker_Type_ID", + "Value": "Non-Academic_Affiliate_General" + } + ] + }, + "FTEPercent": 0.0, + "PayRateType": null, + "WorkShift": { + "Name": "First Shift (United States of America)", + "WID": "d957207a306801ac611a09fe6e5c7432", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801ac611a09fe6e5c7432" + }, + { + "Type": "Work_Shift_ID", + "Value": "First Shift" + } + ] + }, + "TotalPayAnnualizedAmount": 0.0, + "TimeType": { + "Name": "Part time", + "WID": "afa35b88537f015bd4e4faafb6574800", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f015bd4e4faafb6574800" + }, + { + "Type": "Position_Time_Type_ID", + "Value": "Part_time" + } + ] + }, + "CompensationStep": null, + "TotalBasePayAmount": 0.0, + "TotalBasePayFrequency": null, + "TotalBasePayAnnualizedAmount": 0.0, + "JobProfile": { + "Name": "Peer Educator", + "WID": "d957207a306801fb8fecfd7e6f5ccc47", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fb8fecfd7e6f5ccc47" + }, + { + "Type": "Job_Profile_ID", + "Value": "21163" + } + ], + "Href": "/hrp/v3/jobprofile/d957207a306801fb8fecfd7e6f5ccc47.json" + }, + "JobClassificationSummaries": [ + { + "JobClassification": { + "Name": "V - Affiliate (Employment Program)", + "WID": "d957207a306801d91e4434e46d5c4f22", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801d91e4434e46d5c4f22" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "ECS_V" + } + ], + "Href": "/hrp/v3/jobclassification/d957207a306801d91e4434e46d5c4f22.json" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "d957207a30680132aa0534e46d5c4d22", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680132aa0534e46d5c4d22" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "ECS" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/d957207a30680132aa0534e46d5c4d22.json" + } + } + ], + "Location": { + "Name": "Seattle Campus", + "WID": "d957207a306801c93acc30b96e5cae30", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801c93acc30b96e5cae30" + }, + { + "Type": "Location_ID", + "Value": "Seattle Campus" + } + ], + "Href": "/financial/v2/location/d957207a306801c93acc30b96e5cae30.json" + }, + "OrganizationDetails": [ + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "039334 FYP OPTIONAL PROGRAMS", + "WID": "d957207a306801dcdad4e4ba8d5c8b50", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801dcdad4e4ba8d5c8b50" + }, + { + "Type": "Organization_Reference_ID", + "Value": "039334" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "039334" + } + ] + } + }, + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "", + "WID": "d957207a3068010205dd8e2b6f5c7136", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068010205dd8e2b6f5c7136" + }, + { + "Type": "Organization_Reference_ID", + "Value": "" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "UAA: SAS - FYP Program JM Contingent Worker (... (Inherited))", + "WID": "995754e647b7012cc88d14001864a959", + "IDs": [ + { + "Type": "WID", + "Value": "995754e647b7012cc88d14001864a959" + }, + { + "Type": "Organization_Reference_ID", + "Value": "UAA_000031_JM_Contingent_Worker" + } + ] + } + } + ], + "JobScheduledWeeklyHours": 0.0, + "JobDefaultWeeklyHours": 40.0, + "JobFamilySummaries": [ + { + "JobFamily": { + "Name": "01 - Contingent Workers - Contingent Worker", + "WID": "d957207a306801ebc2028a0d6e5c222f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801ebc2028a0d6e5c222f" + }, + { + "Type": "Job_Family_ID", + "Value": "Contingent Worker" + } + ], + "Href": "/hrp/v3/jobfamily/d957207a306801ebc2028a0d6e5c222f.json" + }, + "JobFamilyGroup": { + "Name": "01 - Contingent Workers", + "WID": "d957207a3068011b359d0de56e5c5832", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011b359d0de56e5c5832" + }, + { + "Type": "Job_Family_ID", + "Value": "01 - Contingent Workers" + } + ], + "Href": "/hrp/v3/jobfamilygroup/d957207a3068011b359d0de56e5c5832.json" + } + } + ], + "JobCategory": { + "Name": "Contingent Worker", + "WID": "d957207a306801e697281e276e5c532f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e697281e276e5c532f" + }, + { + "Type": "Job_Category_ID", + "Value": "Contingent Worker" + } + ], + "Href": "/hrp/v3/jobcategory/d957207a306801e697281e276e5c532f.json" + }, + "CompensationMostRecentChangeDate": null, + "Managers": [], + "IsManager": false, + "ProbationEndDate": null, + "SupervisoryOrganization": { + "Name": "UAA: SAS - FYP Program JM Contingent Worker (Skirven, Matt (Inherited))", + "WID": "995754e647b7012cc88d14001864a959", + "IDs": [ + { + "Type": "WID", + "Value": "995754e647b7012cc88d14001864a959" + }, + { + "Type": "Organization_Reference_ID", + "Value": "UAA_000031_JM_Contingent_Worker" + } + ], + "Href": "/hrp/v3/supervisoryorganization/995754e647b7012cc88d14001864a959.json" + }, + "WorkerCompensationPlanAssignment": { + "Href": "/hrp/v3/workercompensationplanassignment/6d879e625f930113010b92ad8a3d0000.json" + }, + "WorkerPeriodActivityPayAssignment": { + "Href": "/hrp/v3/workerperiodactivitypayassignment/6d879e625f930113010b92ad8a3d0000.json" + }, + "WorkerPayrollCostingAllocation": { + "Href": "/hrp/v3/workerpayrollcostingallocation/6d879e625f930113010b92ad8a3d0000.json" + } + } + ], + "OrganizationDetails": [ + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "039334 FYP OPTIONAL PROGRAMS", + "WID": "d957207a306801dcdad4e4ba8d5c8b50", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801dcdad4e4ba8d5c8b50" + }, + { + "Type": "Organization_Reference_ID", + "Value": "039334" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "039334" + } + ] + } + }, + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "", + "WID": "d957207a3068010205dd8e2b6f5c7136", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068010205dd8e2b6f5c7136" + }, + { + "Type": "Organization_Reference_ID", + "Value": "" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "UAA: SAS - FYP Program JM Contingent Worker (...(Inherited))", + "WID": "995754e647b7012cc88d14001864a959", + "IDs": [ + { + "Type": "WID", + "Value": "995754e647b7012cc88d14001864a959" + }, + { + "Type": "Organization_Reference_ID", + "Value": "UAA_000031_JM_Contingent_Worker" + } + ] + } + } + ], + "PersonalData": { + "LegalName": null, + "DateOfBirth": null, + "USCitizenshipStatuses": [], + "IsHispanicOrLatino": null, + "FederalReportingEthnicityCode": null, + "Gender": null, + "DisabilityStatusDetails": [], + "SelfIdentificationOfDisability": { + "SelfIdentificationOfDisabilityStatus": null, + "SelfIdentificationID": null + }, + "MaritalStatus": null, + "Ethnicities": [], + "MilitaryStatuses": [], + "Contact": { + "Addresses": [ + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-49", + "WID": "d957207a306801b535f630b96e5cb130", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801b535f630b96e5cb130" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-49" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "Seattle Main Campus" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195", + "FormattedAddress": "", + "EffectiveDate": "1900-01-01T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + } + ], + "Emails": [ + { + "Email": { + "Name": "EMAIL_REFERENCE-3-2153507", + "WID": "a03caf865a11010ef32973e903b80001", + "IDs": [ + { + "Type": "WID", + "Value": "a03caf865a11010ef32973e903b80001" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-2153507" + } + ] + }, + "EmailAddress": "abcde@uw.edu", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "Phones": [], + "CampusMailbox": "" + }, + "CustomIDs": [] + }, + "ActiveAppointment": false, + "CurrentFaculty": false, + "PostdocAnniversaryDate": null, + "TeleworkParticipation": null, + "FutureRecord": false + } + ] + } + ] +} diff --git a/uw_hrp/resources/hrpws/file/hrp/v3/person/000000005.json b/uw_hrp/resources/hrpws/file/hrp/v3/person/000000005.json new file mode 100644 index 0000000..9d35894 --- /dev/null +++ b/uw_hrp/resources/hrpws/file/hrp/v3/person/000000005.json @@ -0,0 +1,1251 @@ +{ + "Name": "Bill Faculty", + "EmployeeID": "000000005", + "RegID": "10000000000000000000000000000005", + "IDs": [ + { + "Type": "RegID", + "Value": "10000000000000000000000000000005" + }, + { + "Type": "EmployeeID", + "Value": "000000005" + }, + { + "Type": "NetID", + "Value": "bill" + }, + { + "Type": "StudentID", + "Value": "1000005" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000001" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000002" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000003" + } + ], + "Href": "/hrp/v3/person/10000000000000000000000000000005.json", + "RepositoryTimeStamp": "2022-11-29T10:56:28.477-08:00", + "FirstName": "Bill", + "LastName": "Faculty", + "PreferredName": { + "FirstName": "Bill", + "LastName": "Faculty", + "MiddleName": null + }, + "WorkerDetails": [ + { + "Name": "Faculty, Bill", + "WID": "1b68136df25201c0710e3ddad462fa1d", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df25201c0710e3ddad462fa1d" + }, + { + "Type": "Employee_ID", + "Value": "000000005" + } + ], + "WorkerType": "Employee", + "HuskyCardOverride": null, + "EmploymentStatus": { + "HireDate": "2006-05-16T00:00:00-07:00", + "OriginalHireDate": "2006-05-16T00:00:00-07:00", + "ExpectedFixedTermEndDate": null, + "FirstDayOfWork": "2006-05-16T00:00:00-07:00", + "ActiveStatusDate": "2006-05-16T00:00:00-07:00", + "Active": true, + "EmployeeStatus": "Active", + "Terminated": false, + "TerminationDate": null, + "TerminationInvoluntary": null, + "TerminationReason": null, + "Retired": false, + "RetirementDate": null, + "RetirementApplicationDate": null, + "DisplayLeave": false, + "LeaveStatusDetails": [] + }, + "EmploymentDetails": [ + { + "Position": { + "Name": "PN-0054525 CLINICAL ASSOCIATE PROFESSOR, Family Medicine JM Academic - Faculty, Bill", + "WID": "1b68136df2520192c53b3ddad462ff1d", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df2520192c53b3ddad462ff1d" + }, + { + "Type": "Position_ID", + "Value": "PN-0054525" + } + ], + "Href": "/hrp/v3/position/1b68136df2520192c53b3ddad462ff1d.json" + }, + "PositionRestriction": null, + "PrimaryPosition": true, + "BusinessTitle": "Clinical Associate Professor", + "PositionTitle": "CLINICAL ASSOCIATE PROFESSOR, Family Medicine JM Academic", + "EffectiveDate": "2019-05-01T00:00:00-07:00", + "StartDate": "2012-07-01T00:00:00-07:00", + "PositionVacateDate": null, + "ExpectedFixedTermEndDate": null, + "PositionWorkerType": { + "Name": "Unpaid Academic", + "WID": "d957207a306801cf268cd2d86a5c8415", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801cf268cd2d86a5c8415" + }, + { + "Type": "Employee_Type_ID", + "Value": "Unpaid_Academic" + } + ] + }, + "FTEPercent": 0.0, + "PayRateType": { + "Name": "N/A", + "WID": "d957207a306801e0ff0dbb026d5cda1d", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0ff0dbb026d5cda1d" + }, + { + "Type": "Pay_Rate_Type_ID", + "Value": "N/A" + } + ] + }, + "WorkShift": { + "Name": "First Shift (United States of America)", + "WID": "d957207a306801ac611a09fe6e5c7432", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801ac611a09fe6e5c7432" + }, + { + "Type": "Work_Shift_ID", + "Value": "First Shift" + } + ] + }, + "TotalPayAnnualizedAmount": 0.0, + "TimeType": { + "Name": "Part time", + "WID": "afa35b88537f015bd4e4faafb6574800", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f015bd4e4faafb6574800" + }, + { + "Type": "Position_Time_Type_ID", + "Value": "Part_time" + } + ] + }, + "CompensationStep": null, + "TotalBasePayAmount": 0.0, + "TotalBasePayFrequency": { + "Name": "Monthly", + "WID": "afa35b88537f01c22b33fbafb6574c00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f01c22b33fbafb6574c00" + }, + { + "Type": "Frequency_ID", + "Value": "Monthly" + } + ] + }, + "TotalBasePayAnnualizedAmount": 0.0, + "JobProfile": { + "Name": "Unpaid Academic", + "WID": "d957207a306801fc5c30a8906f5c6b57", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fc5c30a8906f5c6b57" + }, + { + "Type": "Job_Profile_ID", + "Value": "21184" + } + ], + "Href": "/hrp/v3/jobprofile/d957207a306801fc5c30a8906f5c6b57.json" + }, + "JobClassificationSummaries": [ + { + "JobClassification": { + "Name": "F - Academic Personnel (Employment Program)", + "WID": "d957207a306801cd215e34e46d5c5122", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801cd215e34e46d5c5122" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "ECS_F" + } + ], + "Href": "/hrp/v3/jobclassification/d957207a306801cd215e34e46d5c5122.json" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "d957207a30680132aa0534e46d5c4d22", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680132aa0534e46d5c4d22" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "ECS" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/d957207a30680132aa0534e46d5c4d22.json" + } + } + ], + "Location": { + "Name": "Seattle Campus", + "WID": "d957207a306801c93acc30b96e5cae30", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801c93acc30b96e5cae30" + }, + { + "Type": "Location_ID", + "Value": "Seattle Campus" + } + ], + "Href": "/financial/v2/location/d957207a306801c93acc30b96e5cae30.json" + }, + "OrganizationDetails": [ + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "356390", + "WID": "d957207a3068012bc9cdc42f6f5c7239", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068012bc9cdc42f6f5c7239" + }, + { + "Type": "Organization_Reference_ID", + "Value": "356390" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "356390" + } + ] + } + }, + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "681925 WORKDAY DEFAULT DEPTBG", + "WID": "cea06499724601a5b9617be66daec594", + "IDs": [ + { + "Type": "WID", + "Value": "cea06499724601a5b9617be66daec594" + }, + { + "Type": "Organization_Reference_ID", + "Value": "681925" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "681925" + } + ] + } + }, + { + "Type": { + "Name": "Academic Job Families Org type", + "WID": "9a03a28c5baf01383f79bdc89a452b1f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf01383f79bdc89a452b1f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Academic_Job_Families_Org_type" + } + ] + }, + "Organization": { + "Name": "Academic Job Families Custom Org", + "WID": "9a03a28c5baf018f36d4da049b45f61f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf018f36d4da049b45f61f" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ] + } + } + ], + "JobScheduledWeeklyHours": 0.0, + "JobDefaultWeeklyHours": 40.0, + "JobFamilySummaries": [ + { + "JobFamily": { + "Name": "01 - Academic Personnel - Faculty - Annual or Shorter", + "WID": "d957207a30680108b5d6280d6e5cd82e", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680108b5d6280d6e5cd82e" + }, + { + "Type": "Job_Family_ID", + "Value": "Faculty - Annual or Shorter" + } + ], + "Href": "/hrp/v3/jobfamily/d957207a30680108b5d6280d6e5cd82e.json" + }, + "JobFamilyGroup": { + "Name": "01 - Academic Personnel", + "WID": "d957207a306801b8081ab3e36e5c4b32", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801b8081ab3e36e5c4b32" + }, + { + "Type": "Job_Family_ID", + "Value": "01 - Academic Personnel" + } + ], + "Href": "/hrp/v3/jobfamilygroup/d957207a306801b8081ab3e36e5c4b32.json" + } + } + ], + "JobCategory": { + "Name": "Faculty", + "WID": "d957207a30680180eba3f5266e5c482f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680180eba3f5266e5c482f" + }, + { + "Type": "Job_Category_ID", + "Value": "Faculty" + } + ], + "Href": "/hrp/v3/jobcategory/d957207a30680180eba3f5266e5c482f.json" + }, + "CompensationMostRecentChangeDate": "2021-03-16T00:00:00-07:00", + "Managers": [ + { + "Name": "Joj, Pop", + "WID": "1b68136df25201eb472087dad162bca4", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df25201eb472087dad162bca4" + }, + { + "Type": "Employee_ID", + "Value": "845007271" + } + ], + "Href": "/hrp/v3/person/845007271.json" + } + ], + "IsManager": false, + "ProbationEndDate": null, + "SupervisoryOrganization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ], + "Href": "/hrp/v3/supervisoryorganization/751e82d2c30301b7f5dc547e053971d4.json" + }, + "WorkerCompensationPlanAssignment": { + "Href": "/hrp/v3/workercompensationplanassignment/1b68136df25201c0710e3ddad462fa1d.json" + }, + "WorkerPeriodActivityPayAssignment": { + "Href": "/hrp/v3/workerperiodactivitypayassignment/1b68136df25201c0710e3ddad462fa1d.json" + }, + "WorkerPayrollCostingAllocation": { + "Href": "/hrp/v3/workerpayrollcostingallocation/1b68136df25201c0710e3ddad462fa1d.json" + } + } + ], + "OrganizationDetails": [ + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "356390", + "WID": "d957207a3068012bc9cdc42f6f5c7239", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068012bc9cdc42f6f5c7239" + }, + { + "Type": "Organization_Reference_ID", + "Value": "356390" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "356390" + } + ] + } + }, + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "681925 WORKDAY DEFAULT DEPTBG", + "WID": "cea06499724601a5b9617be66daec594", + "IDs": [ + { + "Type": "WID", + "Value": "cea06499724601a5b9617be66daec594" + }, + { + "Type": "Organization_Reference_ID", + "Value": "681925" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "681925" + } + ] + } + }, + { + "Type": { + "Name": "Academic Job Families Org type", + "WID": "9a03a28c5baf01383f79bdc89a452b1f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf01383f79bdc89a452b1f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Academic_Job_Families_Org_type" + } + ] + }, + "Organization": { + "Name": "Academic Job Families Custom Org", + "WID": "9a03a28c5baf018f36d4da049b45f61f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf018f36d4da049b45f61f" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ] + } + } + ], + "PersonalData": { + "LegalName": null, + "DateOfBirth": null, + "USCitizenshipStatuses": [], + "IsHispanicOrLatino": null, + "FederalReportingEthnicityCode": null, + "Gender": null, + "DisabilityStatusDetails": [], + "SelfIdentificationOfDisability": { + "SelfIdentificationOfDisabilityStatus": null, + "SelfIdentificationID": null + }, + "MaritalStatus": null, + "Ethnicities": [], + "MilitaryStatuses": [], + "Contact": { + "Addresses": [ + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-49", + "WID": "d957207a306801b535f630b96e5cb130", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801b535f630b96e5cb130" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-49" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "Seattle Main Campus" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195", + "FormattedAddress": "Seattle Main Campus Seattle, WA 98195 United States of America", + "EffectiveDate": "1900-01-01T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + }, + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-66240", + "WID": "1b68136df2520154fe79253bea62db45", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df2520154fe79253bea62db45" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-66240" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "1705 NE Pacific St" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195-0000", + "FormattedAddress": "1705 NE Pacific St Seattle, WA 98195-0000 United States of America", + "EffectiveDate": "2006-05-16T00:00:00-07:00", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + }, + { + "Address": { + "Name": "ADDRESS_REFERENCE-3-291668", + "WID": "2689c126632a010c7dc1085d7a26a559", + "IDs": [ + { + "Type": "WID", + "Value": "2689c126632a010c7dc1085d7a26a559" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-3-291668" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "PO Box 5299" + }, + { + "Name": "Address Line 2", + "Type": "ADDRESS_LINE_2", + "Value": "MS: 820-2-MMA" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Tacoma", + "PostalCode": "98415", + "FormattedAddress": "PO Box 5299 MS: 820-2-MMA Tacoma, WA 98415 United States of America", + "EffectiveDate": "2020-11-20T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [ + { + "Name": "Other - Work", + "WID": "75ec2b2be753100003ffdf552f790001", + "IDs": [ + { + "Type": "WID", + "Value": "75ec2b2be753100003ffdf552f790001" + }, + { + "Type": "Communication_Usage_Behavior_ID", + "Value": "OTHER_WORK" + } + ] + } + ], + "UsesForTenanted": [ + { + "Name": "Other - Work", + "WID": "d957207a306801fda80c72d2665c4613", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fda80c72d2665c4613" + }, + { + "Type": "Communication_Usage_Behavior_Tenanted_ID", + "Value": "Other - Work" + } + ] + }, + { + "Name": "Alternate- Work", + "WID": "d957207a3068015d5d0296d2665c5413", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068015d5d0296d2665c5413" + }, + { + "Type": "Communication_Usage_Behavior_Tenanted_ID", + "Value": "Alternate - Work" + } + ] + } + ], + "Public": true + } + ], + "SubRegions": [ + { + "Name": "County", + "Type": "REGION_SUBDIVISION_1", + "Value": "Pierce" + } + ] + } + ], + "Emails": [ + { + "Email": { + "Name": "EMAIL_REFERENCE-3-37977", + "WID": "29cae45a91d0016cb2e3b35d604c1eec", + "IDs": [ + { + "Type": "WID", + "Value": "29cae45a91d0016cb2e3b35d604c1eec" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-37977" + } + ] + }, + "EmailAddress": "faculty@uw.edu", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + }, + { + "Email": { + "Name": "EMAIL_REFERENCE-3-2071042", + "WID": "2689c126632a0181bd2dddcb7926f055", + "IDs": [ + { + "Type": "WID", + "Value": "2689c126632a0181bd2dddcb7926f055" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-2071042" + } + ] + }, + "EmailAddress": "bill.faculty@m.org", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "Phones": [ + { + "Phone": { + "Name": "PHONE_REFERENCE-3-15546", + "WID": "1074ee40fe4c011dc25cab690a888f49", + "IDs": [ + { + "Type": "WID", + "Value": "1074ee40fe4c011dc25cab690a888f49" + }, + { + "Type": "Phone_ID", + "Value": "PHONE_REFERENCE-3-15546" + } + ] + }, + "CountryISOCode": "USA", + "InternationalPhoneCode": "1", + "PhoneNumber": "", + "FormattedPhoneNumber": "", + "DeviceType": { + "Name": "Mobile", + "WID": "d957207a3068014f9b80c9cc665c3713", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068014f9b80c9cc665c3713" + }, + { + "Type": "Phone_Device_Type_ID", + "Value": "Mobile" + } + ] + }, + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + }, + { + "Phone": { + "Name": "PHONE_REFERENCE-3-93711", + "WID": "1074ee40fe4c01434614e8551188d78a", + "IDs": [ + { + "Type": "WID", + "Value": "1074ee40fe4c01434614e8551188d78a" + }, + { + "Type": "Phone_ID", + "Value": "PHONE_REFERENCE-3-93711" + } + ] + }, + "CountryISOCode": "USA", + "InternationalPhoneCode": "1", + "PhoneNumber": "", + "FormattedPhoneNumber": "", + "DeviceType": { + "Name": "Telephone", + "WID": "d957207a306801bfcadadacc665c3913", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801bfcadadacc665c3913" + }, + { + "Type": "Phone_Device_Type_ID", + "Value": "Telephone" + } + ] + }, + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "CampusMailbox": "" + }, + "CustomIDs": [] + }, + "ActiveAppointment": true, + "CurrentFaculty": true, + "PostdocAnniversaryDate": null, + "TeleworkParticipation": null, + "FutureRecord": false + } + ] +} diff --git a/uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json b/uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json new file mode 100644 index 0000000..87ee187 --- /dev/null +++ b/uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json @@ -0,0 +1,1298 @@ +{ + "Name": "James Student", + "EmployeeID": "123456789", + "RegID": "9136CCB8F66711D5BE060004AC494FFE", + "IDs": [ + { + "Type": "RegID", + "Value": "9136CCB8F66711D5BE060004AC494FFE" + }, + { + "Type": "EmployeeID", + "Value": "123456789" + }, + { + "Type": "NetID", + "Value": "javerage" + }, + { + "Type": "StudentID", + "Value": "2069354" + }, + { + "Type": "PriorEmployeeID", + "Value": "T000063295" + } + ], + "Href": "/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json", + "RepositoryTimeStamp": "2022-11-29T10:59:11.706-08:00", + "FirstName": "James", + "LastName": "Student", + "PreferredName": { + "FirstName": "James", + "LastName": "Student", + "MiddleName": null + }, + "WorkerDetails": [ + { + "Name": "Student, James", + "WID": "1b68136df25201c0710e3ddad462fa1d", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Employee_ID", + "Value": "123456789" + } + ], + "WorkerType": "Employee", + "HuskyCardOverride": null, + "EmploymentStatus": { + "HireDate": "2021-11-12T00:00:00-08:00", + "OriginalHireDate": "2021-11-12T00:00:00-08:00", + "ExpectedFixedTermEndDate": "2023-06-15T00:00:00-07:00", + "FirstDayOfWork": "2021-11-12T00:00:00-08:00", + "ActiveStatusDate": "2021-11-12T00:00:00-08:00", + "Active": true, + "EmployeeStatus": "Active", + "Terminated": false, + "TerminationDate": null, + "TerminationInvoluntary": null, + "TerminationReason": null, + "Retired": false, + "RetirementDate": null, + "RetirementApplicationDate": null, + "DisplayLeave": false, + "LeaveStatusDetails": [] + }, + "EmploymentDetails": [ + { + "Position": { + "Name": "PN-0212169 Student Assistant (NE H) - Student, James", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Position_ID", + "Value": "PN-0212169" + } + ], + "Href": "/hrp/v3/position/.json" + }, + "PositionRestriction": null, + "PrimaryPosition": true, + "BusinessTitle": "Student Assistant (NE H)", + "PositionTitle": "Student Assistant (NE H)", + "EffectiveDate": "2022-11-12T00:00:00-08:00", + "StartDate": "2021-11-12T00:00:00-08:00", + "PositionVacateDate": null, + "ExpectedFixedTermEndDate": null, + "PositionWorkerType": { + "Name": "Temporary (Fixed Term)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Employee_Type_ID", + "Value": "Temporary" + } + ] + }, + "FTEPercent": 0.0, + "PayRateType": { + "Name": "Hourly", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Pay_Rate_Type_ID", + "Value": "Hourly" + } + ] + }, + "WorkShift": { + "Name": "First Shift (United States of America)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Work_Shift_ID", + "Value": "First Shift" + } + ] + }, + "TotalPayAnnualizedAmount": 35921.6, + "TimeType": { + "Name": "Part time", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Position_Time_Type_ID", + "Value": "Part_time" + } + ] + }, + "CompensationStep": null, + "TotalBasePayAmount": 17.27, + "TotalBasePayFrequency": { + "Name": "Hourly", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Frequency_ID", + "Value": "Hourly" + } + ] + }, + "TotalBasePayAnnualizedAmount": 3.6, + "JobProfile": { + "Name": "Student Assistant (NE H)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Profile_ID", + "Value": "10875" + } + ], + "Href": "/hrp/v3/jobprofile/.json" + }, + "JobClassificationSummaries": [ + { + "JobClassification": { + "Name": "U - Undergraduate Student (Employment Program)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "ECS_U" + } + ], + "Href": "/hrp/v3/jobclassification/.json" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "ECS" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/.json" + } + }, + { + "JobClassification": { + "Name": "0180 - Hourly, Overtime, Premiums and Payouts (Financial Account Codes (Object-Codes))", + "WID": "d957207a306801ea738f97e46d5cbd24", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801ea738f97e46d5cbd24" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "OBJ_0180" + } + ], + "Href": "/hrp/v3/jobclassification/d957207a306801ea738f97e46d5cbd24.json" + }, + "JobClassificationGroup": { + "Name": "Financial Account Codes (Object-Codes)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "OBJ" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/.json" + } + } + ], + "Location": { + "Name": "Seattle Campus", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Location_ID", + "Value": "Seattle Campus" + } + ], + "Href": "/financial/v2/location/.json" + }, + "OrganizationDetails": [ + { + "Type": { + "Name": "Cost Center", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "060418 CHEMISTRY", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "060418" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "060418" + } + ] + } + }, + { + "Type": { + "Name": "Service Period", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "351700", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "351700" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "351700" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "CAS: Chemistry: Theberge JM Student (Theberge, Ashleigh B)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "CAS_000896_JM_Student" + } + ] + } + }, + { + "Type": { + "Name": "FERPA", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Protected_ID" + } + ] + }, + "Organization": { + "Name": "Students Protected by FERPA", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "STUDENTS_FERPA" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "STUDENTS_FERPA" + } + ] + } + } + ], + "JobScheduledWeeklyHours": 0.0, + "JobDefaultWeeklyHours": 40.0, + "JobFamilySummaries": [ + { + "JobFamily": { + "Name": "01 - Student Employees - Students", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Family_ID", + "Value": "Students" + } + ], + "Href": "/hrp/v3/jobfamily/.json" + }, + "JobFamilyGroup": { + "Name": "01 - Student Employees", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Family_ID", + "Value": "01 - Student Employees" + } + ], + "Href": "/hrp/v3/jobfamilygroup/.json" + } + } + ], + "JobCategory": { + "Name": "Hourly and Other", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Category_ID", + "Value": "Hourly and Other" + } + ], + "Href": "/hrp/v3/jobcategory/.json" + }, + "CompensationMostRecentChangeDate": "2022-11-12T00:00:00-08:00", + "Managers": [ + { + "Name": "The, Ash", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Employee_ID", + "Value": "100000001" + } + ], + "Href": "/hrp/v3/person/100000001.json" + } + ], + "IsManager": false, + "ProbationEndDate": null, + "SupervisoryOrganization": { + "Name": "CAS: Chemistry: Theberge JM Student ()", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "CAS_000896_JM_Student" + } + ], + "Href": "/hrp/v3/supervisoryorganization/.json" + }, + "WorkerCompensationPlanAssignment": { + "Href": "/hrp/v3/workercompensationplanassignment/.json" + }, + "WorkerPeriodActivityPayAssignment": { + "Href": "/hrp/v3/workerperiodactivitypayassignment/.json" + }, + "WorkerPayrollCostingAllocation": { + "Href": "/hrp/v3/workerpayrollcostingallocation/.json" + } + }, + { + "Position": { + "Name": "PN-0244338 Graduate Fellow/Trainee Stipend w/o Benefits - Student, (+)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Position_ID", + "Value": "PN-0244338" + } + ], + "Href": "/hrp/v3/position/.json" + }, + "PositionRestriction": null, + "PrimaryPosition": false, + "BusinessTitle": "Graduate Fellow/Trainee Stipend w/o Benefits", + "PositionTitle": "Graduate Fellow/Trainee Stipend w/o Benefits", + "EffectiveDate": "2022-10-16T00:00:00-07:00", + "StartDate": "2022-10-16T00:00:00-07:00", + "PositionVacateDate": null, + "ExpectedFixedTermEndDate": null, + "PositionWorkerType": { + "Name": "Fixed Term (Fixed Term)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Employee_Type_ID", + "Value": "Fixed_Term" + } + ] + }, + "FTEPercent": 0.0, + "PayRateType": { + "Name": "Stipend", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Pay_Rate_Type_ID", + "Value": "Stipend" + } + ] + }, + "WorkShift": { + "Name": "First Shift (United States of America)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Work_Shift_ID", + "Value": "First Shift" + } + ] + }, + "TotalPayAnnualizedAmount": 35921.6, + "TimeType": { + "Name": "Part time", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Position_Time_Type_ID", + "Value": "Part_time" + } + ] + }, + "CompensationStep": null, + "TotalBasePayAmount": 0.0, + "TotalBasePayFrequency": null, + "TotalBasePayAnnualizedAmount": 0.0, + "JobProfile": { + "Name": "Graduate Fellow/Trainee Stipend w/o Benefits", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Profile_ID", + "Value": "21192" + } + ], + "Href": "/hrp/v3/jobprofile/.json" + }, + "JobClassificationSummaries": [ + { + "JobClassification": { + "Name": "S - Stipend (Employment Program)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "ECS_S" + } + ], + "Href": "/hrp/v3/jobclassification/.json" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "ECS" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/.json" + } + }, + { + "JobClassification": { + "Name": "0190 - Pre Doc Trainees (Financial Account Codes (Object-Codes))", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "OBJ_0190" + } + ], + "Href": "/hrp/v3/jobclassification/.json" + }, + "JobClassificationGroup": { + "Name": "Financial Account Codes (Object-Codes)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "OBJ" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/.json" + } + } + ], + "Location": { + "Name": "Seattle Campus", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Location_ID", + "Value": "Seattle Campus" + } + ], + "Href": "/financial/v2/location/.json" + }, + "OrganizationDetails": [ + { + "Type": { + "Name": "Service Period", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "352600", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "352600" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "352600" + } + ] + } + }, + { + "Type": { + "Name": "Cost Center", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "752554 RCR DEVASIA", + "WID": "d957207a30680191be62d9a2925c97d2", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680191be62d9a2925c97d2" + }, + { + "Type": "Organization_Reference_ID", + "Value": "752554" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "752554" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "ENG: Mechanical Engineering-Devasia Lab JM Student (Devasia, Santosh (Inherited))", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "ENG_000307_JM_Student" + } + ] + } + }, + { + "Type": { + "Name": "FERPA", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Protected_ID" + } + ] + }, + "Organization": { + "Name": "Students Protected by FERPA", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "STUDENTS_FERPA" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "STUDENTS_FERPA" + } + ] + } + } + ], + "JobScheduledWeeklyHours": 0.0, + "JobDefaultWeeklyHours": 40.0, + "JobFamilySummaries": [ + { + "JobFamily": { + "Name": "01 - Stipend Family Group - Stipend", + "WID": "d957207a30680175d7993a0d6e5ce62e", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680175d7993a0d6e5ce62e" + }, + { + "Type": "Job_Family_ID", + "Value": "Stipend" + } + ], + "Href": "/hrp/v3/jobfamily/d957207a30680175d7993a0d6e5ce62e.json" + }, + "JobFamilyGroup": { + "Name": "01 - Stipend Family Group", + "WID": "d957207a30680184a72187e46e5c5032", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680184a72187e46e5c5032" + }, + { + "Type": "Job_Family_ID", + "Value": "01 - Stipend Family Group" + } + ], + "Href": "/hrp/v3/jobfamilygroup/d957207a30680184a72187e46e5c5032.json" + } + } + ], + "JobCategory": { + "Name": "Graduate Student Stipends", + "WID": "d957207a306801fb261817276e5c502f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fb261817276e5c502f" + }, + { + "Type": "Job_Category_ID", + "Value": "Graduate Student Stipends" + } + ], + "Href": "/hrp/v3/jobcategory/d957207a306801fb261817276e5c502f.json" + }, + "CompensationMostRecentChangeDate": null, + "Managers": [], + "IsManager": false, + "ProbationEndDate": null, + "SupervisoryOrganization": { + "Name": "ENG: Mechanical Engineering-Devasia Lab JM Student ()", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "ENG_000307_JM_Student" + } + ], + "Href": "/hrp/v3/supervisoryorganization/.json" + }, + "WorkerCompensationPlanAssignment": { + "Href": "/hrp/v3/workercompensationplanassignment/.json" + }, + "WorkerPeriodActivityPayAssignment": { + "Href": "/hrp/v3/workerperiodactivitypayassignment/.json" + }, + "WorkerPayrollCostingAllocation": { + "Href": "/hrp/v3/workerpayrollcostingallocation/.json" + } + } + ], + "OrganizationDetails": [ + { + "Type": { + "Name": "Cost Center", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "060418 CHEMISTRY", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "060418" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "060418" + } + ] + } + }, + { + "Type": { + "Name": "Service Period", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "351700", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "351700" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "351700" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "CAS: Chemistry: Theberge JM Student (Theberge, Ashleigh B)", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "CAS_000896_JM_Student" + } + ] + } + }, + { + "Type": { + "Name": "FERPA", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Type_ID", + "Value": "Protected_ID" + } + ] + }, + "Organization": { + "Name": "Students Protected by FERPA", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Organization_Reference_ID", + "Value": "STUDENTS_FERPA" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "STUDENTS_FERPA" + } + ] + } + } + ], + "PersonalData": { + "LegalName": null, + "DateOfBirth": null, + "USCitizenshipStatuses": [], + "IsHispanicOrLatino": null, + "FederalReportingEthnicityCode": null, + "Gender": null, + "DisabilityStatusDetails": [], + "SelfIdentificationOfDisability": { + "SelfIdentificationOfDisabilityStatus": null, + "SelfIdentificationID": null + }, + "MaritalStatus": null, + "Ethnicities": [], + "MilitaryStatuses": [], + "Contact": { + "Addresses": [ + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-49", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-49" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "Seattle Main Campus" + } + ], + "Country": { + "Name": "United States of America", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195", + "FormattedAddress": "Seattle Main Campus Seattle, WA 98195 United States of America", + "EffectiveDate": "1900-01-01T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + } + ], + "Emails": [ + { + "Email": { + "Name": "EMAIL_REFERENCE-3-2126130", + "WID": "52242b25e5f20109a4eb43ae14870002", + "IDs": [ + { + "Type": "WID", + "Value": "52242b25e5f20109a4eb43ae14870002" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-2126130" + } + ] + }, + "EmailAddress": "javerage@uw.edu", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "", + "IDs": [ + { + "Type": "WID", + "Value": "" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "Phones": [], + "CampusMailbox": "351700" + }, + "CustomIDs": [] + }, + "ActiveAppointment": false, + "CurrentFaculty": false, + "PostdocAnniversaryDate": null, + "TeleworkParticipation": null, + "FutureRecord": false + } + ] +} diff --git a/uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json b/uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json new file mode 100644 index 0000000..9d35894 --- /dev/null +++ b/uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json @@ -0,0 +1,1251 @@ +{ + "Name": "Bill Faculty", + "EmployeeID": "000000005", + "RegID": "10000000000000000000000000000005", + "IDs": [ + { + "Type": "RegID", + "Value": "10000000000000000000000000000005" + }, + { + "Type": "EmployeeID", + "Value": "000000005" + }, + { + "Type": "NetID", + "Value": "bill" + }, + { + "Type": "StudentID", + "Value": "1000005" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000001" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000002" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000003" + } + ], + "Href": "/hrp/v3/person/10000000000000000000000000000005.json", + "RepositoryTimeStamp": "2022-11-29T10:56:28.477-08:00", + "FirstName": "Bill", + "LastName": "Faculty", + "PreferredName": { + "FirstName": "Bill", + "LastName": "Faculty", + "MiddleName": null + }, + "WorkerDetails": [ + { + "Name": "Faculty, Bill", + "WID": "1b68136df25201c0710e3ddad462fa1d", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df25201c0710e3ddad462fa1d" + }, + { + "Type": "Employee_ID", + "Value": "000000005" + } + ], + "WorkerType": "Employee", + "HuskyCardOverride": null, + "EmploymentStatus": { + "HireDate": "2006-05-16T00:00:00-07:00", + "OriginalHireDate": "2006-05-16T00:00:00-07:00", + "ExpectedFixedTermEndDate": null, + "FirstDayOfWork": "2006-05-16T00:00:00-07:00", + "ActiveStatusDate": "2006-05-16T00:00:00-07:00", + "Active": true, + "EmployeeStatus": "Active", + "Terminated": false, + "TerminationDate": null, + "TerminationInvoluntary": null, + "TerminationReason": null, + "Retired": false, + "RetirementDate": null, + "RetirementApplicationDate": null, + "DisplayLeave": false, + "LeaveStatusDetails": [] + }, + "EmploymentDetails": [ + { + "Position": { + "Name": "PN-0054525 CLINICAL ASSOCIATE PROFESSOR, Family Medicine JM Academic - Faculty, Bill", + "WID": "1b68136df2520192c53b3ddad462ff1d", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df2520192c53b3ddad462ff1d" + }, + { + "Type": "Position_ID", + "Value": "PN-0054525" + } + ], + "Href": "/hrp/v3/position/1b68136df2520192c53b3ddad462ff1d.json" + }, + "PositionRestriction": null, + "PrimaryPosition": true, + "BusinessTitle": "Clinical Associate Professor", + "PositionTitle": "CLINICAL ASSOCIATE PROFESSOR, Family Medicine JM Academic", + "EffectiveDate": "2019-05-01T00:00:00-07:00", + "StartDate": "2012-07-01T00:00:00-07:00", + "PositionVacateDate": null, + "ExpectedFixedTermEndDate": null, + "PositionWorkerType": { + "Name": "Unpaid Academic", + "WID": "d957207a306801cf268cd2d86a5c8415", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801cf268cd2d86a5c8415" + }, + { + "Type": "Employee_Type_ID", + "Value": "Unpaid_Academic" + } + ] + }, + "FTEPercent": 0.0, + "PayRateType": { + "Name": "N/A", + "WID": "d957207a306801e0ff0dbb026d5cda1d", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0ff0dbb026d5cda1d" + }, + { + "Type": "Pay_Rate_Type_ID", + "Value": "N/A" + } + ] + }, + "WorkShift": { + "Name": "First Shift (United States of America)", + "WID": "d957207a306801ac611a09fe6e5c7432", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801ac611a09fe6e5c7432" + }, + { + "Type": "Work_Shift_ID", + "Value": "First Shift" + } + ] + }, + "TotalPayAnnualizedAmount": 0.0, + "TimeType": { + "Name": "Part time", + "WID": "afa35b88537f015bd4e4faafb6574800", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f015bd4e4faafb6574800" + }, + { + "Type": "Position_Time_Type_ID", + "Value": "Part_time" + } + ] + }, + "CompensationStep": null, + "TotalBasePayAmount": 0.0, + "TotalBasePayFrequency": { + "Name": "Monthly", + "WID": "afa35b88537f01c22b33fbafb6574c00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f01c22b33fbafb6574c00" + }, + { + "Type": "Frequency_ID", + "Value": "Monthly" + } + ] + }, + "TotalBasePayAnnualizedAmount": 0.0, + "JobProfile": { + "Name": "Unpaid Academic", + "WID": "d957207a306801fc5c30a8906f5c6b57", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fc5c30a8906f5c6b57" + }, + { + "Type": "Job_Profile_ID", + "Value": "21184" + } + ], + "Href": "/hrp/v3/jobprofile/d957207a306801fc5c30a8906f5c6b57.json" + }, + "JobClassificationSummaries": [ + { + "JobClassification": { + "Name": "F - Academic Personnel (Employment Program)", + "WID": "d957207a306801cd215e34e46d5c5122", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801cd215e34e46d5c5122" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "ECS_F" + } + ], + "Href": "/hrp/v3/jobclassification/d957207a306801cd215e34e46d5c5122.json" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "d957207a30680132aa0534e46d5c4d22", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680132aa0534e46d5c4d22" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "ECS" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/d957207a30680132aa0534e46d5c4d22.json" + } + } + ], + "Location": { + "Name": "Seattle Campus", + "WID": "d957207a306801c93acc30b96e5cae30", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801c93acc30b96e5cae30" + }, + { + "Type": "Location_ID", + "Value": "Seattle Campus" + } + ], + "Href": "/financial/v2/location/d957207a306801c93acc30b96e5cae30.json" + }, + "OrganizationDetails": [ + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "356390", + "WID": "d957207a3068012bc9cdc42f6f5c7239", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068012bc9cdc42f6f5c7239" + }, + { + "Type": "Organization_Reference_ID", + "Value": "356390" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "356390" + } + ] + } + }, + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "681925 WORKDAY DEFAULT DEPTBG", + "WID": "cea06499724601a5b9617be66daec594", + "IDs": [ + { + "Type": "WID", + "Value": "cea06499724601a5b9617be66daec594" + }, + { + "Type": "Organization_Reference_ID", + "Value": "681925" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "681925" + } + ] + } + }, + { + "Type": { + "Name": "Academic Job Families Org type", + "WID": "9a03a28c5baf01383f79bdc89a452b1f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf01383f79bdc89a452b1f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Academic_Job_Families_Org_type" + } + ] + }, + "Organization": { + "Name": "Academic Job Families Custom Org", + "WID": "9a03a28c5baf018f36d4da049b45f61f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf018f36d4da049b45f61f" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ] + } + } + ], + "JobScheduledWeeklyHours": 0.0, + "JobDefaultWeeklyHours": 40.0, + "JobFamilySummaries": [ + { + "JobFamily": { + "Name": "01 - Academic Personnel - Faculty - Annual or Shorter", + "WID": "d957207a30680108b5d6280d6e5cd82e", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680108b5d6280d6e5cd82e" + }, + { + "Type": "Job_Family_ID", + "Value": "Faculty - Annual or Shorter" + } + ], + "Href": "/hrp/v3/jobfamily/d957207a30680108b5d6280d6e5cd82e.json" + }, + "JobFamilyGroup": { + "Name": "01 - Academic Personnel", + "WID": "d957207a306801b8081ab3e36e5c4b32", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801b8081ab3e36e5c4b32" + }, + { + "Type": "Job_Family_ID", + "Value": "01 - Academic Personnel" + } + ], + "Href": "/hrp/v3/jobfamilygroup/d957207a306801b8081ab3e36e5c4b32.json" + } + } + ], + "JobCategory": { + "Name": "Faculty", + "WID": "d957207a30680180eba3f5266e5c482f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680180eba3f5266e5c482f" + }, + { + "Type": "Job_Category_ID", + "Value": "Faculty" + } + ], + "Href": "/hrp/v3/jobcategory/d957207a30680180eba3f5266e5c482f.json" + }, + "CompensationMostRecentChangeDate": "2021-03-16T00:00:00-07:00", + "Managers": [ + { + "Name": "Joj, Pop", + "WID": "1b68136df25201eb472087dad162bca4", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df25201eb472087dad162bca4" + }, + { + "Type": "Employee_ID", + "Value": "845007271" + } + ], + "Href": "/hrp/v3/person/845007271.json" + } + ], + "IsManager": false, + "ProbationEndDate": null, + "SupervisoryOrganization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ], + "Href": "/hrp/v3/supervisoryorganization/751e82d2c30301b7f5dc547e053971d4.json" + }, + "WorkerCompensationPlanAssignment": { + "Href": "/hrp/v3/workercompensationplanassignment/1b68136df25201c0710e3ddad462fa1d.json" + }, + "WorkerPeriodActivityPayAssignment": { + "Href": "/hrp/v3/workerperiodactivitypayassignment/1b68136df25201c0710e3ddad462fa1d.json" + }, + "WorkerPayrollCostingAllocation": { + "Href": "/hrp/v3/workerpayrollcostingallocation/1b68136df25201c0710e3ddad462fa1d.json" + } + } + ], + "OrganizationDetails": [ + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "356390", + "WID": "d957207a3068012bc9cdc42f6f5c7239", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068012bc9cdc42f6f5c7239" + }, + { + "Type": "Organization_Reference_ID", + "Value": "356390" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "356390" + } + ] + } + }, + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "681925 WORKDAY DEFAULT DEPTBG", + "WID": "cea06499724601a5b9617be66daec594", + "IDs": [ + { + "Type": "WID", + "Value": "cea06499724601a5b9617be66daec594" + }, + { + "Type": "Organization_Reference_ID", + "Value": "681925" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "681925" + } + ] + } + }, + { + "Type": { + "Name": "Academic Job Families Org type", + "WID": "9a03a28c5baf01383f79bdc89a452b1f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf01383f79bdc89a452b1f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Academic_Job_Families_Org_type" + } + ] + }, + "Organization": { + "Name": "Academic Job Families Custom Org", + "WID": "9a03a28c5baf018f36d4da049b45f61f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf018f36d4da049b45f61f" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ] + } + } + ], + "PersonalData": { + "LegalName": null, + "DateOfBirth": null, + "USCitizenshipStatuses": [], + "IsHispanicOrLatino": null, + "FederalReportingEthnicityCode": null, + "Gender": null, + "DisabilityStatusDetails": [], + "SelfIdentificationOfDisability": { + "SelfIdentificationOfDisabilityStatus": null, + "SelfIdentificationID": null + }, + "MaritalStatus": null, + "Ethnicities": [], + "MilitaryStatuses": [], + "Contact": { + "Addresses": [ + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-49", + "WID": "d957207a306801b535f630b96e5cb130", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801b535f630b96e5cb130" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-49" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "Seattle Main Campus" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195", + "FormattedAddress": "Seattle Main Campus Seattle, WA 98195 United States of America", + "EffectiveDate": "1900-01-01T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + }, + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-66240", + "WID": "1b68136df2520154fe79253bea62db45", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df2520154fe79253bea62db45" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-66240" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "1705 NE Pacific St" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195-0000", + "FormattedAddress": "1705 NE Pacific St Seattle, WA 98195-0000 United States of America", + "EffectiveDate": "2006-05-16T00:00:00-07:00", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + }, + { + "Address": { + "Name": "ADDRESS_REFERENCE-3-291668", + "WID": "2689c126632a010c7dc1085d7a26a559", + "IDs": [ + { + "Type": "WID", + "Value": "2689c126632a010c7dc1085d7a26a559" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-3-291668" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "PO Box 5299" + }, + { + "Name": "Address Line 2", + "Type": "ADDRESS_LINE_2", + "Value": "MS: 820-2-MMA" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Tacoma", + "PostalCode": "98415", + "FormattedAddress": "PO Box 5299 MS: 820-2-MMA Tacoma, WA 98415 United States of America", + "EffectiveDate": "2020-11-20T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [ + { + "Name": "Other - Work", + "WID": "75ec2b2be753100003ffdf552f790001", + "IDs": [ + { + "Type": "WID", + "Value": "75ec2b2be753100003ffdf552f790001" + }, + { + "Type": "Communication_Usage_Behavior_ID", + "Value": "OTHER_WORK" + } + ] + } + ], + "UsesForTenanted": [ + { + "Name": "Other - Work", + "WID": "d957207a306801fda80c72d2665c4613", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fda80c72d2665c4613" + }, + { + "Type": "Communication_Usage_Behavior_Tenanted_ID", + "Value": "Other - Work" + } + ] + }, + { + "Name": "Alternate- Work", + "WID": "d957207a3068015d5d0296d2665c5413", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068015d5d0296d2665c5413" + }, + { + "Type": "Communication_Usage_Behavior_Tenanted_ID", + "Value": "Alternate - Work" + } + ] + } + ], + "Public": true + } + ], + "SubRegions": [ + { + "Name": "County", + "Type": "REGION_SUBDIVISION_1", + "Value": "Pierce" + } + ] + } + ], + "Emails": [ + { + "Email": { + "Name": "EMAIL_REFERENCE-3-37977", + "WID": "29cae45a91d0016cb2e3b35d604c1eec", + "IDs": [ + { + "Type": "WID", + "Value": "29cae45a91d0016cb2e3b35d604c1eec" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-37977" + } + ] + }, + "EmailAddress": "faculty@uw.edu", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + }, + { + "Email": { + "Name": "EMAIL_REFERENCE-3-2071042", + "WID": "2689c126632a0181bd2dddcb7926f055", + "IDs": [ + { + "Type": "WID", + "Value": "2689c126632a0181bd2dddcb7926f055" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-2071042" + } + ] + }, + "EmailAddress": "bill.faculty@m.org", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "Phones": [ + { + "Phone": { + "Name": "PHONE_REFERENCE-3-15546", + "WID": "1074ee40fe4c011dc25cab690a888f49", + "IDs": [ + { + "Type": "WID", + "Value": "1074ee40fe4c011dc25cab690a888f49" + }, + { + "Type": "Phone_ID", + "Value": "PHONE_REFERENCE-3-15546" + } + ] + }, + "CountryISOCode": "USA", + "InternationalPhoneCode": "1", + "PhoneNumber": "", + "FormattedPhoneNumber": "", + "DeviceType": { + "Name": "Mobile", + "WID": "d957207a3068014f9b80c9cc665c3713", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068014f9b80c9cc665c3713" + }, + { + "Type": "Phone_Device_Type_ID", + "Value": "Mobile" + } + ] + }, + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + }, + { + "Phone": { + "Name": "PHONE_REFERENCE-3-93711", + "WID": "1074ee40fe4c01434614e8551188d78a", + "IDs": [ + { + "Type": "WID", + "Value": "1074ee40fe4c01434614e8551188d78a" + }, + { + "Type": "Phone_ID", + "Value": "PHONE_REFERENCE-3-93711" + } + ] + }, + "CountryISOCode": "USA", + "InternationalPhoneCode": "1", + "PhoneNumber": "", + "FormattedPhoneNumber": "", + "DeviceType": { + "Name": "Telephone", + "WID": "d957207a306801bfcadadacc665c3913", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801bfcadadacc665c3913" + }, + { + "Type": "Phone_Device_Type_ID", + "Value": "Telephone" + } + ] + }, + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "CampusMailbox": "" + }, + "CustomIDs": [] + }, + "ActiveAppointment": true, + "CurrentFaculty": true, + "PostdocAnniversaryDate": null, + "TeleworkParticipation": null, + "FutureRecord": false + } + ] +} diff --git a/uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json_future_worker_true b/uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json_future_worker_true new file mode 100644 index 0000000..9d35894 --- /dev/null +++ b/uw_hrp/resources/hrpws/file/hrp/v3/person/faculty.json_future_worker_true @@ -0,0 +1,1251 @@ +{ + "Name": "Bill Faculty", + "EmployeeID": "000000005", + "RegID": "10000000000000000000000000000005", + "IDs": [ + { + "Type": "RegID", + "Value": "10000000000000000000000000000005" + }, + { + "Type": "EmployeeID", + "Value": "000000005" + }, + { + "Type": "NetID", + "Value": "bill" + }, + { + "Type": "StudentID", + "Value": "1000005" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000001" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000002" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000003" + } + ], + "Href": "/hrp/v3/person/10000000000000000000000000000005.json", + "RepositoryTimeStamp": "2022-11-29T10:56:28.477-08:00", + "FirstName": "Bill", + "LastName": "Faculty", + "PreferredName": { + "FirstName": "Bill", + "LastName": "Faculty", + "MiddleName": null + }, + "WorkerDetails": [ + { + "Name": "Faculty, Bill", + "WID": "1b68136df25201c0710e3ddad462fa1d", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df25201c0710e3ddad462fa1d" + }, + { + "Type": "Employee_ID", + "Value": "000000005" + } + ], + "WorkerType": "Employee", + "HuskyCardOverride": null, + "EmploymentStatus": { + "HireDate": "2006-05-16T00:00:00-07:00", + "OriginalHireDate": "2006-05-16T00:00:00-07:00", + "ExpectedFixedTermEndDate": null, + "FirstDayOfWork": "2006-05-16T00:00:00-07:00", + "ActiveStatusDate": "2006-05-16T00:00:00-07:00", + "Active": true, + "EmployeeStatus": "Active", + "Terminated": false, + "TerminationDate": null, + "TerminationInvoluntary": null, + "TerminationReason": null, + "Retired": false, + "RetirementDate": null, + "RetirementApplicationDate": null, + "DisplayLeave": false, + "LeaveStatusDetails": [] + }, + "EmploymentDetails": [ + { + "Position": { + "Name": "PN-0054525 CLINICAL ASSOCIATE PROFESSOR, Family Medicine JM Academic - Faculty, Bill", + "WID": "1b68136df2520192c53b3ddad462ff1d", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df2520192c53b3ddad462ff1d" + }, + { + "Type": "Position_ID", + "Value": "PN-0054525" + } + ], + "Href": "/hrp/v3/position/1b68136df2520192c53b3ddad462ff1d.json" + }, + "PositionRestriction": null, + "PrimaryPosition": true, + "BusinessTitle": "Clinical Associate Professor", + "PositionTitle": "CLINICAL ASSOCIATE PROFESSOR, Family Medicine JM Academic", + "EffectiveDate": "2019-05-01T00:00:00-07:00", + "StartDate": "2012-07-01T00:00:00-07:00", + "PositionVacateDate": null, + "ExpectedFixedTermEndDate": null, + "PositionWorkerType": { + "Name": "Unpaid Academic", + "WID": "d957207a306801cf268cd2d86a5c8415", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801cf268cd2d86a5c8415" + }, + { + "Type": "Employee_Type_ID", + "Value": "Unpaid_Academic" + } + ] + }, + "FTEPercent": 0.0, + "PayRateType": { + "Name": "N/A", + "WID": "d957207a306801e0ff0dbb026d5cda1d", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0ff0dbb026d5cda1d" + }, + { + "Type": "Pay_Rate_Type_ID", + "Value": "N/A" + } + ] + }, + "WorkShift": { + "Name": "First Shift (United States of America)", + "WID": "d957207a306801ac611a09fe6e5c7432", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801ac611a09fe6e5c7432" + }, + { + "Type": "Work_Shift_ID", + "Value": "First Shift" + } + ] + }, + "TotalPayAnnualizedAmount": 0.0, + "TimeType": { + "Name": "Part time", + "WID": "afa35b88537f015bd4e4faafb6574800", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f015bd4e4faafb6574800" + }, + { + "Type": "Position_Time_Type_ID", + "Value": "Part_time" + } + ] + }, + "CompensationStep": null, + "TotalBasePayAmount": 0.0, + "TotalBasePayFrequency": { + "Name": "Monthly", + "WID": "afa35b88537f01c22b33fbafb6574c00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f01c22b33fbafb6574c00" + }, + { + "Type": "Frequency_ID", + "Value": "Monthly" + } + ] + }, + "TotalBasePayAnnualizedAmount": 0.0, + "JobProfile": { + "Name": "Unpaid Academic", + "WID": "d957207a306801fc5c30a8906f5c6b57", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fc5c30a8906f5c6b57" + }, + { + "Type": "Job_Profile_ID", + "Value": "21184" + } + ], + "Href": "/hrp/v3/jobprofile/d957207a306801fc5c30a8906f5c6b57.json" + }, + "JobClassificationSummaries": [ + { + "JobClassification": { + "Name": "F - Academic Personnel (Employment Program)", + "WID": "d957207a306801cd215e34e46d5c5122", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801cd215e34e46d5c5122" + }, + { + "Type": "Job_Classification_Reference_ID", + "Value": "ECS_F" + } + ], + "Href": "/hrp/v3/jobclassification/d957207a306801cd215e34e46d5c5122.json" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "d957207a30680132aa0534e46d5c4d22", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680132aa0534e46d5c4d22" + }, + { + "Type": "Job_Classification_Group_ID", + "Value": "ECS" + } + ], + "Href": "/hrp/v3/jobclassificationgroup/d957207a30680132aa0534e46d5c4d22.json" + } + } + ], + "Location": { + "Name": "Seattle Campus", + "WID": "d957207a306801c93acc30b96e5cae30", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801c93acc30b96e5cae30" + }, + { + "Type": "Location_ID", + "Value": "Seattle Campus" + } + ], + "Href": "/financial/v2/location/d957207a306801c93acc30b96e5cae30.json" + }, + "OrganizationDetails": [ + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "356390", + "WID": "d957207a3068012bc9cdc42f6f5c7239", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068012bc9cdc42f6f5c7239" + }, + { + "Type": "Organization_Reference_ID", + "Value": "356390" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "356390" + } + ] + } + }, + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "681925 WORKDAY DEFAULT DEPTBG", + "WID": "cea06499724601a5b9617be66daec594", + "IDs": [ + { + "Type": "WID", + "Value": "cea06499724601a5b9617be66daec594" + }, + { + "Type": "Organization_Reference_ID", + "Value": "681925" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "681925" + } + ] + } + }, + { + "Type": { + "Name": "Academic Job Families Org type", + "WID": "9a03a28c5baf01383f79bdc89a452b1f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf01383f79bdc89a452b1f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Academic_Job_Families_Org_type" + } + ] + }, + "Organization": { + "Name": "Academic Job Families Custom Org", + "WID": "9a03a28c5baf018f36d4da049b45f61f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf018f36d4da049b45f61f" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ] + } + } + ], + "JobScheduledWeeklyHours": 0.0, + "JobDefaultWeeklyHours": 40.0, + "JobFamilySummaries": [ + { + "JobFamily": { + "Name": "01 - Academic Personnel - Faculty - Annual or Shorter", + "WID": "d957207a30680108b5d6280d6e5cd82e", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680108b5d6280d6e5cd82e" + }, + { + "Type": "Job_Family_ID", + "Value": "Faculty - Annual or Shorter" + } + ], + "Href": "/hrp/v3/jobfamily/d957207a30680108b5d6280d6e5cd82e.json" + }, + "JobFamilyGroup": { + "Name": "01 - Academic Personnel", + "WID": "d957207a306801b8081ab3e36e5c4b32", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801b8081ab3e36e5c4b32" + }, + { + "Type": "Job_Family_ID", + "Value": "01 - Academic Personnel" + } + ], + "Href": "/hrp/v3/jobfamilygroup/d957207a306801b8081ab3e36e5c4b32.json" + } + } + ], + "JobCategory": { + "Name": "Faculty", + "WID": "d957207a30680180eba3f5266e5c482f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a30680180eba3f5266e5c482f" + }, + { + "Type": "Job_Category_ID", + "Value": "Faculty" + } + ], + "Href": "/hrp/v3/jobcategory/d957207a30680180eba3f5266e5c482f.json" + }, + "CompensationMostRecentChangeDate": "2021-03-16T00:00:00-07:00", + "Managers": [ + { + "Name": "Joj, Pop", + "WID": "1b68136df25201eb472087dad162bca4", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df25201eb472087dad162bca4" + }, + { + "Type": "Employee_ID", + "Value": "845007271" + } + ], + "Href": "/hrp/v3/person/845007271.json" + } + ], + "IsManager": false, + "ProbationEndDate": null, + "SupervisoryOrganization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ], + "Href": "/hrp/v3/supervisoryorganization/751e82d2c30301b7f5dc547e053971d4.json" + }, + "WorkerCompensationPlanAssignment": { + "Href": "/hrp/v3/workercompensationplanassignment/1b68136df25201c0710e3ddad462fa1d.json" + }, + "WorkerPeriodActivityPayAssignment": { + "Href": "/hrp/v3/workerperiodactivitypayassignment/1b68136df25201c0710e3ddad462fa1d.json" + }, + "WorkerPayrollCostingAllocation": { + "Href": "/hrp/v3/workerpayrollcostingallocation/1b68136df25201c0710e3ddad462fa1d.json" + } + } + ], + "OrganizationDetails": [ + { + "Type": { + "Name": "Service Period", + "WID": "d957207a3068013093c007746e5c6c2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068013093c007746e5c6c2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Service_Period" + } + ] + }, + "Organization": { + "Name": "12", + "WID": "d957207a306801e0c42f59276f5c6133", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801e0c42f59276f5c6133" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Service_Period_12.00" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Service_Period_12.00" + } + ] + } + }, + { + "Type": { + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068011013570a746e5c6d2f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Campus_Mailbox" + } + ] + }, + "Organization": { + "Name": "356390", + "WID": "d957207a3068012bc9cdc42f6f5c7239", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068012bc9cdc42f6f5c7239" + }, + { + "Type": "Organization_Reference_ID", + "Value": "356390" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "356390" + } + ] + } + }, + { + "Type": { + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f0176f922f9afb6573000" + }, + { + "Type": "Organization_Type_ID", + "Value": "COST_CENTER" + } + ] + }, + "Organization": { + "Name": "681925 WORKDAY DEFAULT DEPTBG", + "WID": "cea06499724601a5b9617be66daec594", + "IDs": [ + { + "Type": "WID", + "Value": "cea06499724601a5b9617be66daec594" + }, + { + "Type": "Organization_Reference_ID", + "Value": "681925" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "681925" + } + ] + } + }, + { + "Type": { + "Name": "Academic Job Families Org type", + "WID": "9a03a28c5baf01383f79bdc89a452b1f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf01383f79bdc89a452b1f" + }, + { + "Type": "Organization_Type_ID", + "Value": "Academic_Job_Families_Org_type" + } + ] + }, + "Organization": { + "Name": "Academic Job Families Custom Org", + "WID": "9a03a28c5baf018f36d4da049b45f61f", + "IDs": [ + { + "Type": "WID", + "Value": "9a03a28c5baf018f36d4da049b45f61f" + }, + { + "Type": "Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + }, + { + "Type": "Custom_Organization_Reference_ID", + "Value": "Academic_Job_Families_Custom_Org" + } + ] + } + }, + { + "Type": { + "Name": "Supervisory", + "WID": "afa35b88537f014fa5e2f8afb6572d00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f014fa5e2f8afb6572d00" + }, + { + "Type": "Organization_Type_ID", + "Value": "SUPERVISORY" + } + ] + }, + "Organization": { + "Name": "SOM: Family Medicine: King Pierce JM Academic (... (Inherited))", + "WID": "751e82d2c30301b7f5dc547e053971d4", + "IDs": [ + { + "Type": "WID", + "Value": "751e82d2c30301b7f5dc547e053971d4" + }, + { + "Type": "Organization_Reference_ID", + "Value": "SOM_002422_JM_Academic" + } + ] + } + } + ], + "PersonalData": { + "LegalName": null, + "DateOfBirth": null, + "USCitizenshipStatuses": [], + "IsHispanicOrLatino": null, + "FederalReportingEthnicityCode": null, + "Gender": null, + "DisabilityStatusDetails": [], + "SelfIdentificationOfDisability": { + "SelfIdentificationOfDisabilityStatus": null, + "SelfIdentificationID": null + }, + "MaritalStatus": null, + "Ethnicities": [], + "MilitaryStatuses": [], + "Contact": { + "Addresses": [ + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-49", + "WID": "d957207a306801b535f630b96e5cb130", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801b535f630b96e5cb130" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-49" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "Seattle Main Campus" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195", + "FormattedAddress": "Seattle Main Campus Seattle, WA 98195 United States of America", + "EffectiveDate": "1900-01-01T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + }, + { + "Address": { + "Name": "ADDRESS_REFERENCE-6-66240", + "WID": "1b68136df2520154fe79253bea62db45", + "IDs": [ + { + "Type": "WID", + "Value": "1b68136df2520154fe79253bea62db45" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-6-66240" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "1705 NE Pacific St" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Seattle", + "PostalCode": "98195-0000", + "FormattedAddress": "1705 NE Pacific St Seattle, WA 98195-0000 United States of America", + "EffectiveDate": "2006-05-16T00:00:00-07:00", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ], + "SubRegions": [] + }, + { + "Address": { + "Name": "ADDRESS_REFERENCE-3-291668", + "WID": "2689c126632a010c7dc1085d7a26a559", + "IDs": [ + { + "Type": "WID", + "Value": "2689c126632a010c7dc1085d7a26a559" + }, + { + "Type": "Address_ID", + "Value": "ADDRESS_REFERENCE-3-291668" + } + ] + }, + "Lines": [ + { + "Name": "Address Line 1", + "Type": "ADDRESS_LINE_1", + "Value": "PO Box 5299" + }, + { + "Name": "Address Line 2", + "Type": "ADDRESS_LINE_2", + "Value": "MS: 820-2-MMA" + } + ], + "Country": { + "Name": "United States of America", + "WID": "bc33aa3152ec42d4995f4791a106ed09", + "IDs": [ + { + "Type": "WID", + "Value": "bc33aa3152ec42d4995f4791a106ed09" + }, + { + "Type": "ISO_3166-1_Alpha-2_Code", + "Value": "US" + }, + { + "Type": "ISO_3166-1_Alpha-3_Code", + "Value": "USA" + }, + { + "Type": "ISO_3166-1_Numeric-3_Code", + "Value": "840" + } + ] + }, + "Region": { + "Name": "Washington", + "WID": "de9b48948ef8421db97ddf4ea206e931", + "IDs": [ + { + "Type": "WID", + "Value": "de9b48948ef8421db97ddf4ea206e931" + }, + { + "Type": "Country_Region_ID", + "Value": "USA-WA" + }, + { + "Type": "ISO_3166-2_Code", + "Value": "WA" + } + ] + }, + "Municipality": "Tacoma", + "PostalCode": "98415", + "FormattedAddress": "PO Box 5299 MS: 820-2-MMA Tacoma, WA 98415 United States of America", + "EffectiveDate": "2020-11-20T00:00:00-08:00", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [ + { + "Name": "Other - Work", + "WID": "75ec2b2be753100003ffdf552f790001", + "IDs": [ + { + "Type": "WID", + "Value": "75ec2b2be753100003ffdf552f790001" + }, + { + "Type": "Communication_Usage_Behavior_ID", + "Value": "OTHER_WORK" + } + ] + } + ], + "UsesForTenanted": [ + { + "Name": "Other - Work", + "WID": "d957207a306801fda80c72d2665c4613", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fda80c72d2665c4613" + }, + { + "Type": "Communication_Usage_Behavior_Tenanted_ID", + "Value": "Other - Work" + } + ] + }, + { + "Name": "Alternate- Work", + "WID": "d957207a3068015d5d0296d2665c5413", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068015d5d0296d2665c5413" + }, + { + "Type": "Communication_Usage_Behavior_Tenanted_ID", + "Value": "Alternate - Work" + } + ] + } + ], + "Public": true + } + ], + "SubRegions": [ + { + "Name": "County", + "Type": "REGION_SUBDIVISION_1", + "Value": "Pierce" + } + ] + } + ], + "Emails": [ + { + "Email": { + "Name": "EMAIL_REFERENCE-3-37977", + "WID": "29cae45a91d0016cb2e3b35d604c1eec", + "IDs": [ + { + "Type": "WID", + "Value": "29cae45a91d0016cb2e3b35d604c1eec" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-37977" + } + ] + }, + "EmailAddress": "faculty@uw.edu", + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + }, + { + "Email": { + "Name": "EMAIL_REFERENCE-3-2071042", + "WID": "2689c126632a0181bd2dddcb7926f055", + "IDs": [ + { + "Type": "WID", + "Value": "2689c126632a0181bd2dddcb7926f055" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-2071042" + } + ] + }, + "EmailAddress": "bill.faculty@m.org", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "Phones": [ + { + "Phone": { + "Name": "PHONE_REFERENCE-3-15546", + "WID": "1074ee40fe4c011dc25cab690a888f49", + "IDs": [ + { + "Type": "WID", + "Value": "1074ee40fe4c011dc25cab690a888f49" + }, + { + "Type": "Phone_ID", + "Value": "PHONE_REFERENCE-3-15546" + } + ] + }, + "CountryISOCode": "USA", + "InternationalPhoneCode": "1", + "PhoneNumber": "", + "FormattedPhoneNumber": "", + "DeviceType": { + "Name": "Mobile", + "WID": "d957207a3068014f9b80c9cc665c3713", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a3068014f9b80c9cc665c3713" + }, + { + "Type": "Phone_Device_Type_ID", + "Value": "Mobile" + } + ] + }, + "Usages": [ + { + "Types": [ + { + "Primary": true, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + }, + { + "Phone": { + "Name": "PHONE_REFERENCE-3-93711", + "WID": "1074ee40fe4c01434614e8551188d78a", + "IDs": [ + { + "Type": "WID", + "Value": "1074ee40fe4c01434614e8551188d78a" + }, + { + "Type": "Phone_ID", + "Value": "PHONE_REFERENCE-3-93711" + } + ] + }, + "CountryISOCode": "USA", + "InternationalPhoneCode": "1", + "PhoneNumber": "", + "FormattedPhoneNumber": "", + "DeviceType": { + "Name": "Telephone", + "WID": "d957207a306801bfcadadacc665c3913", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801bfcadadacc665c3913" + }, + { + "Type": "Phone_Device_Type_ID", + "Value": "Telephone" + } + ] + }, + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + } + ], + "CampusMailbox": "" + }, + "CustomIDs": [] + }, + "ActiveAppointment": true, + "CurrentFaculty": true, + "PostdocAnniversaryDate": null, + "TeleworkParticipation": null, + "FutureRecord": false + } + ] +} diff --git a/uw_hrp/tests/test_models.py b/uw_hrp/tests/test_models.py index a715ab1..825e3ab 100644 --- a/uw_hrp/tests/test_models.py +++ b/uw_hrp/tests/test_models.py @@ -2,376 +2,371 @@ # SPDX-License-Identifier: Apache-2.0 from unittest import TestCase -from datetime import datetime, timedelta, timezone from uw_hrp.models import ( EmploymentStatus, JobProfile, SupervisoryOrganization, - Worker, WorkerPosition, parse_date, WorkerRef) + EmploymentDetails, WorkerDetails, Person, parse_date, + get_emp_program_job_class, get_org_code_name) from uw_hrp.util import fdao_hrp_override @fdao_hrp_override -class WorkerTest(TestCase): +class ModelsTest(TestCase): def test_parse_date(self): self.assertIsNotNone(parse_date("2017-09-16T07:00:00.000Z")) + def test_get_emp_program_job_class(self): + data = [{ + "JobClassification": { + "Name": "S - Stipend (Employment Program)", + "WID": "" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "" + } + }] + self.assertEqual(get_emp_program_job_class(data), 'Stipend') + + def test_get_org_code_name(self): + data = "CAS: Chemistry: Theberge JM Student ()" + code, name = get_org_code_name(data) + self.assertEqual(code, "CAS") + self.assertEqual(name, "Chemistry: Theberge JM Student") + def test_employment_status(self): - emp_status = EmploymentStatus(status="Active", - status_code='A') - self.assertIsNotNone(str(emp_status)) + emp_status0 = EmploymentStatus(status="Active", is_active=True) + self.assertIsNotNone(emp_status0) + self.assertEqual( + emp_status0.to_json(), + { + 'hire_date': None, + 'is_active': True, + 'is_retired': False, + 'is_terminated': False, + 'retirement_date': None, + 'status': 'Active', + 'termination_date': None + }) emp_status = EmploymentStatus( data={ - "HireDate": "2016-03-01T08:00:00.000Z", - "OriginalHireDate": "1982-12-31T08:00:00.000Z", - "EndEmploymentDate": "2019-05-30T07:00:00.000Z", - "FirstDayOfWork": "2016-03-01T08:00:00.000Z", - "ActiveStatusDate": "2016-03-01T08:00:00.000Z", - "IsActive": True, + "HireDate": "2006-05-16T00:00:00-07:00", + "OriginalHireDate": "2006-05-16T00:00:00-07:00", + "ExpectedFixedTermEndDate": None, + "FirstDayOfWork": "2006-05-16T00:00:00-07:00", + "ActiveStatusDate": "2006-05-16T00:00:00-07:00", + "Active": True, "EmployeeStatus": "Active", - "EmployeeStatusCode": "A", - "IsTerminated": False, + "Terminated": False, "TerminationDate": None, - "IsRetired": False, + "TerminationInvoluntary": None, + "TerminationReason": None, + "Retired": False, "RetirementDate": None, - "EstimatedLastDayOfLeave": None, - "FirstDayOfLeave": None, - "LastDayOfWorkForLeave": None}) - self.assertIsNotNone(str(emp_status)) - self.assertFalse(emp_status.is_terminated) - self.assertFalse(emp_status.is_active_employment()) + "RetirementApplicationDate": None, + "DisplayLeave": False, + "LeaveStatusDetails": [] + }) + + self.assertTrue(emp_status.is_active) self.assertEqual( emp_status.to_json(), - {'end_emp_date': '2019-05-30 07:00:00+00:00', - 'hire_date': '2016-03-01 08:00:00+00:00', - 'is_active': True, - 'is_retired': False, - 'is_terminated': False, - 'retirement_date': None, - 'status': 'Active', - 'status_code': 'A', - 'termination_date': None}) + { + 'hire_date': '2006-05-16 00:00:00-07:00', + 'is_active': True, + 'is_retired': False, + 'is_terminated': False, + 'retirement_date': None, + 'status': 'Active', + 'termination_date': None + }) + self.assertIsNotNone(str(emp_status)) def test_job_profile(self): job_prof = JobProfile(job_code="1", description="A") + self.assertIsNotNone(job_prof) + job_prof = JobProfile( + data={ + "Name": "Unpaid Academic", + "WID": "d957207a306801fc5c30a8906f5c6b57", + "IDs": [ + { + "Type": "WID", + "Value": "d957207a306801fc5c30a8906f5c6b57" + }, + { + "Type": "Job_Profile_ID", + "Value": "21184" + } + ] + } + ) + self.assertEqual( + job_prof.to_json(), + { + 'job_code': '21184', 'description': 'Unpaid Academic' + } + ) self.assertIsNotNone(str(job_prof)) def test_supervisory_organization(self): super_org = SupervisoryOrganization( - budget_code="3010105000", - org_code="HSA:", + org_code="HSA", org_name="EHS: Occl Health - Acc Prevention") + self.assertIsNotNone(super_org) + super_org = SupervisoryOrganization( + data={ + "Name": "SOM: Family Medicine: King Academic (... ())", + } + ) + self.assertEqual( + super_org.to_json(), + { + 'budget_code': '', + 'org_code': 'SOM', + 'org_name': 'Family Medicine: King Academic' + } + ) self.assertIsNotNone(str(super_org)) - def test_worker_position(self): - # self.maxDiff = None - pos = WorkerPosition() - self.assertIsNotNone(str(pos)) - data = { - "PositionBusinessTitle": "Program Operations Specialist (E S 8)", - "PositionSupervisor": { - "EmployeeID": "000000005", - "Href": "/hrp/v2/worker/000000005.json"}, - "PositionTimeTypeID": "Full_time", - "PositionTitle": "Operations Specialist (E S 8)", - "SupervisoryOrganization": { - "AcademicUnitID": None, - "Code": "HSA: ", - "ID": "HSA_000204", - "Name": "EHS: Occl Health - Acc Prevention", - "Description": "HSA: ENV Health & Safety: ...", - "Href": "/hrp/v2/organization/HSA_000204.json", - "CostCenter": { - "Description": "ENV HEALTH & SAFETY", - "ID": "015020", - "OrganizationCode": "3010105000", - "OrganizationDescription": "ENV HEALTH & SAFETY"}}, - "PositionID": "PN-0025953", - "PositionEffectiveDate": "1994-10-01T07:00:00.000Z", - "IsPrimaryPosition": True, - "PositionStartDate": "1994-10-01T00:00:00.000Z", - "PositionEndDate": "1997-10-01T00:00:00.000Z", - "PositionType": "Regular", - "PositionFTEPercent": "100.00000", - "PayRateType": "Salary", - "TotalBasePayAmount": "6066.00000", - "TotalBasePayFrequency": "Monthly", - "WorkShift": "First Shift", - "ServicePeriodID": "12", - "ServicePeriodDescription": "Service_Period_12.00", - "JobProfileSummary": { - "JobProfileDescription": "Operations Specialist (E S 8)", - "JobProfileID": "11541", - "Href": "/hrp/v2/jobProfile/11541.json", - "JobCategory": "Professional Staff & Librarians", - "JobFamilies": [ - {"JobFamilyName": "01 - Staff - Professional Staff", - "JobFamilyID": "Professional", - "JobFamilySummary": None}]}, - "CostCenter": { - "Description": "ENV HEALTH & SAFETY", - "ID": "015020", - "OrganizationCode": "3010105000", - "OrganizationDescription": "ENV HEALTH & SAFETY"}, - "EcsJobClassificationCode": "E", - "EcsJobClassificationCodeDescription": "Professional Staff", - "ObjectCode": "01", - "SubObjectCode": "70", - "PayrollUnitCode": "00702", - "IsOnLeaveFromPosition": False, - "IsFutureDate": False, - "IsMedicalCenterPosition": False, - "PlannedDistributions": { - "PlannedCompensationAllocations": [], - "PeriodActivityAssignments": []}, - "Location": {"ID": "Seattle Campus", - "Name": "Seattle Campus"}, - "FutureTransactions": []} + def test_employment_details(self): + emp_details = EmploymentDetails() + self.assertIsNotNone(emp_details) + emp_details = EmploymentDetails( + data={ + "PrimaryPosition": True, + "BusinessTitle": "Clinical Associate Professor", + "JobScheduledWeeklyHours": 20.0, + "StartDate": "2012-07-01T00:00:00-07:00", + "PositionVacateDate": None, + "JobProfile": { + "Name": "Unpaid Academic", + }, + "PositionWorkerType": { + "Name": "Unpaid Academic", + }, + "JobClassificationSummaries": [ + { + "JobClassification": { + "Name": "F - Academic Personnel (Employment)" + }, + "JobClassificationGroup": { + "Name": "Employment Program" + } + } + ], + "Location": { + "Name": "Seattle Campus", + }, + "Managers": [ + { + "Name": "Joj, Pop", + "WID": "", + "IDs": [ + { + "Type": "Employee_ID", + "Value": "123456789", + } + ], + } + ], + "SupervisoryOrganization": { + "Name": "SOM: Family Medicine (... (Inherited))", + } + } + ) + self.maxDiff = None + self.assertEqual( + emp_details.to_json(), + { + 'end_date': None, + 'is_primary': True, + 'job_class': 'Academic Personnel', + 'job_title': 'Clinical Associate Professor', + 'job_profile': { + 'description': 'Unpaid Academic', + 'job_code': None + }, + 'location': 'Seattle Campus', + 'org_unit_code': '', + 'pos_type': 'Unpaid Academic', + 'start_date': '2012-07-01 00:00:00-07:00', + 'supervisor_eid': '123456789', + 'supervisory_org': { + 'budget_code': '', + 'org_code': 'SOM', + 'org_name': 'Family Medicine' + } + } + ) + self.assertIsNotNone(str(emp_details)) - work_position = WorkerPosition(data=data) + def test_wwoker_details(self): + pos = WorkerDetails(worker_wid="1b68136df25201c0710e3ddad462fa1d") + self.assertIsNotNone(pos) + self.assertEqual( + pos.to_json(), + { + 'active_positions': [], + 'employee_status': None, + 'primary_job_title': None, + 'primary_manager_id': None, + 'worker_wid': '1b68136df25201c0710e3ddad462fa1d' + } + ) + + work_position = WorkerDetails( + data={ + "WID": "1b68136df25201c0710e3ddad462fa1d", + "EmploymentStatus": { + "HireDate": "2022-06-13T00:00:00-07:00", + "OriginalHireDate": "2022-06-13T00:00:00-07:00", + "ExpectedFixedTermEndDate": None, + "FirstDayOfWork": "2022-06-13T00:00:00-07:00", + "ActiveStatusDate": "2022-07-16T00:00:00-07:00", + "Active": False, + "EmployeeStatus": "Terminated", + "Terminated": True, + "TerminationDate": "2022-07-15T00:00:00-07:00", + "TerminationInvoluntary": None, + "TerminationReason": None, + "Retired": False, + "RetirementDate": None, + "RetirementApplicationDate": None, + "DisplayLeave": False, + "LeaveStatusDetails": [] + }, + } + ) self.assertEqual( work_position.to_json(), { - "start_date": "1994-10-01 00:00:00+00:00", - "end_date": "1997-10-01 00:00:00+00:00", - "ecs_job_cla_code_desc": "Professional Staff", - "fte_percent": 100.0, - 'is_future_date': False, - "is_primary": True, - "location": "Seattle Campus", - "payroll_unit_code": "00702", - "pos_type": "Regular", - "pos_time_type_id": "Full_time", - "title": "Program Operations Specialist (E S 8)", - "supervisor_eid": "000000005", - "job_profile": { - "job_code": "11541", - "description": "Operations Specialist (E S 8)"}, - "supervisory_org": { - "budget_code": "3010105000", - "org_code": "HSA:", - "org_name": "EHS: Occl Health - Acc Prevention"}}) - self.assertFalse(work_position.is_active_position()) + 'worker_wid': "1b68136df25201c0710e3ddad462fa1d", + 'primary_job_title': None, + 'primary_manager_id': None, + 'employee_status': { + 'hire_date': '2022-06-13 00:00:00-07:00', + 'is_active': False, + 'is_retired': False, + 'is_terminated': True, + 'retirement_date': None, + 'status': 'Terminated', + 'termination_date': '2022-07-15 00:00:00-07:00', + }, + 'active_positions': [], + } + ) self.assertIsNotNone(str(work_position)) - work_position = WorkerPosition( - data={"PositionStartDate": "1994-10-01T00:00:00.000Z", - "PositionEndDate": str(datetime.now(timezone.utc) + - timedelta(minutes=1)), - "IsFutureDate": False, - "PositionFTEPercent": "100.00000"}) - self.assertTrue(work_position.is_active_position()) - self.assertFalse(work_position.is_future_date) - - work_position = WorkerPosition( - data={"PositionStartDate": str(datetime.now(timezone.utc) + - timedelta(minutes=1)), - "IsFutureDate": True, - "PositionEndDate": None, - "PositionFTEPercent": "100.00000"}) - self.assertTrue(work_position.is_future_date) - self.assertTrue(work_position.is_active_position()) - - work_position = WorkerPosition( - data={"PositionStartDate": None, - "IsFutureDate": False, - "PositionEndDate": None, - "PositionFTEPercent": "0.00000"}) - self.assertIsNotNone(work_position) - def test_worker(self): - worker = Worker(netid='none', + worker = Person(netid='none', regid="10000000", employee_id="100000115") - self.assertIsNotNone(str(worker)) + self.assertIsNotNone(worker) data = { - "NetID": "webmaster", - "RegID": "10000000000000000000000000000115", - "EmployeeID": "100000115", - "WorkerEmploymentStatus": { - "ActiveStatusDate": "1980-07-01T07:00:00.000Z", - "EmployeeStatus": "Active", - "EmployeeStatusCode": "A", - "EndEmploymentDate": None, - "EstimatedLastDayOfLeave": None, - "FirstDayOfLeave": None, - "FirstDayOfWork": "1980-07-01T07:00:00.000Z", - "HireDate": "1980-07-01T07:00:00.000Z", - "IsActive": True, - "IsRetired": False, - "IsTerminated": False, - "LastDayOfWorkForLeave": None, - "OriginalHireDate": "1980-07-01T07:00:00.000Z", - "RetirementDate": None, - "TerminationDate": None}, - "WorkerPositions": [{ - "PositionBusinessTitle": "Web Support Specialist", - "PositionSupervisor": { - "EmployeeID": "000000005", - "Href": "/hrp/v2/worker/000000005.json"}, - "PositionTimeTypeID": "Full_time", - "PositionTitle": "COM SUP ANA 2, Web and Social Media", - "SupervisoryOrganization": { - "AcademicUnitID": None, - "Code": "UWB: ", - "ID": "UWB_000066", - "Name": "Web and Social Media", - "Description": "UWB: Web and Social Media ()", - "Href": "/hrp/v2/organization/UWB_000066.json", - "CostCenter": { - "Description": "ADV & EXT RELATIONS -B", - "ID": "060304", - "OrganizationCode": "5014010000", - "OrganizationDescription": "BR-B OFFICE OF ADV"}}, - "PositionID": "PN-0036224", - "PositionEffectiveDate": "2015-12-21T08:00:00.000Z", - "IsPrimaryPosition": True, - "PositionStartDate": "2015-12-21T00:00:00.000Z", - "PositionEndDate": None, - "PositionType": "Regular", - "PositionFTEPercent": "100.00000", - "PayRateType": "Salary", - "TotalBasePayFrequency": "Monthly", - "WorkShift": "First Shift", - "ServicePeriodID": "12", - "ServicePeriodDescription": "Service_Period_12.00", - "JobProfileSummary": {}, - "CostCenter": { - "Description": "ADV & EXT RELATIONS -B", - "ID": "060304", - "OrganizationCode": "5014010000", - "OrganizationDescription": "BR-B OFFICE OF ADV"}, - "EcsJobClassificationCode": "B", - "EcsJobClassificationCodeDescription": "Classified Staff", - "ObjectCode": "01", - "SubObjectCode": "60", - "PayrollUnitCode": "00356", - "IsOnLeaveFromPosition": False, - "IsFutureDate": False, - "IsMedicalCenterPosition": False, - "Location": {"ID": "Bothell Campus", - "Name": "Bothell Campus"}, - "FutureTransactions": []}, - {"CostCenter": { - "Description": "INFORMATION SCHOOL", - "ID": "061630", - "OrganizationCode": "2670001000", - "OrganizationDescription": "THE INFORMATION SCHOOL"}, - "EcsJobClassificationCode": "U", - "EcsJobClassificationCodeDescription": "Undergrad Student", - "FutureTransactions": [], - "IsFutureDate": False, - "IsMedicalCenterPosition": False, - "IsOnLeaveFromPosition": False, - "IsPrimaryPosition": False, - "JobProfileSummary": { - "Href": "/hrp/v2/jobProfile/10886.json", - "JobCategory": "Hourly and Other", - "JobFamilies": [], - "JobProfileDescription": "Reader/Grader (NE H UAW ASE)", - "JobProfileID": "10886"}, - "Location": {"ID": "Seattle Campus", - "Name": "Seattle Campus"}, - "ObjectCode": "01", - "PayRateType": "Hourly", - "PayrollUnitCode": "00652", - "PlannedDistributions": { - "PeriodActivityAssignments": [], - "PlannedCompensationAllocations": [], - }, - "PositionBusinessTitle": "Reader/Grader", - "PositionEffectiveDate": "2017-09-16T07:00:00.000Z", - "PositionEndDate": None, - "PositionFTEPercent": "10.00000", - "PositionID": "PN-0086428", - "PositionStartDate": "2017-09-16T00:00:00.000Z", - "PositionSupervisor": { - "EmployeeID": "000004000", - "Href": "/hrp/v2/worker/000004000.json"}, - "PositionTimeTypeID": "Part_time", - "PositionTitle": "Reader/Grader", - "PositionType": "Temporary", - "ServicePeriodDescription": "Service_Period_12.00", - "ServicePeriodID": "12", - "SubObjectCode": "80", - "SupervisoryOrganization": None, - "WorkShift": "First Shift"}], - "AcademicAppointments": [], - "SystemMetadata": {"LastModified": None}} - worker = Worker(data=data) - self.assertEqual(worker.netid, 'webmaster') - self.assertEqual(worker.employee_id, '100000115') - self.assertEqual(worker.primary_manager_id, '000000005') + "Name": "Bill Faculty", + "EmployeeID": "000000005", + "RegID": "10000000000000000000000000000005", + "IDs": [ + { + "Type": "NetID", + "Value": "bill" + }, + { + "Type": "StudentID", + "Value": "1000005" + }, + { + "Type": "PriorRegID", + "Value": "10000000000000000000000000000001" + } + ], + "WorkerDetails": [ + { + "WID": "1b68136df25201c0710e3ddad462fa1d", + "EmploymentStatus": { + "HireDate": "2021-11-12T00:00:00-08:00", + "OriginalHireDate": "2021-11-12T00:00:00-08:00", + "ExpectedFixedTermEndDate": None, + "FirstDayOfWork": "2021-11-12T00:00:00-08:00", + "ActiveStatusDate": "2021-11-12T00:00:00-08:00", + "Active": True, + "EmployeeStatus": "Active", + "Terminated": False, + "TerminationDate": None, + "TerminationInvoluntary": None, + "TerminationReason": None, + "Retired": False, + "RetirementDate": None, + "RetirementApplicationDate": None, + "DisplayLeave": False, + "LeaveStatusDetails": [] + }, + "EmploymentDetails": [ + { + "PrimaryPosition": True, + "BusinessTitle": "Student Assistant (NE H)", + "StartDate": "2021-11-12T00:00:00-08:00", + "PositionVacateDate": None, + "JobClassificationSummaries": [], + "SupervisoryOrganization": { + "Name": "CAS: Chemistry: JM student ()", + }, + } + ], + "OrganizationDetails": [], + "ActiveAppointment": True, + } + ] + } + worker = Person(data=data) + self.maxDiff = None self.assertEqual( - worker.primary_position.to_json(), - {'ecs_job_cla_code_desc': 'Classified Staff', - 'end_date': None, - 'fte_percent': 100.0, - 'is_future_date': False, - 'is_primary': True, - 'job_profile': {'description': None, 'job_code': None}, - 'location': 'Bothell Campus', - 'payroll_unit_code': '00356', - 'pos_time_type_id': 'Full_time', - 'pos_type': 'Regular', - 'start_date': '2015-12-21 00:00:00+00:00', - 'supervisor_eid': '000000005', - 'supervisory_org': { - 'budget_code': '5014010000', - 'org_code': 'UWB:', - 'org_name': 'Web and Social Media'}, - 'title': 'Web Support Specialist'}) - self.assertIsNotNone(str(worker.primary_position)) - self.assertEqual(len(worker.other_active_positions), 1) - self.assertIsNotNone(str(worker.employee_status)) - self.assertIsNotNone(str(worker)) - - data = { - "NetID": "webmaster", - "RegID": "10000000000000000000000000000115", - "EmployeeID": "100000115", - "WorkerEmploymentStatus": { - "IsActive": False, - "EmployeeStatus": "Terminated", - "EmployeeStatusCode": "N", - "IsTerminated": True, - "EndEmploymentDate": "2018-07-01T07:00:00.000Z", - "HireDate": "1980-07-01T07:00:00.000Z", - "IsRetired": False, - "RetirementDate": None, - "TerminationDate": None}, - "WorkerPositions": []} - worker = Worker(data=data) - self.assertIsNone(worker.primary_position) - self.assertEqual(len(worker.other_active_positions), 0) - self.assertTrue(worker.employee_status.is_terminated) - self.assertFalse(worker.employee_status.is_active) + worker.to_json(), + { + 'employee_id': '000000005', + 'is_active': True, + 'netid': 'bill', + 'primary_manager_id': None, + 'regid': '10000000000000000000000000000005', + 'student_id': '1000005', + 'worker_details': [ + { + 'active_positions': [ + { + 'is_primary': True, + 'job_class': None, + 'job_profile': {'description': None, + 'job_code': None}, + 'job_title': 'Student Assistant (NE H)', + 'location': None, + 'org_unit_code': '', + 'pos_type': None, + 'end_date': None, + 'start_date': '2021-11-12 ' + '00:00:00-08:00', + 'supervisor_eid': None, + 'supervisory_org': { + 'budget_code': '', + 'org_code': 'CAS', + 'org_name': 'Chemistry: JM student'} + } + ], + 'employee_status': { + 'hire_date': '2021-11-12 00:00:00-08:00', + 'is_active': True, + 'is_retired': False, + 'is_terminated': False, + 'retirement_date': None, + 'status': 'Active', + 'termination_date': None + }, + 'primary_job_title': None, + 'primary_manager_id': None, + 'worker_wid': '1b68136df25201c0710e3ddad462fa1d' + } + ] + }) self.assertIsNotNone(str(worker)) - - def test_workerref(self): - regid = '10000000000000000000000000000005' - wr = WorkerRef(netid="test", regid=regid) - self.assertIsNotNone(wr) - wr = WorkerRef( - data={ - 'Href': '/hrp/v2/worker/{}.json'.format(regid), - 'EmployeeID': '000000005', - 'EmployeeStatus': 'Active', - 'IsActive': True, - 'NetID': 'faculty', - 'RegID': '10000000000000000000000000000005', - 'IsCurrentFaculty': True, - 'WorkdayPersonType': 'Employee'}) - self.assertFalse(wr.is_terminated()) - self.assertEqual( - wr.to_json(), - {'employee_id': '000000005', - 'employee_status': 'Active', - 'is_active': True, - 'is_current_faculty': True, - 'netid': 'faculty', - 'regid': '10000000000000000000000000000005', - 'workday_person_type': 'Employee', - 'href': '/hrp/v2/worker/10000000000000000000000000000005.json'}) - self.assertIsNotNone(str(wr)) diff --git a/uw_hrp/tests/test_person.py b/uw_hrp/tests/test_person.py new file mode 100644 index 0000000..b9a29e2 --- /dev/null +++ b/uw_hrp/tests/test_person.py @@ -0,0 +1,89 @@ +# Copyright 2022 UW-IT, University of Washington +# SPDX-License-Identifier: Apache-2.0 + +from unittest import TestCase +from restclients_core.exceptions import ( + DataFailureException, InvalidEmployeeID, InvalidRegID, InvalidNetID) +from uw_hrp.person import ( + get_person_by_netid, get_person_by_employee_id, get_person_by_regid, + person_search) +from uw_hrp.util import fdao_hrp_override + + +@fdao_hrp_override +class PersonTest(TestCase): + + def test_get_person_by_netid(self): + self.assertRaises(DataFailureException, + get_person_by_netid, + "None") + self.assertRaises(InvalidNetID, + get_person_by_netid, + "") + + person = get_person_by_netid("faculty") + self.assertIsNotNone(person) + self.assertEqual(person.regid, "10000000000000000000000000000005") + self.assertEqual(person.employee_id, "000000005") + self.assertEqual(person.student_id, "1000005") + self.assertTrue(person.is_active) + self.assertEqual(person.primary_manager_id, "845007271") + self.assertEqual(len(person.worker_details), 1) + position = person.worker_details[0] + self.assertEqual(len(position.other_active_positions), 0) + self.maxDiff = None + self.assertEqual( + position.employee_status.to_json(), + { + 'hire_date': '2006-05-16 00:00:00-07:00', + 'is_active': True, + 'is_retired': False, + 'is_terminated': False, + 'retirement_date': None, + 'status': 'Active', + 'termination_date': None + }) + self.assertEqual( + position.primary_position.to_json(), + { + 'end_date': None, + 'is_primary': True, + 'job_class': 'Academic Personnel', + 'job_profile': { + 'description': 'Unpaid Academic', + 'job_code': '21184' + }, + 'job_title': 'Clinical Associate Professor', + 'location': 'Seattle Campus', + 'org_unit_code': '', + 'pos_type': 'Unpaid Academic', + 'start_date': '2012-07-01 00:00:00-07:00', + 'supervisor_eid': '845007271', + 'supervisory_org': { + 'budget_code': '', + 'org_code': 'SOM', + 'org_name': 'Family Medicine: King Pierce JM Academic'} + }) + + person = get_person_by_netid("faculty", include_future=True) + self.assertIsNotNone(person) + + def test_get_person_by_employee_id(self): + person = get_person_by_employee_id("000000005") + self.assertTrue(person.netid, 'faculty') + + self.assertRaises(InvalidEmployeeID, + get_person_by_employee_id, + "") + + def test_get_person_by_regid(self): + person = get_person_by_regid("9136CCB8F66711D5BE060004AC494FFE") + self.assertTrue(person.netid, 'javerage') + + self.assertRaises(InvalidRegID, + get_person_by_regid, "000") + + def test_person_search(self): + pass + # persons = person_search(changed_since_date="2022-12-12") + # self.assertEqual(len(persons), 0) diff --git a/uw_hrp/tests/test_worker.py b/uw_hrp/tests/test_worker.py deleted file mode 100644 index dd1e954..0000000 --- a/uw_hrp/tests/test_worker.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright 2022 UW-IT, University of Washington -# SPDX-License-Identifier: Apache-2.0 - -from unittest import TestCase -from restclients_core.exceptions import ( - DataFailureException, InvalidEmployeeID, InvalidRegID, InvalidNetID) -from uw_hrp.worker import ( - get_worker_by_netid, get_worker_by_employee_id, get_worker_by_regid, - worker_search) -from uw_hrp.util import fdao_hrp_override - - -@fdao_hrp_override -class WorkerTest(TestCase): - - def test_get_worker_by_netid(self): - self.assertRaises(DataFailureException, - get_worker_by_netid, - "None") - self.assertRaises(InvalidNetID, - get_worker_by_netid, - "") - worker = get_worker_by_netid("faculty") - # self.maxDiff = None - self.assertEqual( - worker.to_json(), - {"netid": "faculty", - "regid": "10000000000000000000000000000005", - "employee_id": "000000005", - "employee_status": { - "end_emp_date": None, - "hire_date": "2006-05-16 07:00:00+00:00", - "is_active": True, - "is_retired": False, - "is_terminated": False, - "retirement_date": None, - "status": "Active", - "status_code": "A", - "termination_date": None}, - "primary_manager_id": "100000015", - "active_positions": [{ - "start_date": "2012-07-01 00:00:00+00:00", - "end_date": None, - "ecs_job_cla_code_desc": "Academic Personnel", - 'fte_percent': 0.0, - 'is_future_date': False, - "is_primary": True, - "location": "Seattle Campus", - "payroll_unit_code": "00753", - "pos_type": "Unpaid_Academic", - "pos_time_type_id": "Part_time", - "title": "Clinical Associate Professor", - "supervisor_eid": "100000015", - "job_profile": { - "job_code": "21184", - "description": "Unpaid Academic"}, - "supervisory_org": { - "budget_code": "3040111000", - "org_code": "SOM", - "org_name": "Family Medicine: Volunteer"}}]}) - self.assertIsNotNone(str(worker)) - self.assertEqual( - worker.primary_position.to_json(), - {"start_date": "2012-07-01 00:00:00+00:00", - "end_date": None, - "ecs_job_cla_code_desc": "Academic Personnel", - 'fte_percent': 0.0, - 'is_future_date': False, - "is_primary": True, - "location": "Seattle Campus", - 'payroll_unit_code': '00753', - "pos_type": "Unpaid_Academic", - "pos_time_type_id": "Part_time", - "title": "Clinical Associate Professor", - "supervisor_eid": "100000015", - "job_profile": { - "job_code": "21184", - "description": "Unpaid Academic"}, - "supervisory_org": { - "budget_code": "3040111000", - "org_code": "SOM", - "org_name": "Family Medicine: Volunteer"}}) - self.assertEqual(len(worker.other_active_positions), 0) - - worker = get_worker_by_netid("faculty", current_future=False) - self.assertIsNotNone(worker) - - def test_get_worker_by_employee_id(self): - worker = get_worker_by_employee_id("100000015") - self.assertTrue(worker.netid, 'chair') - - worker = get_worker_by_employee_id("100000015", current_future=False) - self.assertIsNotNone(worker) - - self.assertRaises(InvalidEmployeeID, - get_worker_by_employee_id, - "") - - def test_get_worker_by_regid(self): - worker = get_worker_by_regid("10000000000000000000000000000015") - self.assertTrue(worker.netid, 'chair') - - worker = get_worker_by_regid("10000000000000000000000000000015", - current_future=False) - self.assertIsNotNone(worker) - - self.assertRaises(DataFailureException, - get_worker_by_regid, - "00000000000000000000000000000001") - self.assertRaises(InvalidRegID, - get_worker_by_regid, "000") - - def test_worker_search(self): - worker_refs = worker_search(changed_since=2019) - self.assertEqual(len(worker_refs), 2) - self.assertEqual(worker_refs[0].netid, "faculty") - self.assertTrue(worker_refs[1].is_terminated()) - self.assertEqual(worker_refs[1].netid, "chair") - - none = worker_search(changed_since=2020) - self.assertEqual(len(none), 0) diff --git a/uw_hrp/worker.py b/uw_hrp/worker.py deleted file mode 100644 index 29ea75c..0000000 --- a/uw_hrp/worker.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright 2022 UW-IT, University of Washington -# SPDX-License-Identifier: Apache-2.0 - -""" -This is the interface for interacting with the HRP Web Service. -""" - -from datetime import datetime -import logging -import json -import re -from urllib.parse import urlencode -from restclients_core.exceptions import InvalidRegID, InvalidNetID,\ - InvalidEmployeeID -from uw_hrp import get_resource -from uw_hrp.models import Worker, WorkerRef - - -logger = logging.getLogger(__name__) -re_netid = re.compile(r'^[a-z][a-z0-9\-\_\.]{,127}$', re.I) -re_regid = re.compile(r'^[A-F0-9]{32}$', re.I) -re_employee_id = re.compile(r'^\d{9}$') -URL_PREFIX = "/hrp/v2/worker" -CURRENT_FUTURE_SUFFIX = "workerpositionstate=current,future" - - -def get_worker_by_employee_id(employee_id, current_future=True): - if not valid_employee_id(employee_id): - raise InvalidEmployeeID(employee_id) - return _get_worker(employee_id, current_future) - - -def get_worker_by_netid(netid, current_future=True): - if not valid_uwnetid(netid): - raise InvalidNetID(netid) - return _get_worker(netid, current_future) - - -def get_worker_by_regid(regid, current_future=True): - if not valid_uwregid(regid): - raise InvalidRegID(regid) - return _get_worker(regid, current_future) - - -def _get_worker(id, current_future): - """ - Return a restclients.models.hrp.WorkerPerson object - """ - url = "{0}/{1}.json".format(URL_PREFIX, id) - if current_future: - url = "{0}?{1}".format(url, CURRENT_FUTURE_SUFFIX) - return Worker(data=json.loads(get_resource(url))) - - -def worker_search(**kwargs): - """ - Returns a list of WorkerRef objects - Parameters can be: - legal_first_name_contains: string - legal_first_name_starts_with: string - legal_last_name_contains: string - legal_last_name_starts_with: string - preferred_first_name_contains: string - preferred_first_name_starts_with: string - preferred_last_name_contains: string - preferred_last_name_starts_with: string - is_current_faculty: string - cost_center_id: string - workday_person_type: string - ascii_only: string - location_id: string - changed_since: string - page_start: string (default: 1) - """ - url = "{0}.json?{1}&page_size=200".format(URL_PREFIX, urlencode(kwargs)) - workerefs = [] - while True: - data = json.loads(get_resource(url)) - if len(data["Workers"]) > 0: - for wkr_data in data.get("Workers"): - workerefs.append(WorkerRef(data=wkr_data)) - if data.get("Next") is not None and len(data["Next"]["Href"]) > 0: - url = data["Next"]["Href"] - else: - break - return workerefs - - -def valid_uwnetid(netid): - return (netid is not None and - re_netid.match(str(netid)) is not None) - - -def valid_uwregid(regid): - return (regid is not None and - re_regid.match(str(regid)) is not None) - - -def valid_employee_id(employee_id): - return (employee_id is not None and - re_employee_id.match(str(employee_id)) is not None) From 54c91552bc667e128edf6335970f829bc7cd807e Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Tue, 20 Dec 2022 20:37:16 -0800 Subject: [PATCH 02/12] Fix search (#16) Add budget code. Fix search. --- uw_hrp/models.py | 57 +- uw_hrp/person.py | 3 +- ...hanged_since_date_2022-12-12_page_size_200 | 2 +- .../9136CCB8F66711D5BE060004AC494FFE.json | 540 ++++++++++-------- uw_hrp/tests/test_models.py | 78 ++- uw_hrp/tests/test_person.py | 39 +- 6 files changed, 389 insertions(+), 330 deletions(-) diff --git a/uw_hrp/models.py b/uw_hrp/models.py index 6f8de1f..7cd3a95 100644 --- a/uw_hrp/models.py +++ b/uw_hrp/models.py @@ -1,17 +1,11 @@ # Copyright 2022 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 -from datetime import datetime, timezone from dateutil.parser import parse import json from restclients_core import models -def get_now(): - # return time-zone-aware datetime - return datetime.now(timezone.utc) - - def date_to_str(d_obj): if d_obj is not None: return str(d_obj) @@ -110,36 +104,16 @@ def __str__(self): return json.dumps(self.to_json()) -class SupervisoryOrganization(models.Model): - budget_code = models.CharField(max_length=16, default="") - org_code = models.CharField(max_length=16, default="") - org_name = models.CharField(max_length=128, default="") - - def to_json(self): - return { - 'budget_code': self.budget_code, - 'org_code': self.org_code, - 'org_name': self.org_name - } - - def __init__(self, *args, **kwargs): - data = kwargs.get("data") - if data is None: - return super(SupervisoryOrganization, self).__init__(*args, - **kwargs) - self.org_code, self.org_name = get_org_code_name(data.get("Name")) - - def __str__(self): - return json.dumps(self.to_json()) - - class EmploymentDetails(models.Model): + budget_code = models.CharField(max_length=16, default="") start_date = models.DateTimeField(null=True, default=None) end_date = models.DateTimeField(null=True, default=None) job_class = models.CharField(max_length=128, null=True, default=None) job_title = models.CharField(max_length=128, null=True, default=None) is_primary = models.BooleanField(default=False) location = models.CharField(max_length=96, null=True, default=None) + org_code = models.CharField(max_length=16, default="") + org_name = models.CharField(max_length=128, default="") org_unit_code = models.CharField(max_length=10, default="") pos_type = models.CharField(max_length=64, null=True, default=None) supervisor_eid = models.CharField(max_length=16, @@ -147,22 +121,22 @@ class EmploymentDetails(models.Model): def to_json(self): data = { + 'budget_code': self.budget_code, 'end_date': date_to_str(self.end_date), 'is_primary': self.is_primary, 'job_title': self.title, 'job_class': self.job_class, 'location': self.location, + 'org_code': self.org_code, + 'org_name': self.org_name, 'org_unit_code': self.org_unit_code, 'pos_type': self.pos_type, 'start_date': date_to_str(self.start_date), 'supervisor_eid': self.supervisor_eid, 'job_profile': None, - 'supervisory_org': None } if self.job_profile is not None: data['job_profile'] = self.job_profile.to_json() - if self.supervisory_org is not None: - data['supervisory_org'] = self.supervisory_org.to_json() return data def __str__(self): @@ -191,14 +165,26 @@ def __init__(self, *args, **kwargs): if id_data.get("Type") == "Employee_ID": self.supervisor_eid = id_data.get("Value") + if (data.get("OrganizationDetails") is not None and + len(data["OrganizationDetails"])): + for org_det in data["OrganizationDetails"]: + if (org_det.get("Organization") and + org_det["Organization"].get("Name") and + org_det.get("Type") and + org_det["Type"].get("Name") == "Cost Center"): + self.budget_code = org_det["Organization"]["Name"] + if data.get("PositionWorkerType") is not None: self.pos_type = data["PositionWorkerType"].get("Name") self.is_primary = data.get("PrimaryPosition") self.end_date = parse_date(data.get("PositionVacateDate")) self.start_date = parse_date(data.get("StartDate")) - self.supervisory_org = SupervisoryOrganization( - data=data.get("SupervisoryOrganization")) + + if (data.get("SupervisoryOrganization") and + data["SupervisoryOrganization"].get("Name")): + self.org_code, self.org_name = get_org_code_name( + data["SupervisoryOrganization"]["Name"]) class WorkerDetails(models.Model): @@ -303,9 +289,6 @@ def __init__(self, *args, **kwargs): self.student_id = id.get("Value") for wk_detail in data.get("WorkerDetails"): - if wk_detail.get("ActiveAppointment") is False: - continue - worker_obj = WorkerDetails(data=wk_detail) if (worker_obj and worker_obj.employee_status and worker_obj.employee_status.is_active): diff --git a/uw_hrp/person.py b/uw_hrp/person.py index 515485e..4d24262 100644 --- a/uw_hrp/person.py +++ b/uw_hrp/person.py @@ -72,7 +72,8 @@ def person_search(**kwargs): if "Persons" in data: for person_record in data.get("Persons"): persons.append(Person(data=person_record)) - if "Next" in data and len(data["Next"].get("Href")) > 0: + if (data.get("Next") and data["Next"].get("Href") and + len(data["Next"]["Href"]) > 0): url = data["Next"]["Href"] else: break diff --git a/uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 b/uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 index 3f632d0..576842d 100644 --- a/uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 +++ b/uw_hrp/resources/hrpws/file/hrp/v3/person.json_changed_since_date_2022-12-12_page_size_200 @@ -26,7 +26,7 @@ "FutureWorker": null }, "Next": { - "Href": "/hrp/v3/person.json?name=&page_start=2&page_size=1&worker_wid=&last_name=&first_name=&legal_last_name=&legal_first_name=&preferred_last_name=&preferred_first_name=&position=&retired=&terminated=¤t_faculty=&active_appointment=&supervisory_organization=&cost_center=&custom_organization_type=&custom_organization=&location=&future_worker=", + "Href": null, "ResourceName": null, "PageStart": "2", "PageSize": "1", diff --git a/uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json b/uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json index 87ee187..c244158 100644 --- a/uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json +++ b/uw_hrp/resources/hrpws/file/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json @@ -17,11 +17,11 @@ }, { "Type": "StudentID", - "Value": "2069354" + "Value": "1033334" }, { "Type": "PriorEmployeeID", - "Value": "T000063295" + "Value": "T000012345" } ], "Href": "/hrp/v3/person/9136CCB8F66711D5BE060004AC494FFE.json", @@ -36,11 +36,11 @@ "WorkerDetails": [ { "Name": "Student, James", - "WID": "1b68136df25201c0710e3ddad462fa1d", + "WID": "d957207a3068013093c007746e5c6c21", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068013093c007746e5c6c21" }, { "Type": "Employee_ID", @@ -50,15 +50,15 @@ "WorkerType": "Employee", "HuskyCardOverride": null, "EmploymentStatus": { - "HireDate": "2021-11-12T00:00:00-08:00", - "OriginalHireDate": "2021-11-12T00:00:00-08:00", + "HireDate": "2022-06-16T00:00:00-07:00", + "OriginalHireDate": "2015-09-30T00:00:00-07:00", "ExpectedFixedTermEndDate": "2023-06-15T00:00:00-07:00", - "FirstDayOfWork": "2021-11-12T00:00:00-08:00", - "ActiveStatusDate": "2021-11-12T00:00:00-08:00", + "FirstDayOfWork": "2022-06-16T00:00:00-07:00", + "ActiveStatusDate": "2022-06-16T00:00:00-07:00", "Active": true, "EmployeeStatus": "Active", "Terminated": false, - "TerminationDate": null, + "TerminationDate": "2021-07-31T00:00:00-07:00", "TerminationInvoluntary": null, "TerminationReason": null, "Retired": false, @@ -71,34 +71,34 @@ { "Position": { "Name": "PN-0212169 Student Assistant (NE H) - Student, James", - "WID": "", + "WID": "74cc75b78fcd1002100a782955c80000", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "74cc75b78fcd1002100a782955c80000" }, { "Type": "Position_ID", - "Value": "PN-0212169" + "Value": "PN-0245032" } ], - "Href": "/hrp/v3/position/.json" + "Href": "/hrp/v3/position/74cc75b78fcd1002100a782955c80000.json" }, "PositionRestriction": null, "PrimaryPosition": true, "BusinessTitle": "Student Assistant (NE H)", "PositionTitle": "Student Assistant (NE H)", - "EffectiveDate": "2022-11-12T00:00:00-08:00", - "StartDate": "2021-11-12T00:00:00-08:00", + "EffectiveDate": "2022-09-16T00:00:00-07:00", + "StartDate": "2022-09-16T00:00:00-07:00", "PositionVacateDate": null, "ExpectedFixedTermEndDate": null, "PositionWorkerType": { "Name": "Temporary (Fixed Term)", - "WID": "", + "WID": "d957207a30680175581fbad86a5c7b15", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680175581fbad86a5c7b15" }, { "Type": "Employee_Type_ID", @@ -108,12 +108,12 @@ }, "FTEPercent": 0.0, "PayRateType": { - "Name": "Hourly", - "WID": "", + "Name": "Salary", + "WID": "d957207a3068019058bda6026d5cd71d", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068019058bda6026d5cd71d" }, { "Type": "Pay_Rate_Type_ID", @@ -123,11 +123,11 @@ }, "WorkShift": { "Name": "First Shift (United States of America)", - "WID": "", + "WID": "d957207a306801ac611a09fe6e5c7432", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801ac611a09fe6e5c7432" }, { "Type": "Work_Shift_ID", @@ -135,14 +135,14 @@ } ] }, - "TotalPayAnnualizedAmount": 35921.6, + "TotalPayAnnualizedAmount": 35832.0, "TimeType": { "Name": "Part time", - "WID": "", + "WID": "afa35b88537f015bd4e4faafb6574800", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f015bd4e4faafb6574800" }, { "Type": "Position_Time_Type_ID", @@ -151,14 +151,14 @@ ] }, "CompensationStep": null, - "TotalBasePayAmount": 17.27, + "TotalBasePayAmount": 2986.0, "TotalBasePayFrequency": { "Name": "Hourly", - "WID": "", + "WID": "afa35b88537f01c22b33fbafb6574c00", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f01c22b33fbafb6574c00" }, { "Type": "Frequency_ID", @@ -166,112 +166,112 @@ } ] }, - "TotalBasePayAnnualizedAmount": 3.6, + "TotalBasePayAnnualizedAmount": 35832.0, "JobProfile": { "Name": "Student Assistant (NE H)", - "WID": "", + "WID": "d957207a3068017a83072d7d6f5cd145", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068017a83072d7d6f5cd145" }, { "Type": "Job_Profile_ID", - "Value": "10875" + "Value": "10804" } ], - "Href": "/hrp/v3/jobprofile/.json" + "Href": "/hrp/v3/jobprofile/d957207a3068017a83072d7d6f5cd145.json" }, "JobClassificationSummaries": [ { "JobClassification": { "Name": "U - Undergraduate Student (Employment Program)", - "WID": "", + "WID": "d957207a306801e1ea6a34e46d5c5222", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801e1ea6a34e46d5c5222" }, { "Type": "Job_Classification_Reference_ID", "Value": "ECS_U" } ], - "Href": "/hrp/v3/jobclassification/.json" + "Href": "/hrp/v3/jobclassification/d957207a306801e1ea6a34e46d5c5222.json" }, "JobClassificationGroup": { "Name": "Employment Program", - "WID": "", + "WID": "d957207a30680132aa0534e46d5c4d22", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680132aa0534e46d5c4d22" }, { "Type": "Job_Classification_Group_ID", "Value": "ECS" } ], - "Href": "/hrp/v3/jobclassificationgroup/.json" + "Href": "/hrp/v3/jobclassificationgroup/d957207a30680132aa0534e46d5c4d22.json" } }, { "JobClassification": { "Name": "0180 - Hourly, Overtime, Premiums and Payouts (Financial Account Codes (Object-Codes))", - "WID": "d957207a306801ea738f97e46d5cbd24", + "WID": "d957207a306801af66e097e46d5cc224", "IDs": [ { "Type": "WID", - "Value": "d957207a306801ea738f97e46d5cbd24" + "Value": "d957207a306801af66e097e46d5cc224" }, { "Type": "Job_Classification_Reference_ID", "Value": "OBJ_0180" } ], - "Href": "/hrp/v3/jobclassification/d957207a306801ea738f97e46d5cbd24.json" + "Href": "/hrp/v3/jobclassification/d957207a306801af66e097e46d5cc224.json" }, "JobClassificationGroup": { "Name": "Financial Account Codes (Object-Codes)", - "WID": "", + "WID": "d957207a3068014cb35d97e46d5cb924", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068014cb35d97e46d5cb924" }, { "Type": "Job_Classification_Group_ID", "Value": "OBJ" } ], - "Href": "/hrp/v3/jobclassificationgroup/.json" + "Href": "/hrp/v3/jobclassificationgroup/d957207a3068014cb35d97e46d5cb924.json" } } ], "Location": { "Name": "Seattle Campus", - "WID": "", + "WID": "d957207a306801c93acc30b96e5cae30", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801c93acc30b96e5cae30" }, { "Type": "Location_ID", "Value": "Seattle Campus" } ], - "Href": "/financial/v2/location/.json" + "Href": "/financial/v2/location/d957207a306801c93acc30b96e5cae30.json" }, "OrganizationDetails": [ { "Type": { "Name": "Cost Center", - "WID": "", + "WID": "afa35b88537f0176f922f9afb6573000", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f0176f922f9afb6573000" }, { "Type": "Organization_Type_ID", @@ -281,11 +281,11 @@ }, "Organization": { "Name": "060418 CHEMISTRY", - "WID": "", + "WID": "d957207a306801792e55a5d08d5c4b58", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801792e55a5d08d5c4b58" }, { "Type": "Organization_Reference_ID", @@ -301,11 +301,11 @@ { "Type": { "Name": "Service Period", - "WID": "", + "WID": "d957207a3068013093c007746e5c6c2f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068013093c007746e5c6c2f" }, { "Type": "Organization_Type_ID", @@ -315,11 +315,11 @@ }, "Organization": { "Name": "12", - "WID": "", + "WID": "d957207a306801e0c42f59276f5c6133", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801e0c42f59276f5c6133" }, { "Type": "Organization_Reference_ID", @@ -335,11 +335,11 @@ { "Type": { "Name": "Campus Mailbox", - "WID": "", + "WID": "d957207a3068011013570a746e5c6d2f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068011013570a746e5c6d2f" }, { "Type": "Organization_Type_ID", @@ -348,20 +348,20 @@ ] }, "Organization": { - "Name": "351700", - "WID": "", + "Name": "123456", + "WID": "d957207a306801e99186742e6f5c8138", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801e99186742e6f5c8138" }, { "Type": "Organization_Reference_ID", - "Value": "351700" + "Value": "123456" }, { "Type": "Custom_Organization_Reference_ID", - "Value": "351700" + "Value": "123456" } ] } @@ -369,11 +369,11 @@ { "Type": { "Name": "Supervisory", - "WID": "", + "WID": "afa35b88537f014fa5e2f8afb6572d00", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f014fa5e2f8afb6572d00" }, { "Type": "Organization_Type_ID", @@ -382,12 +382,12 @@ ] }, "Organization": { - "Name": "CAS: Chemistry: Theberge JM Student (Theberge, Ashleigh B)", - "WID": "", + "Name": "ENV: POE: Program on the Environment JM Student (... (Inherited))", + "WID": "a9d451238f0d01421083e4d1aa625948", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "a9d451238f0d01421083e4d1aa625948" }, { "Type": "Organization_Reference_ID", @@ -399,11 +399,11 @@ { "Type": { "Name": "FERPA", - "WID": "", + "WID": "d957207a30680102744515746e5c712f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680102744515746e5c712f" }, { "Type": "Organization_Type_ID", @@ -413,11 +413,11 @@ }, "Organization": { "Name": "Students Protected by FERPA", - "WID": "", + "WID": "d957207a306801f0b9d7b2316f5cdd3a", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801f0b9d7b2316f5cdd3a" }, { "Type": "Organization_Reference_ID", @@ -437,156 +437,156 @@ { "JobFamily": { "Name": "01 - Student Employees - Students", - "WID": "", + "WID": "d957207a306801889f233d0d6e5ce82e", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801889f233d0d6e5ce82e" }, { "Type": "Job_Family_ID", "Value": "Students" } ], - "Href": "/hrp/v3/jobfamily/.json" + "Href": "/hrp/v3/jobfamily/d957207a306801889f233d0d6e5ce82e.json" }, "JobFamilyGroup": { "Name": "01 - Student Employees", - "WID": "", + "WID": "d957207a30680135e0be92e46e5c5232", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680135e0be92e46e5c5232" }, { "Type": "Job_Family_ID", "Value": "01 - Student Employees" } ], - "Href": "/hrp/v3/jobfamilygroup/.json" + "Href": "/hrp/v3/jobfamilygroup/d957207a30680135e0be92e46e5c5232.json" } } ], "JobCategory": { "Name": "Hourly and Other", - "WID": "", + "WID": "d957207a30680188da7506276e5c4a2f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680188da7506276e5c4a2f" }, { "Type": "Job_Category_ID", "Value": "Hourly and Other" } ], - "Href": "/hrp/v3/jobcategory/.json" + "Href": "/hrp/v3/jobcategory/d957207a30680188da7506276e5c4a2f.json" }, - "CompensationMostRecentChangeDate": "2022-11-12T00:00:00-08:00", + "CompensationMostRecentChangeDate": "2022-09-16T00:00:00-07:00", "Managers": [ { - "Name": "The, Ash", - "WID": "", + "Name": "...", + "WID": "1b68136df25201e445b4cf22d662840d", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "1b68136df25201e445b4cf22d662840d" }, { "Type": "Employee_ID", "Value": "100000001" } ], - "Href": "/hrp/v3/person/100000001.json" + "Href": "/hrp/v3/person/878007521.json" } ], "IsManager": false, "ProbationEndDate": null, "SupervisoryOrganization": { - "Name": "CAS: Chemistry: Theberge JM Student ()", - "WID": "", + "Name": "CAS: Chemistry: Theberge JM Student (... (Inherited))", + "WID": "a9d451238f0d01421083e4d1aa625948", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "a9d451238f0d01421083e4d1aa625948" }, { "Type": "Organization_Reference_ID", "Value": "CAS_000896_JM_Student" } ], - "Href": "/hrp/v3/supervisoryorganization/.json" + "Href": "/hrp/v3/supervisoryorganization/a9d451238f0d01421083e4d1aa625948.json" }, "WorkerCompensationPlanAssignment": { - "Href": "/hrp/v3/workercompensationplanassignment/.json" + "Href": "/hrp/v3/workercompensationplanassignment/1b68136df252017e7f7c35fdd462618a.json" }, "WorkerPeriodActivityPayAssignment": { - "Href": "/hrp/v3/workerperiodactivitypayassignment/.json" + "Href": "/hrp/v3/workerperiodactivitypayassignment/1b68136df252017e7f7c35fdd462618a.json" }, "WorkerPayrollCostingAllocation": { - "Href": "/hrp/v3/workerpayrollcostingallocation/.json" + "Href": "/hrp/v3/workerpayrollcostingallocation/1b68136df252017e7f7c35fdd462618a.json" } }, { "Position": { - "Name": "PN-0244338 Graduate Fellow/Trainee Stipend w/o Benefits - Student, (+)", - "WID": "", + "Name": "PN-0234068 Student Assistant - UW Press Marketing & Sales - (+)", + "WID": "2dc618e46f69100171fdb97a51fe0003", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "2dc618e46f69100171fdb97a51fe0003" }, { "Type": "Position_ID", - "Value": "PN-0244338" + "Value": "PN-0234068" } ], - "Href": "/hrp/v3/position/.json" + "Href": "/hrp/v3/position/2dc618e46f69100171fdb97a51fe0003.json" }, "PositionRestriction": null, "PrimaryPosition": false, - "BusinessTitle": "Graduate Fellow/Trainee Stipend w/o Benefits", - "PositionTitle": "Graduate Fellow/Trainee Stipend w/o Benefits", - "EffectiveDate": "2022-10-16T00:00:00-07:00", - "StartDate": "2022-10-16T00:00:00-07:00", + "BusinessTitle": "UW Press Marketing & Sales Student Associate", + "PositionTitle": "Student Assistant - UW Press Marketing & Sales", + "EffectiveDate": "2022-07-27T00:00:00-07:00", + "StartDate": "2022-07-27T00:00:00-07:00", "PositionVacateDate": null, "ExpectedFixedTermEndDate": null, "PositionWorkerType": { - "Name": "Fixed Term (Fixed Term)", - "WID": "", + "Name": "Temporary (Fixed Term)", + "WID": "d957207a30680147c411bdd86a5c7c15", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680147c411bdd86a5c7c15" }, { "Type": "Employee_Type_ID", - "Value": "Fixed_Term" + "Value": "Temporary" } ] }, "FTEPercent": 0.0, "PayRateType": { - "Name": "Stipend", - "WID": "", + "Name": "Hourly", + "WID": "d957207a3068017d7d7eb5026d5cd81d", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068017d7d7eb5026d5cd81d" }, { "Type": "Pay_Rate_Type_ID", - "Value": "Stipend" + "Value": "Hourly" } ] }, "WorkShift": { "Name": "First Shift (United States of America)", - "WID": "", + "WID": "d957207a306801ac611a09fe6e5c7432", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801ac611a09fe6e5c7432" }, { "Type": "Work_Shift_ID", @@ -594,14 +594,14 @@ } ] }, - "TotalPayAnnualizedAmount": 35921.6, + "TotalPayAnnualizedAmount": 35832.0, "TimeType": { "Name": "Part time", - "WID": "", + "WID": "afa35b88537f015bd4e4faafb6574800", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f015bd4e4faafb6574800" }, { "Type": "Position_Time_Type_ID", @@ -610,114 +610,127 @@ ] }, "CompensationStep": null, - "TotalBasePayAmount": 0.0, - "TotalBasePayFrequency": null, - "TotalBasePayAnnualizedAmount": 0.0, + "TotalBasePayAmount": 38.37, + "TotalBasePayFrequency": { + "Name": "Hourly", + "WID": "afa35b88537f01be3221fbafb6574b00", + "IDs": [ + { + "Type": "WID", + "Value": "afa35b88537f01be3221fbafb6574b00" + }, + { + "Type": "Frequency_ID", + "Value": "Hourly" + } + ] + }, + "TotalBasePayAnnualizedAmount": 79809.6, "JobProfile": { - "Name": "Graduate Fellow/Trainee Stipend w/o Benefits", - "WID": "", + "Name": "Student Assistant - Grad (NE H)", + "WID": "a4efcad4621c01923b1aadb746217924", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "a4efcad4621c01923b1aadb746217924" }, { "Type": "Job_Profile_ID", - "Value": "21192" + "Value": "10889" } ], - "Href": "/hrp/v3/jobprofile/.json" + "Href": "/hrp/v3/jobprofile/a4efcad4621c01923b1aadb746217924.json" }, "JobClassificationSummaries": [ { "JobClassification": { - "Name": "S - Stipend (Employment Program)", - "WID": "", + "Name": "U - Undergraduate Student (Employment Program)", + "WID": "d957207a306801e1ea6a34e46d5c5222", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801e1ea6a34e46d5c5222" }, { "Type": "Job_Classification_Reference_ID", - "Value": "ECS_S" + "Value": "ECS_U" } ], - "Href": "/hrp/v3/jobclassification/.json" + "Href": "/hrp/v3/jobclassification/d957207a306801e1ea6a34e46d5c5222.json" }, "JobClassificationGroup": { "Name": "Employment Program", - "WID": "", + "WID": "d957207a30680132aa0534e46d5c4d22", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680132aa0534e46d5c4d22" }, { "Type": "Job_Classification_Group_ID", "Value": "ECS" } ], - "Href": "/hrp/v3/jobclassificationgroup/.json" + "Href": "/hrp/v3/jobclassificationgroup/d957207a30680132aa0534e46d5c4d22.json" } }, { "JobClassification": { - "Name": "0190 - Pre Doc Trainees (Financial Account Codes (Object-Codes))", - "WID": "", + "Name": "0180 - Hourly, Overtime, Premiums and Payouts (Financial Account Codes (Object-Codes))", + "WID": "d957207a306801ea738f97e46d5cbd24", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801ea738f97e46d5cbd24" }, { "Type": "Job_Classification_Reference_ID", - "Value": "OBJ_0190" + "Value": "OBJ_0180" } ], - "Href": "/hrp/v3/jobclassification/.json" + "Href": "/hrp/v3/jobclassification/d957207a306801ea738f97e46d5cbd24.json" }, "JobClassificationGroup": { "Name": "Financial Account Codes (Object-Codes)", - "WID": "", + "WID": "d957207a3068014cb35d97e46d5cb924", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068014cb35d97e46d5cb924" }, { "Type": "Job_Classification_Group_ID", "Value": "OBJ" } ], - "Href": "/hrp/v3/jobclassificationgroup/.json" + "Href": "/hrp/v3/jobclassificationgroup/d957207a3068014cb35d97e46d5cb924.json" } } ], "Location": { - "Name": "Seattle Campus", - "WID": "", + "Name": "Seattle, Non-Campus", + "WID": "d957207a306801ab329c3eb96e5cc230", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801ab329c3eb96e5cc230" }, { "Type": "Location_ID", - "Value": "Seattle Campus" + "Value": "Seattle Other Buildings" } ], - "Href": "/financial/v2/location/.json" + "Href": "/financial/v2/location/d957207a306801ab329c3eb96e5cc230.json" }, "OrganizationDetails": [ { "Type": { "Name": "Service Period", - "WID": "", + "WID": "d957207a3068013093c007746e5c6c2f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068013093c007746e5c6c2f" }, { "Type": "Organization_Type_ID", @@ -727,11 +740,11 @@ }, "Organization": { "Name": "12", - "WID": "", + "WID": "d957207a306801e0c42f59276f5c6133", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801e0c42f59276f5c6133" }, { "Type": "Organization_Reference_ID", @@ -746,68 +759,68 @@ }, { "Type": { - "Name": "Campus Mailbox", - "WID": "", + "Name": "Cost Center", + "WID": "afa35b88537f0176f922f9afb6573000", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f0176f922f9afb6573000" }, { "Type": "Organization_Type_ID", - "Value": "Campus_Mailbox" + "Value": "COST_CENTER" } ] }, "Organization": { - "Name": "352600", - "WID": "", + "Name": "141614 UNIVERSITY PRESS", + "WID": "d957207a30680173686e5f588e5c3088", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680173686e5f588e5c3088" }, { "Type": "Organization_Reference_ID", - "Value": "352600" + "Value": "141614" }, { - "Type": "Custom_Organization_Reference_ID", - "Value": "352600" + "Type": "Cost_Center_Reference_ID", + "Value": "141614" } ] } }, { "Type": { - "Name": "Cost Center", - "WID": "", + "Name": "Campus Mailbox", + "WID": "d957207a3068011013570a746e5c6d2f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068011013570a746e5c6d2f" }, { "Type": "Organization_Type_ID", - "Value": "COST_CENTER" + "Value": "Campus_Mailbox" } ] }, "Organization": { - "Name": "752554 RCR DEVASIA", - "WID": "d957207a30680191be62d9a2925c97d2", + "Name": "353770", + "WID": "d957207a3068014f5c2a4e2c6f5cfd36", "IDs": [ { "Type": "WID", - "Value": "d957207a30680191be62d9a2925c97d2" + "Value": "d957207a3068014f5c2a4e2c6f5cfd36" }, { "Type": "Organization_Reference_ID", - "Value": "752554" + "Value": "353770" }, { - "Type": "Cost_Center_Reference_ID", - "Value": "752554" + "Type": "Custom_Organization_Reference_ID", + "Value": "353770" } ] } @@ -815,11 +828,11 @@ { "Type": { "Name": "Supervisory", - "WID": "", + "WID": "afa35b88537f014fa5e2f8afb6572d00", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f014fa5e2f8afb6572d00" }, { "Type": "Organization_Type_ID", @@ -828,16 +841,16 @@ ] }, "Organization": { - "Name": "ENG: Mechanical Engineering-Devasia Lab JM Student (Devasia, Santosh (Inherited))", - "WID": "", + "Name": "LIB: UW Press: Marketing & Sales JM Student (... (Inherited))", + "WID": "eb548322956901f3209f2d0700177d1c", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "eb548322956901f3209f2d0700177d1c" }, { "Type": "Organization_Reference_ID", - "Value": "ENG_000307_JM_Student" + "Value": "LIB_000217_JM_Student" } ] } @@ -845,11 +858,11 @@ { "Type": { "Name": "FERPA", - "WID": "", + "WID": "d957207a30680102744515746e5c712f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680102744515746e5c712f" }, { "Type": "Organization_Type_ID", @@ -859,11 +872,11 @@ }, "Organization": { "Name": "Students Protected by FERPA", - "WID": "", + "WID": "d957207a306801f0b9d7b2316f5cdd3a", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801f0b9d7b2316f5cdd3a" }, { "Type": "Organization_Reference_ID", @@ -882,79 +895,79 @@ "JobFamilySummaries": [ { "JobFamily": { - "Name": "01 - Stipend Family Group - Stipend", - "WID": "d957207a30680175d7993a0d6e5ce62e", + "Name": "01 - Student Employees - Students", + "WID": "d957207a306801a8b14c9a0d6e5c2e2f", "IDs": [ { "Type": "WID", - "Value": "d957207a30680175d7993a0d6e5ce62e" + "Value": "d957207a306801a8b14c9a0d6e5c2e2f" }, { "Type": "Job_Family_ID", - "Value": "Stipend" + "Value": "Students" } ], - "Href": "/hrp/v3/jobfamily/d957207a30680175d7993a0d6e5ce62e.json" + "Href": "/hrp/v3/jobfamily/d957207a306801a8b14c9a0d6e5c2e2f.json" }, "JobFamilyGroup": { - "Name": "01 - Stipend Family Group", - "WID": "d957207a30680184a72187e46e5c5032", + "Name": "01 - Student Employees", + "WID": "d957207a30680135e0be92e46e5c5232", "IDs": [ { "Type": "WID", - "Value": "d957207a30680184a72187e46e5c5032" + "Value": "d957207a30680135e0be92e46e5c5232" }, { "Type": "Job_Family_ID", - "Value": "01 - Stipend Family Group" + "Value": "01 - Student Employees" } ], - "Href": "/hrp/v3/jobfamilygroup/d957207a30680184a72187e46e5c5032.json" + "Href": "/hrp/v3/jobfamilygroup/d957207a30680135e0be92e46e5c5232.json" } } ], "JobCategory": { - "Name": "Graduate Student Stipends", - "WID": "d957207a306801fb261817276e5c502f", + "Name": "Hourly and Other", + "WID": "d957207a3068015909b114276e5c4f2f", "IDs": [ { "Type": "WID", - "Value": "d957207a306801fb261817276e5c502f" + "Value": "d957207a3068015909b114276e5c4f2f" }, { "Type": "Job_Category_ID", - "Value": "Graduate Student Stipends" + "Value": "Hourly and Other" } ], - "Href": "/hrp/v3/jobcategory/d957207a306801fb261817276e5c502f.json" + "Href": "/hrp/v3/jobcategory/d957207a3068015909b114276e5c4f2f.json" }, - "CompensationMostRecentChangeDate": null, + "CompensationMostRecentChangeDate": "2022-10-03T00:00:00-07:00", "Managers": [], "IsManager": false, "ProbationEndDate": null, "SupervisoryOrganization": { - "Name": "ENG: Mechanical Engineering-Devasia Lab JM Student ()", - "WID": "", + "Name": "LIB: UW Press: Marketing & Sales JM Student (... (Inherited))", + "WID": "eb548322956901f3209f2d0700177d1c", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "eb548322956901f3209f2d0700177d1c" }, { "Type": "Organization_Reference_ID", - "Value": "ENG_000307_JM_Student" + "Value": "LIB_000217_JM_Student" } ], - "Href": "/hrp/v3/supervisoryorganization/.json" + "Href": "/hrp/v3/supervisoryorganization/eb548322956901f3209f2d0700177d1c.json" }, "WorkerCompensationPlanAssignment": { - "Href": "/hrp/v3/workercompensationplanassignment/.json" + "Href": "/hrp/v3/workercompensationplanassignment/1b68136df252017e7f7c35fdd462618a.json" }, "WorkerPeriodActivityPayAssignment": { - "Href": "/hrp/v3/workerperiodactivitypayassignment/.json" + "Href": "/hrp/v3/workerperiodactivitypayassignment/1b68136df252017e7f7c35fdd462618a.json" }, "WorkerPayrollCostingAllocation": { - "Href": "/hrp/v3/workerpayrollcostingallocation/.json" + "Href": "/hrp/v3/workerpayrollcostingallocation/1b68136df252017e7f7c35fdd462618a.json" } } ], @@ -962,11 +975,11 @@ { "Type": { "Name": "Cost Center", - "WID": "", + "WID": "afa35b88537f0176f922f9afb6573000", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f0176f922f9afb6573000" }, { "Type": "Organization_Type_ID", @@ -976,11 +989,11 @@ }, "Organization": { "Name": "060418 CHEMISTRY", - "WID": "", + "WID": "d957207a306801792e55a5d08d5c4b58", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801792e55a5d08d5c4b58" }, { "Type": "Organization_Reference_ID", @@ -996,11 +1009,11 @@ { "Type": { "Name": "Service Period", - "WID": "", + "WID": "d957207a3068013093c007746e5c6c2f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068013093c007746e5c6c2f" }, { "Type": "Organization_Type_ID", @@ -1010,11 +1023,11 @@ }, "Organization": { "Name": "12", - "WID": "", + "WID": "d957207a306801e0c42f59276f5c6133", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801e0c42f59276f5c6133" }, { "Type": "Organization_Reference_ID", @@ -1030,11 +1043,11 @@ { "Type": { "Name": "Campus Mailbox", - "WID": "", + "WID": "d957207a3068011013570a746e5c6d2f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a3068011013570a746e5c6d2f" }, { "Type": "Organization_Type_ID", @@ -1043,20 +1056,20 @@ ] }, "Organization": { - "Name": "351700", - "WID": "", + "Name": "123456", + "WID": "d957207a306801e99186742e6f5c8138", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801e99186742e6f5c8138" }, { "Type": "Organization_Reference_ID", - "Value": "351700" + "Value": "123456" }, { "Type": "Custom_Organization_Reference_ID", - "Value": "351700" + "Value": "123456" } ] } @@ -1064,11 +1077,11 @@ { "Type": { "Name": "Supervisory", - "WID": "", + "WID": "afa35b88537f014fa5e2f8afb6572d00", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "afa35b88537f014fa5e2f8afb6572d00" }, { "Type": "Organization_Type_ID", @@ -1077,12 +1090,12 @@ ] }, "Organization": { - "Name": "CAS: Chemistry: Theberge JM Student (Theberge, Ashleigh B)", - "WID": "", + "Name": "ENV: POE: Program on the Environment JM Student (... (Inherited))", + "WID": "a9d451238f0d01421083e4d1aa625948", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "a9d451238f0d01421083e4d1aa625948" }, { "Type": "Organization_Reference_ID", @@ -1094,11 +1107,11 @@ { "Type": { "Name": "FERPA", - "WID": "", + "WID": "d957207a30680102744515746e5c712f", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a30680102744515746e5c712f" }, { "Type": "Organization_Type_ID", @@ -1108,11 +1121,11 @@ }, "Organization": { "Name": "Students Protected by FERPA", - "WID": "", + "WID": "d957207a306801f0b9d7b2316f5cdd3a", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801f0b9d7b2316f5cdd3a" }, { "Type": "Organization_Reference_ID", @@ -1146,11 +1159,11 @@ { "Address": { "Name": "ADDRESS_REFERENCE-6-49", - "WID": "", + "WID": "d957207a306801b535f630b96e5cb130", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "d957207a306801b535f630b96e5cb130" }, { "Type": "Address_ID", @@ -1167,11 +1180,11 @@ ], "Country": { "Name": "United States of America", - "WID": "", + "WID": "bc33aa3152ec42d4995f4791a106ed09", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "bc33aa3152ec42d4995f4791a106ed09" }, { "Type": "ISO_3166-1_Alpha-2_Code", @@ -1189,11 +1202,11 @@ }, "Region": { "Name": "Washington", - "WID": "", + "WID": "de9b48948ef8421db97ddf4ea206e931", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "de9b48948ef8421db97ddf4ea206e931" }, { "Type": "Country_Region_ID", @@ -1216,11 +1229,11 @@ "Primary": true, "CommunicationType": { "Name": "Work", - "WID": "", + "WID": "1f27f250dfaa4724ab1e1617174281e4", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "1f27f250dfaa4724ab1e1617174281e4" }, { "Type": "Communication_Usage_Type_ID", @@ -1241,20 +1254,20 @@ "Emails": [ { "Email": { - "Name": "EMAIL_REFERENCE-3-2126130", - "WID": "52242b25e5f20109a4eb43ae14870002", + "Name": "EMAIL_REFERENCE-3-14257", + "WID": "29cae45a91d001cf41fba8d15d4ccc45", "IDs": [ { "Type": "WID", - "Value": "52242b25e5f20109a4eb43ae14870002" + "Value": "29cae45a91d001cf41fba8d15d4ccc45" }, { "Type": "Email_ID", - "Value": "EMAIL_REFERENCE-3-2126130" + "Value": "EMAIL_REFERENCE-3-14257" } ] }, - "EmailAddress": "javerage@uw.edu", + "EmailAddress": "a@uw.edu", "Usages": [ { "Types": [ @@ -1262,11 +1275,54 @@ "Primary": true, "CommunicationType": { "Name": "Work", - "WID": "", + "WID": "1f27f250dfaa4724ab1e1617174281e4", + "IDs": [ + { + "Type": "WID", + "Value": "1f27f250dfaa4724ab1e1617174281e4" + }, + { + "Type": "Communication_Usage_Type_ID", + "Value": "WORK" + } + ] + } + } + ], + "UsesFor": [], + "UsesForTenanted": [], + "Public": true + } + ] + }, + { + "Email": { + "Name": "EMAIL_REFERENCE-3-2113272", + "WID": "c57396bc79d301a01a71a1576a25f570", + "IDs": [ + { + "Type": "WID", + "Value": "c57396bc79d301a01a71a1576a25f570" + }, + { + "Type": "Email_ID", + "Value": "EMAIL_REFERENCE-3-2113272" + } + ] + }, + "EmailAddress": "a@gmail.com", + "Usages": [ + { + "Types": [ + { + "Primary": false, + "CommunicationType": { + "Name": "Work", + "WID": "1f27f250dfaa4724ab1e1617174281e4", "IDs": [ { "Type": "WID", - "Value": "" + "Value": "1f27f250dfaa4724ab1e1617174281e4" }, { "Type": "Communication_Usage_Type_ID", @@ -1284,7 +1340,7 @@ } ], "Phones": [], - "CampusMailbox": "351700" + "CampusMailbox": "" }, "CustomIDs": [] }, diff --git a/uw_hrp/tests/test_models.py b/uw_hrp/tests/test_models.py index 825e3ab..4f0835c 100644 --- a/uw_hrp/tests/test_models.py +++ b/uw_hrp/tests/test_models.py @@ -3,7 +3,7 @@ from unittest import TestCase from uw_hrp.models import ( - EmploymentStatus, JobProfile, SupervisoryOrganization, + EmploymentStatus, JobProfile, EmploymentDetails, WorkerDetails, Person, parse_date, get_emp_program_job_class, get_org_code_name) from uw_hrp.util import fdao_hrp_override @@ -110,26 +110,6 @@ def test_job_profile(self): ) self.assertIsNotNone(str(job_prof)) - def test_supervisory_organization(self): - super_org = SupervisoryOrganization( - org_code="HSA", - org_name="EHS: Occl Health - Acc Prevention") - self.assertIsNotNone(super_org) - super_org = SupervisoryOrganization( - data={ - "Name": "SOM: Family Medicine: King Academic (... ())", - } - ) - self.assertEqual( - super_org.to_json(), - { - 'budget_code': '', - 'org_code': 'SOM', - 'org_name': 'Family Medicine: King Academic' - } - ) - self.assertIsNotNone(str(super_org)) - def test_employment_details(self): emp_details = EmploymentDetails() self.assertIsNotNone(emp_details) @@ -171,6 +151,26 @@ def test_employment_details(self): ], } ], + "OrganizationDetails": [ + { + "Type": { + "Name": "Cost Center" + }, + "Organization": { + "Name": "141614 UNIVERSITY PRESS", + "IDs": [ + { + "Type": "Organization_Reference_ID", + "Value": "141614" + }, + { + "Type": "Cost_Center_Reference_ID", + "Value": "141614" + } + ] + } + }, + ], "SupervisoryOrganization": { "Name": "SOM: Family Medicine (... (Inherited))", } @@ -180,6 +180,7 @@ def test_employment_details(self): self.assertEqual( emp_details.to_json(), { + 'budget_code': '141614 UNIVERSITY PRESS', 'end_date': None, 'is_primary': True, 'job_class': 'Academic Personnel', @@ -189,15 +190,12 @@ def test_employment_details(self): 'job_code': None }, 'location': 'Seattle Campus', + 'org_code': 'SOM', + 'org_name': 'Family Medicine', 'org_unit_code': '', 'pos_type': 'Unpaid Academic', 'start_date': '2012-07-01 00:00:00-07:00', - 'supervisor_eid': '123456789', - 'supervisory_org': { - 'budget_code': '', - 'org_code': 'SOM', - 'org_name': 'Family Medicine' - } + 'supervisor_eid': '123456789' } ) self.assertIsNotNone(str(emp_details)) @@ -336,22 +334,20 @@ def test_worker(self): { 'active_positions': [ { - 'is_primary': True, - 'job_class': None, - 'job_profile': {'description': None, - 'job_code': None}, - 'job_title': 'Student Assistant (NE H)', - 'location': None, - 'org_unit_code': '', - 'pos_type': None, - 'end_date': None, - 'start_date': '2021-11-12 ' - '00:00:00-08:00', - 'supervisor_eid': None, - 'supervisory_org': { 'budget_code': '', + 'is_primary': True, + 'job_class': None, + 'job_profile': {'description': None, + 'job_code': None}, + 'job_title': 'Student Assistant (NE H)', + 'location': None, 'org_code': 'CAS', - 'org_name': 'Chemistry: JM student'} + 'org_name': 'Chemistry: JM student', + 'org_unit_code': '', + 'pos_type': None, + 'end_date': None, + 'start_date': '2021-11-12 00:00:00-08:00', + 'supervisor_eid': None } ], 'employee_status': { diff --git a/uw_hrp/tests/test_person.py b/uw_hrp/tests/test_person.py index b9a29e2..ae27600 100644 --- a/uw_hrp/tests/test_person.py +++ b/uw_hrp/tests/test_person.py @@ -46,6 +46,7 @@ def test_get_person_by_netid(self): self.assertEqual( position.primary_position.to_json(), { + 'budget_code': '681925 WORKDAY DEFAULT DEPTBG', 'end_date': None, 'is_primary': True, 'job_class': 'Academic Personnel', @@ -55,14 +56,12 @@ def test_get_person_by_netid(self): }, 'job_title': 'Clinical Associate Professor', 'location': 'Seattle Campus', + 'org_code': 'SOM', + 'org_name': 'Family Medicine: King Pierce JM Academic', 'org_unit_code': '', 'pos_type': 'Unpaid Academic', 'start_date': '2012-07-01 00:00:00-07:00', - 'supervisor_eid': '845007271', - 'supervisory_org': { - 'budget_code': '', - 'org_code': 'SOM', - 'org_name': 'Family Medicine: King Pierce JM Academic'} + 'supervisor_eid': '845007271' }) person = get_person_by_netid("faculty", include_future=True) @@ -79,11 +78,35 @@ def test_get_person_by_employee_id(self): def test_get_person_by_regid(self): person = get_person_by_regid("9136CCB8F66711D5BE060004AC494FFE") self.assertTrue(person.netid, 'javerage') + self.assertTrue(person.is_active) + self.assertEqual(person.primary_manager_id, "100000001") + self.assertEqual(len(person.worker_details), 1) + position = person.worker_details[0] + self.assertEqual(len(position.other_active_positions), 1) + self.maxDiff = None + self.assertEqual( + position.other_active_positions[0].to_json(), + {'budget_code': '141614 UNIVERSITY PRESS', + 'end_date': None, + 'is_primary': False, + 'job_class': 'Undergraduate Student', + 'job_profile': { + 'description': 'Student Assistant - Grad (NE H)', + 'job_code': '10889'}, + 'job_title': 'UW Press Marketing & Sales Student Associate', + 'location': 'Seattle, Non-Campus', + 'org_code': 'LIB', + 'org_name': 'UW Press: Marketing & Sales JM Student', + 'org_unit_code': '', + 'pos_type': 'Temporary (Fixed Term)', + 'start_date': '2022-07-27 00:00:00-07:00', + 'supervisor_eid': None} + ) self.assertRaises(InvalidRegID, get_person_by_regid, "000") def test_person_search(self): - pass - # persons = person_search(changed_since_date="2022-12-12") - # self.assertEqual(len(persons), 0) + persons = person_search(changed_since_date="2022-12-12") + self.assertEqual(len(persons), 1) + self.assertFalse(persons[0].is_active) From 4cdcc7fa7ca99bd6c0a75be7dfdeed6a8c210c95 Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Tue, 20 Dec 2022 21:05:03 -0800 Subject: [PATCH 03/12] clean up (#17) more test coverage --- uw_hrp/models.py | 1 - uw_hrp/tests/test_person.py | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/uw_hrp/models.py b/uw_hrp/models.py index 7cd3a95..ff6fb7d 100644 --- a/uw_hrp/models.py +++ b/uw_hrp/models.py @@ -189,7 +189,6 @@ def __init__(self, *args, **kwargs): class WorkerDetails(models.Model): worker_wid = models.CharField(max_length=32) - is_active = models.BooleanField(default=False) primary_job_title = models.CharField( max_length=128, null=True, default=None) primary_manager_id = models.CharField( diff --git a/uw_hrp/tests/test_person.py b/uw_hrp/tests/test_person.py index ae27600..d14e7a7 100644 --- a/uw_hrp/tests/test_person.py +++ b/uw_hrp/tests/test_person.py @@ -81,6 +81,11 @@ def test_get_person_by_regid(self): self.assertTrue(person.is_active) self.assertEqual(person.primary_manager_id, "100000001") self.assertEqual(len(person.worker_details), 1) + self.assertIsNotNone(person.to_json()) + json_worker_details = person.to_json()['worker_details'] + self.assertEqual(len(json_worker_details), 1) + self.assertEqual( + len(json_worker_details[0]['active_positions']), 2) position = person.worker_details[0] self.assertEqual(len(position.other_active_positions), 1) self.maxDiff = None From c0603bc1d6c8ccedcc087a5aae2acd191e7e456f Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Thu, 22 Dec 2022 12:41:35 -0800 Subject: [PATCH 04/12] tidy (#19) refactored --- uw_hrp/models.py | 34 +++++++++++++++------------------- uw_hrp/tests/test_models.py | 28 +++++++++++++++++++--------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/uw_hrp/models.py b/uw_hrp/models.py index ff6fb7d..ad033f3 100644 --- a/uw_hrp/models.py +++ b/uw_hrp/models.py @@ -27,11 +27,9 @@ def get_emp_program_job_class(job_classification_summaries): summary.get("JobClassification")): emp_program_name = summary["JobClassification"].get("Name") if " - " in emp_program_name: - name_data = emp_program_name.split(" - ", 1) - emp_program_name = name_data[1] - + emp_program_name = emp_program_name.split(" - ", 1)[1] if " (" in emp_program_name: - return emp_program_name.split(" (", 1)[0] + emp_program_name = emp_program_name.split(" (", 1)[0] return emp_program_name.strip() @@ -168,9 +166,9 @@ def __init__(self, *args, **kwargs): if (data.get("OrganizationDetails") is not None and len(data["OrganizationDetails"])): for org_det in data["OrganizationDetails"]: - if (org_det.get("Organization") and - org_det["Organization"].get("Name") and - org_det.get("Type") and + if (org_det.get("Organization") is not None and + org_det["Organization"].get("Name") is not None and + org_det.get("Type") is not None and org_det["Type"].get("Name") == "Cost Center"): self.budget_code = org_det["Organization"]["Name"] @@ -181,8 +179,8 @@ def __init__(self, *args, **kwargs): self.end_date = parse_date(data.get("PositionVacateDate")) self.start_date = parse_date(data.get("StartDate")) - if (data.get("SupervisoryOrganization") and - data["SupervisoryOrganization"].get("Name")): + if (data.get("SupervisoryOrganization") is not None and + data["SupervisoryOrganization"].get("Name") is not None): self.org_code, self.org_name = get_org_code_name( data["SupervisoryOrganization"]["Name"]) @@ -232,16 +230,14 @@ def __init__(self, *args, **kwargs): if not (self.employee_status and self.employee_status.is_active): return - active_positions = data.get("EmploymentDetails") - if active_positions is not None and len(active_positions) > 0: - for emp_detail in active_positions: - position = EmploymentDetails(data=emp_detail) - if position and position.is_primary: - self.primary_job_title = position.job_title - self.primary_manager_id = position.supervisor_eid - self.primary_position = position - else: - self.other_active_positions.append(position) + for emp_detail in data.get("EmploymentDetails"): + position = EmploymentDetails(data=emp_detail) + if position and position.is_primary: + self.primary_job_title = position.job_title + self.primary_manager_id = position.supervisor_eid + self.primary_position = position + else: + self.other_active_positions.append(position) class Person(models.Model): diff --git a/uw_hrp/tests/test_models.py b/uw_hrp/tests/test_models.py index 4f0835c..8d78034 100644 --- a/uw_hrp/tests/test_models.py +++ b/uw_hrp/tests/test_models.py @@ -16,20 +16,30 @@ def test_parse_date(self): self.assertIsNotNone(parse_date("2017-09-16T07:00:00.000Z")) def test_get_emp_program_job_class(self): - data = [{ - "JobClassification": { - "Name": "S - Stipend (Employment Program)", - "WID": "" + data = [ + { + "JobClassification": { + "Name": "S - Stipend (Employment Program)", + "WID": "" + }, + "JobClassificationGroup": { + "Name": "Employment Program", + "WID": "" + } }, - "JobClassificationGroup": { - "Name": "Employment Program", - "WID": "" + { + "JobClassification": { + "Name": "0180 - Hourly, Overt, Prem (Fina (Object-Codes))" + }, + "JobClassificationGroup": { + "Name": "Financial Account Codes (Object-Codes)" + } } - }] + ] self.assertEqual(get_emp_program_job_class(data), 'Stipend') def test_get_org_code_name(self): - data = "CAS: Chemistry: Theberge JM Student ()" + data = "CAS: Chemistry: Theberge JM Student (...())" code, name = get_org_code_name(data) self.assertEqual(code, "CAS") self.assertEqual(name, "Chemistry: Theberge JM Student") From 064877bd79ebcb0bc64bad55667cbee582f56fd6 Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Fri, 23 Dec 2022 16:42:20 -0800 Subject: [PATCH 05/12] Fix/bug (#20) fix job_title --- uw_hrp/__init__.py | 7 +------ uw_hrp/models.py | 4 ++-- uw_hrp/tests/test_models.py | 21 +++++++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/uw_hrp/__init__.py b/uw_hrp/__init__.py index f45a172..a6799a3 100644 --- a/uw_hrp/__init__.py +++ b/uw_hrp/__init__.py @@ -2,8 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 """ -This is the interface for interacting with -the hrp web service. +This is the interface for interacting with the hrp web service. """ import logging @@ -16,10 +15,6 @@ def get_resource(url): response = HRP_DAO().getURL(url, {'Accept': 'application/json'}) - - logger.debug("{0} ==status==> {1}".format(url, response.status)) if response.status != 200: raise DataFailureException(url, response.status, response.data) - - logger.debug("{0} ==data==> {1}".format(url, response.data)) return response.data diff --git a/uw_hrp/models.py b/uw_hrp/models.py index ad033f3..b9a5944 100644 --- a/uw_hrp/models.py +++ b/uw_hrp/models.py @@ -122,7 +122,7 @@ def to_json(self): 'budget_code': self.budget_code, 'end_date': date_to_str(self.end_date), 'is_primary': self.is_primary, - 'job_title': self.title, + 'job_title': self.job_title, 'job_class': self.job_class, 'location': self.location, 'org_code': self.org_code, @@ -147,7 +147,7 @@ def __init__(self, *args, **kwargs): if data is None: return super(EmploymentDetails, self).__init__(*args, **kwargs) - self.title = data.get("BusinessTitle") + self.job_title = data.get("BusinessTitle") self.job_profile = JobProfile(data=data.get("JobProfile")) self.job_class = get_emp_program_job_class( diff --git a/uw_hrp/tests/test_models.py b/uw_hrp/tests/test_models.py index 8d78034..4835228 100644 --- a/uw_hrp/tests/test_models.py +++ b/uw_hrp/tests/test_models.py @@ -96,18 +96,23 @@ def test_employment_status(self): def test_job_profile(self): job_prof = JobProfile(job_code="1", description="A") self.assertIsNotNone(job_prof) - job_prof = JobProfile( - data={ + self.assertEqual(JobProfile( + data={"Name": "Unpaid", "IDs": []}).to_json(), + { + 'job_code': None, 'description': 'Unpaid' + } + ) + + job_prof = JobProfile(data={ "Name": "Unpaid Academic", - "WID": "d957207a306801fc5c30a8906f5c6b57", "IDs": [ - { - "Type": "WID", - "Value": "d957207a306801fc5c30a8906f5c6b57" - }, { "Type": "Job_Profile_ID", "Value": "21184" + }, + { + "Type": "WID", + "Value": "d957207a306801fc5c30a8906f5c6b57" } ] } @@ -369,7 +374,7 @@ def test_worker(self): 'status': 'Active', 'termination_date': None }, - 'primary_job_title': None, + 'primary_job_title': 'Student Assistant (NE H)', 'primary_manager_id': None, 'worker_wid': '1b68136df25201c0710e3ddad462fa1d' } From 96c3e7887955461cf8e4913086742a543c97946f Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Mon, 26 Dec 2022 21:19:11 -0800 Subject: [PATCH 06/12] log response --- uw_hrp/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/uw_hrp/__init__.py b/uw_hrp/__init__.py index a6799a3..f839431 100644 --- a/uw_hrp/__init__.py +++ b/uw_hrp/__init__.py @@ -15,6 +15,8 @@ def get_resource(url): response = HRP_DAO().getURL(url, {'Accept': 'application/json'}) + logger.info("{} == {} ==> {}".format( + url, response.status, response.data[0:50])) if response.status != 200: raise DataFailureException(url, response.status, response.data) return response.data From 1b9e823ce228043ba393a0bbd1d63db6c947939c Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Mon, 26 Dec 2022 21:40:12 -0800 Subject: [PATCH 07/12] log response --- uw_hrp/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uw_hrp/__init__.py b/uw_hrp/__init__.py index f839431..17d11ff 100644 --- a/uw_hrp/__init__.py +++ b/uw_hrp/__init__.py @@ -16,7 +16,7 @@ def get_resource(url): response = HRP_DAO().getURL(url, {'Accept': 'application/json'}) logger.info("{} == {} ==> {}".format( - url, response.status, response.data[0:50])) + url, response.status, response.data)) if response.status != 200: raise DataFailureException(url, response.status, response.data) return response.data From 383772860929e64f461928f0fdd4c1ce10cf95d8 Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Mon, 26 Dec 2022 22:01:07 -0800 Subject: [PATCH 08/12] reset debug logging --- uw_hrp/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uw_hrp/__init__.py b/uw_hrp/__init__.py index 17d11ff..6d61cf9 100644 --- a/uw_hrp/__init__.py +++ b/uw_hrp/__init__.py @@ -15,8 +15,8 @@ def get_resource(url): response = HRP_DAO().getURL(url, {'Accept': 'application/json'}) - logger.info("{} == {} ==> {}".format( - url, response.status, response.data)) + logger.debug("{0} ==status==> {1}".format(url, response.status)) if response.status != 200: raise DataFailureException(url, response.status, response.data) + logger.debug("{0} ==data==> {1}".format(url, response.data)) return response.data From bf2cf906297c61db6c958b75443d011bc1dff05c Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Tue, 27 Dec 2022 16:57:27 -0800 Subject: [PATCH 09/12] Convert to class (#22) Convert to class, handle bytes response data --- uw_hrp/__init__.py | 107 +++++++++++++++++-- uw_hrp/person.py | 95 ---------------- uw_hrp/tests/{test_person.py => test_hrp.py} | 33 +++--- 3 files changed, 118 insertions(+), 117 deletions(-) delete mode 100644 uw_hrp/person.py rename uw_hrp/tests/{test_person.py => test_hrp.py} (82%) diff --git a/uw_hrp/__init__.py b/uw_hrp/__init__.py index 6d61cf9..937d93b 100644 --- a/uw_hrp/__init__.py +++ b/uw_hrp/__init__.py @@ -6,17 +6,106 @@ """ import logging +import json +import re +from urllib.parse import urlencode from uw_hrp.dao import HRP_DAO -from restclients_core.exceptions import DataFailureException - +from restclients_core.exceptions import ( + DataFailureException, InvalidRegID, InvalidNetID, InvalidEmployeeID) +from uw_hrp.models import Person logger = logging.getLogger(__name__) +re_netid = re.compile(r'^[a-z][a-z0-9\-\_\.]{,127}$', re.I) +re_regid = re.compile(r'^[A-F0-9]{32}$', re.I) +re_employee_id = re.compile(r'^\d{9}$') + + +class HRP(object): + URL_PREFIX = "/hrp/v3/person" + SUFFIX = "future_worker=true" + + def __init__(self): + self.DAO = HRP_DAO() + self.req_url = None + + def get_resource(self, url): + self.req_url = url + response = self.DAO.getURL(url, {'Accept': 'application/json'}) + logger.debug("{0} ==status==> {1}".format(url, response.status)) + if response.status != 200: + raise DataFailureException( + url, response.status, response.data) + data = convert_bytes_str(response.data) + logger.debug("{0} ==data==> {1}".format(url, data)) + return data + + def get_person_by_employee_id(self, employee_id, include_future=False): + if not valid_employee_id(employee_id): + raise InvalidEmployeeID(employee_id) + return self._get_person(employee_id, include_future) + + def get_person_by_netid(self, netid, include_future=False): + if not valid_uwnetid(netid): + raise InvalidNetID(netid) + return self._get_person(netid, include_future) + + def get_person_by_regid(self, regid, include_future=False): + if not valid_uwregid(regid): + raise InvalidRegID(regid) + return self._get_person(regid, include_future) + + def _get_person(self, id, include_future): + """ + Return a restclients.models.hrp.WorkerDetails object + """ + url = "{0}/{1}.json".format(self.URL_PREFIX, id) + if include_future: + url = "{0}?{1}".format(url, self.SUFFIX) + return Person(data=json.loads(self.get_resource(url))) + + def person_search(self, **kwargs): + """ + Returns a list of Person objects + Parameters can be: + active_appointment: true|false + changed_since_date: string + cost_center: string + current_faculty: true|false + future_worker: string + location: string + supervisory_organization: string + worker_wid: string + """ + url = "{0}.json?{1}&page_size=200".format( + self.URL_PREFIX, urlencode(kwargs)) + persons = [] + while True: + data = json.loads(self.get_resource(url)) + if "Persons" in data: + for person_record in data.get("Persons"): + persons.append(Person(data=person_record)) + if (data.get("Next") and data["Next"].get("Href") and + len(data["Next"]["Href"]) > 0): + url = data["Next"]["Href"] + else: + break + return persons + + +def valid_uwnetid(netid): + return (netid is not None and + re_netid.match(str(netid)) is not None) + + +def valid_uwregid(regid): + return (regid is not None and + re_regid.match(str(regid)) is not None) + + +def valid_employee_id(employee_id): + return (employee_id is not None and + re_employee_id.match(str(employee_id)) is not None) -def get_resource(url): - response = HRP_DAO().getURL(url, {'Accept': 'application/json'}) - logger.debug("{0} ==status==> {1}".format(url, response.status)) - if response.status != 200: - raise DataFailureException(url, response.status, response.data) - logger.debug("{0} ==data==> {1}".format(url, response.data)) - return response.data +def convert_bytes_str(data): + return data.decode('utf-8') if type(data) is bytes else data diff --git a/uw_hrp/person.py b/uw_hrp/person.py deleted file mode 100644 index 4d24262..0000000 --- a/uw_hrp/person.py +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright 2022 UW-IT, University of Washington -# SPDX-License-Identifier: Apache-2.0 - -""" -This is the interface for interacting with the HRP Web Service. -""" - -from datetime import datetime -import logging -import json -import re -from urllib.parse import urlencode -from restclients_core.exceptions import ( - InvalidRegID, InvalidNetID, InvalidEmployeeID) -from uw_hrp import get_resource -from uw_hrp.models import Person - - -logger = logging.getLogger(__name__) -re_netid = re.compile(r'^[a-z][a-z0-9\-\_\.]{,127}$', re.I) -re_regid = re.compile(r'^[A-F0-9]{32}$', re.I) -re_employee_id = re.compile(r'^\d{9}$') -URL_PREFIX = "/hrp/v3/person" -SUFFIX = "future_worker=true" - - -def get_person_by_employee_id(employee_id, include_future=False): - if not valid_employee_id(employee_id): - raise InvalidEmployeeID(employee_id) - return _get_person(employee_id, include_future) - - -def get_person_by_netid(netid, include_future=False): - if not valid_uwnetid(netid): - raise InvalidNetID(netid) - return _get_person(netid, include_future) - - -def get_person_by_regid(regid, include_future=False): - if not valid_uwregid(regid): - raise InvalidRegID(regid) - return _get_person(regid, include_future) - - -def _get_person(id, include_future): - """ - Return a restclients.models.hrp.WorkerDetails object - """ - url = "{0}/{1}.json".format(URL_PREFIX, id) - if include_future: - url = "{0}?{1}".format(url, SUFFIX) - return Person(data=json.loads(get_resource(url))) - - -def person_search(**kwargs): - """ - Returns a list of Person objects - Parameters can be: - active_appointment: true|false - changed_since_date: string - cost_center: string - current_faculty: true|false - future_worker: string - location: string - supervisory_organization: string - worker_wid: string - """ - url = "{0}.json?{1}&page_size=200".format(URL_PREFIX, urlencode(kwargs)) - persons = [] - while True: - data = json.loads(get_resource(url)) - if "Persons" in data: - for person_record in data.get("Persons"): - persons.append(Person(data=person_record)) - if (data.get("Next") and data["Next"].get("Href") and - len(data["Next"]["Href"]) > 0): - url = data["Next"]["Href"] - else: - break - return persons - - -def valid_uwnetid(netid): - return (netid is not None and - re_netid.match(str(netid)) is not None) - - -def valid_uwregid(regid): - return (regid is not None and - re_regid.match(str(regid)) is not None) - - -def valid_employee_id(employee_id): - return (employee_id is not None and - re_employee_id.match(str(employee_id)) is not None) diff --git a/uw_hrp/tests/test_person.py b/uw_hrp/tests/test_hrp.py similarity index 82% rename from uw_hrp/tests/test_person.py rename to uw_hrp/tests/test_hrp.py index d14e7a7..a83e361 100644 --- a/uw_hrp/tests/test_person.py +++ b/uw_hrp/tests/test_hrp.py @@ -4,24 +4,28 @@ from unittest import TestCase from restclients_core.exceptions import ( DataFailureException, InvalidEmployeeID, InvalidRegID, InvalidNetID) -from uw_hrp.person import ( - get_person_by_netid, get_person_by_employee_id, get_person_by_regid, - person_search) +from uw_hrp import HRP, convert_bytes_str from uw_hrp.util import fdao_hrp_override @fdao_hrp_override -class PersonTest(TestCase): +class HrpTest(TestCase): + + def test_convert_bytes_str(self): + self.assertEqual(type(b'bytes'), bytes) + self.assertEqual(type('bytes'), str) + self.assertEqual(convert_bytes_str(b'bytes'), "bytes") def test_get_person_by_netid(self): + hrp = HRP() self.assertRaises(DataFailureException, - get_person_by_netid, + hrp.get_person_by_netid, "None") self.assertRaises(InvalidNetID, - get_person_by_netid, + hrp.get_person_by_netid, "") - person = get_person_by_netid("faculty") + person = hrp.get_person_by_netid("faculty") self.assertIsNotNone(person) self.assertEqual(person.regid, "10000000000000000000000000000005") self.assertEqual(person.employee_id, "000000005") @@ -64,19 +68,21 @@ def test_get_person_by_netid(self): 'supervisor_eid': '845007271' }) - person = get_person_by_netid("faculty", include_future=True) + person = hrp.get_person_by_netid("faculty", include_future=True) self.assertIsNotNone(person) def test_get_person_by_employee_id(self): - person = get_person_by_employee_id("000000005") + hrp = HRP() + person = hrp.get_person_by_employee_id("000000005") self.assertTrue(person.netid, 'faculty') self.assertRaises(InvalidEmployeeID, - get_person_by_employee_id, + hrp.get_person_by_employee_id, "") def test_get_person_by_regid(self): - person = get_person_by_regid("9136CCB8F66711D5BE060004AC494FFE") + hrp = HRP() + person = hrp.get_person_by_regid("9136CCB8F66711D5BE060004AC494FFE") self.assertTrue(person.netid, 'javerage') self.assertTrue(person.is_active) self.assertEqual(person.primary_manager_id, "100000001") @@ -109,9 +115,10 @@ def test_get_person_by_regid(self): ) self.assertRaises(InvalidRegID, - get_person_by_regid, "000") + hrp.get_person_by_regid, "000") def test_person_search(self): - persons = person_search(changed_since_date="2022-12-12") + hrp = HRP() + persons = hrp.person_search(changed_since_date="2022-12-12") self.assertEqual(len(persons), 1) self.assertFalse(persons[0].is_active) From 4482bb936578d7ede600216308c263528a3e973f Mon Sep 17 00:00:00 2001 From: Fang Lin Date: Tue, 27 Dec 2022 17:17:07 -0800 Subject: [PATCH 10/12] add test --- uw_hrp/tests/test_hrp.py | 1 + 1 file changed, 1 insertion(+) diff --git a/uw_hrp/tests/test_hrp.py b/uw_hrp/tests/test_hrp.py index a83e361..8631a98 100644 --- a/uw_hrp/tests/test_hrp.py +++ b/uw_hrp/tests/test_hrp.py @@ -15,6 +15,7 @@ def test_convert_bytes_str(self): self.assertEqual(type(b'bytes'), bytes) self.assertEqual(type('bytes'), str) self.assertEqual(convert_bytes_str(b'bytes'), "bytes") + self.assertEqual(convert_bytes_str('bytes'), "bytes") def test_get_person_by_netid(self): hrp = HRP() From 21c2fa8c7fe39f64e991c161e1c9f8cf3aceac60 Mon Sep 17 00:00:00 2001 From: Jim Laney Date: Thu, 5 Jan 2023 10:28:38 -0800 Subject: [PATCH 11/12] update action versions --- .github/workflows/cicd.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml index 31be48b..fb1f634 100644 --- a/.github/workflows/cicd.yml +++ b/.github/workflows/cicd.yml @@ -37,16 +37,16 @@ on: jobs: test: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - name: Checkout Repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: - python-version: 3.6 + python-version: 3.8 - name: Install Dependencies run: | @@ -75,16 +75,16 @@ jobs: needs: test - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - name: Checkout Repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: - python-version: '3.x' + python-version: 3.8 - name: Publish to PyPi uses: uw-it-aca/actions/publish-pypi@main From 9a75f81a4e2ce33104025f223fe41b7cd5aeb8bb Mon Sep 17 00:00:00 2001 From: Jim Laney Date: Thu, 5 Jan 2023 10:28:50 -0800 Subject: [PATCH 12/12] update copyright --- uw_hrp/__init__.py | 3 ++- uw_hrp/dao.py | 3 ++- uw_hrp/models.py | 3 ++- uw_hrp/test.py | 3 ++- uw_hrp/tests/test_dao.py | 3 ++- uw_hrp/tests/test_hrp.py | 3 ++- uw_hrp/tests/test_models.py | 3 ++- uw_hrp/util/__init__.py | 3 ++- 8 files changed, 16 insertions(+), 8 deletions(-) diff --git a/uw_hrp/__init__.py b/uw_hrp/__init__.py index 937d93b..0583d7c 100644 --- a/uw_hrp/__init__.py +++ b/uw_hrp/__init__.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + """ This is the interface for interacting with the hrp web service. """ diff --git a/uw_hrp/dao.py b/uw_hrp/dao.py index 01d0d4d..b9b311b 100644 --- a/uw_hrp/dao.py +++ b/uw_hrp/dao.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + import logging import os from os.path import abspath, dirname diff --git a/uw_hrp/models.py b/uw_hrp/models.py index b9a5944..cc1f427 100644 --- a/uw_hrp/models.py +++ b/uw_hrp/models.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + from dateutil.parser import parse import json from restclients_core import models diff --git a/uw_hrp/test.py b/uw_hrp/test.py index 43215f3..5ef7150 100644 --- a/uw_hrp/test.py +++ b/uw_hrp/test.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + # This is just a test runner for coverage from commonconf.backends import use_configparser_backend from os.path import abspath, dirname diff --git a/uw_hrp/tests/test_dao.py b/uw_hrp/tests/test_dao.py index 1c8faaf..cc0993c 100644 --- a/uw_hrp/tests/test_dao.py +++ b/uw_hrp/tests/test_dao.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + from unittest import TestCase from uw_hrp.dao import HRP_DAO diff --git a/uw_hrp/tests/test_hrp.py b/uw_hrp/tests/test_hrp.py index 8631a98..c8babd1 100644 --- a/uw_hrp/tests/test_hrp.py +++ b/uw_hrp/tests/test_hrp.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + from unittest import TestCase from restclients_core.exceptions import ( DataFailureException, InvalidEmployeeID, InvalidRegID, InvalidNetID) diff --git a/uw_hrp/tests/test_models.py b/uw_hrp/tests/test_models.py index 4835228..517b1b3 100644 --- a/uw_hrp/tests/test_models.py +++ b/uw_hrp/tests/test_models.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + from unittest import TestCase from uw_hrp.models import ( EmploymentStatus, JobProfile, diff --git a/uw_hrp/util/__init__.py b/uw_hrp/util/__init__.py index a09afe5..00c2be8 100644 --- a/uw_hrp/util/__init__.py +++ b/uw_hrp/util/__init__.py @@ -1,6 +1,7 @@ -# Copyright 2022 UW-IT, University of Washington +# Copyright 2023 UW-IT, University of Washington # SPDX-License-Identifier: Apache-2.0 + from restclients_core.util.decorators import use_mock from uw_hrp.dao import HRP_DAO