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.
Files changed (33) hide show
  1. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/PKG-INFO +1 -1
  2. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/custom_tables.py +1 -1
  3. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/payments.py +12 -10
  4. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/people.py +18 -0
  5. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/people.py +7 -4
  6. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/timeoff.py +12 -12
  7. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
  8. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/setup.py +1 -1
  9. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/__init__.py +0 -0
  10. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/bank.py +0 -0
  11. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/company.py +0 -0
  12. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/documents.py +0 -0
  13. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/employment.py +0 -0
  14. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/named_lists.py +0 -0
  15. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/payroll_history.py +0 -0
  16. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/salaries.py +0 -0
  17. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/__init__.py +0 -0
  18. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/bank.py +0 -0
  19. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
  20. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/employment.py +0 -0
  21. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/named_lists.py +0 -0
  22. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/payments.py +0 -0
  23. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
  24. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/salary.py +0 -0
  25. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/schemas/work.py +0 -0
  26. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/timeoff.py +0 -0
  27. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob/work.py +0 -0
  28. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
  29. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
  30. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
  31. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/requires.txt +0 -0
  32. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
  33. {brynq_sdk_bob-2.6.0 → brynq_sdk_bob-2.6.4}/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.4
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:
@@ -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") # , dtype_kwargs={"to_datetime_kwargs": {"format": "%d/%m/%Y"}}
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
@@ -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.4
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.4',
6
6
  description='Bob wrapper from BrynQ',
7
7
  long_description='Bob wrapper from BrynQ',
8
8
  author='BrynQ',
File without changes