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.
Files changed (33) hide show
  1. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/PKG-INFO +1 -1
  2. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/custom_tables.py +1 -1
  3. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/payments.py +12 -10
  4. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/people.py +18 -0
  5. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/people.py +1 -1
  6. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/timeoff.py +12 -12
  7. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
  8. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/setup.py +1 -1
  9. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/__init__.py +0 -0
  10. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/bank.py +0 -0
  11. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/company.py +0 -0
  12. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/documents.py +0 -0
  13. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/employment.py +0 -0
  14. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/named_lists.py +0 -0
  15. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/payroll_history.py +0 -0
  16. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/salaries.py +0 -0
  17. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/__init__.py +0 -0
  18. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/bank.py +0 -0
  19. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
  20. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/employment.py +0 -0
  21. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/named_lists.py +0 -0
  22. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/payments.py +0 -0
  23. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
  24. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/salary.py +0 -0
  25. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/schemas/work.py +0 -0
  26. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/timeoff.py +0 -0
  27. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob/work.py +0 -0
  28. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
  29. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
  30. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
  31. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/requires.txt +0 -0
  32. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
  33. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq_sdk_bob
3
- Version: 2.6.0
3
+ Version: 2.6.3
4
4
  Summary: Bob wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -29,7 +29,7 @@ class CustomTables:
29
29
  record_path=['values']
30
30
  )
31
31
 
32
- df['employeeId'] = employee_id
32
+ df['employee_id'] = employee_id
33
33
  valid_data, invalid_data = Functions.validate_data(df=df, schema=self.schema, debug=True)
34
34
 
35
35
  return valid_data, invalid_data
@@ -9,17 +9,19 @@ class Payments:
9
9
  self.bob = bob
10
10
  self.schema = VariablePaymentSchema
11
11
 
12
- def get(self, person_id: str) -> (pd.DataFrame, pd.DataFrame):
13
- resp = self.bob.session.get(url=f"{self.bob.base_url}people/{person_id}/variable", timeout=self.bob.timeout)
14
- resp.raise_for_status()
15
- data = resp.json()
16
- df = pd.json_normalize(
17
- data,
18
- record_path='values'
19
- )
20
- df['employee_id'] = person_id
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq-sdk-bob
3
- Version: 2.6.0
3
+ Version: 2.6.3
4
4
  Summary: Bob wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -2,7 +2,7 @@ from setuptools import setup, find_namespace_packages
2
2
 
3
3
  setup(
4
4
  name='brynq_sdk_bob',
5
- version='2.6.0',
5
+ version='2.6.3',
6
6
  description='Bob wrapper from BrynQ',
7
7
  long_description='Bob wrapper from BrynQ',
8
8
  author='BrynQ',
File without changes