brynq-sdk-bob 2.6.0__tar.gz → 2.6.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/PKG-INFO +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/custom_tables.py +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/payments.py +12 -10
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/people.py +18 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/people.py +7 -4
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/timeoff.py +12 -12
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/setup.py +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/__init__.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/bank.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/company.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/documents.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/employment.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/named_lists.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/payroll_history.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/salaries.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/__init__.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/bank.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/employment.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/named_lists.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/payments.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/salary.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/work.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/timeoff.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/work.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/requires.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/setup.cfg +0 -0
|
@@ -9,17 +9,19 @@ class Payments:
|
|
|
9
9
|
self.bob = bob
|
|
10
10
|
self.schema = VariablePaymentSchema
|
|
11
11
|
|
|
12
|
-
def get(self,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
data
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
def get(self, person_ids: List[str]) -> (pd.DataFrame, pd.DataFrame):
|
|
13
|
+
df = pd.DataFrame()
|
|
14
|
+
for person_id in person_ids:
|
|
15
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}people/{person_id}/variable", timeout=self.bob.timeout)
|
|
16
|
+
resp.raise_for_status()
|
|
17
|
+
data = resp.json()
|
|
18
|
+
df = pd.concat([df, pd.json_normalize(
|
|
19
|
+
data,
|
|
20
|
+
record_path='values'
|
|
21
|
+
)])
|
|
22
|
+
df['employee_id'] = person_id
|
|
23
|
+
df = df.reset_index(drop=True)
|
|
21
24
|
valid_payments, invalid_payments = Functions.validate_data(df=df, schema=self.schema, debug=True)
|
|
22
|
-
|
|
23
25
|
return valid_payments, invalid_payments
|
|
24
26
|
|
|
25
27
|
def get_actual_payments(
|
|
@@ -45,9 +45,27 @@ class People:
|
|
|
45
45
|
resp.raise_for_status()
|
|
46
46
|
df = pd.json_normalize(resp.json()['employees'])
|
|
47
47
|
df = df.loc[:, ~df.columns.str.contains('value')]
|
|
48
|
+
|
|
48
49
|
# Normalize separators in incoming data: convert '/' to '.' to match schema aliases
|
|
49
50
|
df.columns = df.columns.str.replace('/', '.', regex=False)
|
|
50
51
|
|
|
52
|
+
# A lot of fields from Bob are returned with only ID's. Those fields should be mapped to names. Therefore, we need to get the mapping from the named-lists endpoint.
|
|
53
|
+
resp_named_lists = self.bob.session.get(url=f"{self.bob.base_url}company/named-lists", timeout=self.bob.timeout, headers=self.bob.headers)
|
|
54
|
+
named_lists = resp_named_lists.json()
|
|
55
|
+
|
|
56
|
+
# Transform named_lists to create id-to-value mappings for each field
|
|
57
|
+
named_lists = {key.split('.')[-1]: {item['id']: item['value'] for item in value['values']} for key, value in named_lists.items()}
|
|
58
|
+
|
|
59
|
+
for field in df.columns:
|
|
60
|
+
# Fields in the response and in the named-list does have different building blocks (e.g. people.payroll.entitlement. or people.entitlement.). But they both end with the same last block
|
|
61
|
+
field_df = field.split('.')[-1].split('work_')[-1]
|
|
62
|
+
if field_df in named_lists.keys() and field_df not in ['site']:
|
|
63
|
+
mapping = named_lists[field_df]
|
|
64
|
+
df[field] = df[field].apply(
|
|
65
|
+
lambda v: [mapping.get(x, x) for x in v] if isinstance(v, list) else mapping.get(v, v)
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
51
69
|
if schema_custom_fields is not None:
|
|
52
70
|
valid_people, invalid_people_custom = Functions.validate_data(df=df, schema=schema_custom_fields, debug=True)
|
|
53
71
|
else:
|
|
@@ -26,7 +26,7 @@ class PeopleSchema(BrynQPanderaDataFrameModel):
|
|
|
26
26
|
first_name: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="First Name", alias="firstName", metadata={"api_field": "root.firstName"})
|
|
27
27
|
full_name: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Full Name", alias="fullName", metadata={"api_field": "root.fullName"})
|
|
28
28
|
# the date is in DD/MM/YYYY format,
|
|
29
|
-
personal_birth_date: Optional[Series[DateTime]] = pa.Field(coerce=True, nullable=False, description="Personal Birth Date", alias="personal.birthDate")
|
|
29
|
+
personal_birth_date: Optional[Series[DateTime]] = pa.Field(coerce=True, nullable=False, description="Personal Birth Date", alias="personal.birthDate")
|
|
30
30
|
personal_pronouns: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Personal Pronouns", alias="personal.pronouns")
|
|
31
31
|
personal_honorific: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Personal Honorific", alias="personal.honorific")
|
|
32
32
|
personal_nationality: Optional[Series[object]] = pa.Field(coerce=True, check_name=check_list, description="Personal Nationality", alias="personal.nationality")
|
|
@@ -106,7 +106,7 @@ class PeopleSchema(BrynQPanderaDataFrameModel):
|
|
|
106
106
|
internal_termination_date: Optional[Series[DateTime]] = pa.Field(coerce=True, nullable=True, description="Internal Termination Date", alias="internal.terminationDate")
|
|
107
107
|
internal_termination_type: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Internal Termination Type", alias="internal.terminationType")
|
|
108
108
|
employee_last_day_of_work: Optional[Series[DateTime]] = pa.Field(coerce=True, nullable=True, description="Employee Last Day of Work", alias="employee.lastDayOfWork")
|
|
109
|
-
financial_iban: Series[String] = pa.Field(coerce=True, nullable=True, alias='financial.iban')
|
|
109
|
+
financial_iban: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, alias='financial.iban')
|
|
110
110
|
employee_band_effective_date_ote: Optional[Series[DateTime]] = pa.Field(coerce=True, nullable=True, description="Employee Band Effective Date OTE", alias="employee.band_effectiveDate_ote")
|
|
111
111
|
employee_band_site_ote: Optional[Series[object]] = pa.Field(coerce=True, nullable=True, check_name=check_list, description="Employee Band Site OTE", alias="employee.band_site_ote")
|
|
112
112
|
employee_band_min_ote: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Employee Band Min OTE", alias="employee.band_min_ote")
|
|
@@ -214,13 +214,16 @@ class PeopleSchema(BrynQPanderaDataFrameModel):
|
|
|
214
214
|
payroll_employment_site_working_pattern_hours_per_day: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Site Working Pattern - Hours Per Day", alias="payroll.employment.siteWorkingPattern.hoursPerDay")
|
|
215
215
|
payroll_employment_site_working_pattern_working_pattern_id: Optional[Series[pd.Int64Dtype]] = pa.Field(coerce=True, nullable=True, description="Site Working Pattern - Working Pattern ID", alias="payroll.employment.siteWorkingPattern.workingPatternId")
|
|
216
216
|
payroll_employment_calendar_id: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Calendar ID", alias="payroll.employment.calendarId")
|
|
217
|
-
|
|
218
|
-
|
|
219
217
|
payroll_employment_salary_pay_type: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Salary Pay Type", alias="payroll.employment.salaryPayType")
|
|
220
218
|
payroll_employment_flsa_code: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="FLSA Code", alias="payroll.employment.flsaCode")
|
|
221
219
|
payroll_employment_fte: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="FTE %", alias="payroll.employment.fte")
|
|
222
220
|
payroll_employment_weekly_hours: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Weekly Hours", alias="payroll.employment.weeklyHours")
|
|
223
221
|
|
|
222
|
+
# Salary information
|
|
223
|
+
payroll_salary_monthly_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base salary (monthly_", alias="payroll.salary.monthlyPayment")
|
|
224
|
+
payroll_salary_yearly_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly)", alias="payroll.salary.yearlyPayment")
|
|
225
|
+
payroll_salary_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base Salary", alias="payroll.salary.payment")
|
|
226
|
+
|
|
224
227
|
# Emergency contact
|
|
225
228
|
emergency_first_name: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Emergency First Name", alias="emergency.firstName")
|
|
226
229
|
emergency_second_name: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Emergency Middle Name", alias="emergency.secondName")
|
|
@@ -12,19 +12,19 @@ class TimeOffSchema(BrynQPanderaDataFrameModel):
|
|
|
12
12
|
request_id: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Request ID", alias="requestId")
|
|
13
13
|
policy_type_display_name: Series[String] = pa.Field(coerce=True, description="Policy Type Display Name", alias="policyTypeDisplayName")
|
|
14
14
|
type: Series[String] = pa.Field(coerce=True, description="Type", alias="type")
|
|
15
|
-
start_date: Series[String] = pa.Field(coerce=True, description="Start Date", alias="startDate")
|
|
16
|
-
start_portion: Series[String] = pa.Field(coerce=True, description="Start Portion", alias="startPortion")
|
|
17
|
-
end_date: Series[String] = pa.Field(coerce=True, description="End Date", alias="endDate")
|
|
18
|
-
end_portion: Series[String] = pa.Field(coerce=True, description="End Portion", alias="endPortion")
|
|
19
|
-
day_portion: Optional[Series[String]] = pa.Field(coerce=True, description="Day Portion", alias="dayPortion")
|
|
20
|
-
date: Optional[Series[String]] = pa.Field(coerce=True, description="Date", alias="date")
|
|
21
|
-
hours_on_date: Optional[Series[Float]] = pa.Field(coerce=True, description="Hours on Date", alias="hoursOnDate")
|
|
22
|
-
daily_hours: Optional[Series[Float]] = pa.Field(coerce=True, description="Daily Hours", alias="dailyHours")
|
|
23
|
-
duration_unit: Optional[Series[String]] = pa.Field(coerce=True, description="Duration Unit", alias="durationUnit")
|
|
24
|
-
total_duration: Optional[Series[Float]] = pa.Field(coerce=True, description="Total Duration", alias="totalDuration")
|
|
25
|
-
total_cost: Optional[Series[Float]] = pa.Field(coerce=True, description="Total Cost", alias="totalCost")
|
|
15
|
+
start_date: Series[String] = pa.Field(coerce=True, nullable=True, description="Start Date", alias="startDate")
|
|
16
|
+
start_portion: Series[String] = pa.Field(coerce=True, nullable=True, description="Start Portion", alias="startPortion")
|
|
17
|
+
end_date: Series[String] = pa.Field(coerce=True, nullable=True, description="End Date", alias="endDate")
|
|
18
|
+
end_portion: Series[String] = pa.Field(coerce=True, nullable=True, description="End Portion", alias="endPortion")
|
|
19
|
+
day_portion: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Day Portion", alias="dayPortion")
|
|
20
|
+
date: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Date", alias="date")
|
|
21
|
+
hours_on_date: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Hours on Date", alias="hoursOnDate")
|
|
22
|
+
daily_hours: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Daily Hours", alias="dailyHours")
|
|
23
|
+
duration_unit: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Duration Unit", alias="durationUnit")
|
|
24
|
+
total_duration: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Total Duration", alias="totalDuration")
|
|
25
|
+
total_cost: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Total Cost", alias="totalCost")
|
|
26
26
|
change_reason: Optional[Series[String]] = pa.Field(nullable=True, coerce=True, description="Change Reason", alias="changeReason")
|
|
27
|
-
visibility: Optional[Series[String]] = pa.Field(coerce=True, description="Visibility", alias="visibility")
|
|
27
|
+
visibility: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Visibility", alias="visibility")
|
|
28
28
|
|
|
29
29
|
class Config:
|
|
30
30
|
coerce = True
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|