brynq-sdk-bob 2.6.0__tar.gz → 2.6.3__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.3}/PKG-INFO +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/custom_tables.py +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/payments.py +12 -10
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/people.py +18 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/people.py +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/timeoff.py +12 -12
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/setup.py +1 -1
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/__init__.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/bank.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/company.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/documents.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/employment.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/named_lists.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/payroll_history.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/salaries.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/__init__.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/bank.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/employment.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/named_lists.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/payments.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/salary.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/work.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/timeoff.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/work.py +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/requires.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
- {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/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:
|
|
@@ -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")
|
|
@@ -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
|