brynq-sdk-bob 2.9.4__tar.gz → 2.9.6__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 (34) hide show
  1. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/PKG-INFO +1 -1
  2. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/__init__.py +20 -5
  3. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/custom_tables.py +27 -15
  4. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/people.py +11 -5
  5. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/payments.py +5 -2
  6. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/people.py +9 -7
  7. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/salary.py +10 -5
  8. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
  9. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/setup.py +1 -1
  10. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/bank.py +0 -0
  11. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/company.py +0 -0
  12. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/documents.py +0 -0
  13. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/employment.py +0 -0
  14. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/named_lists.py +0 -0
  15. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/payments.py +0 -0
  16. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/payroll_history.py +0 -0
  17. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/reports.py +0 -0
  18. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/salaries.py +0 -0
  19. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/__init__.py +0 -0
  20. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/bank.py +0 -0
  21. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
  22. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/employment.py +0 -0
  23. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/named_lists.py +0 -0
  24. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
  25. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/timeoff.py +0 -0
  26. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/schemas/work.py +0 -0
  27. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/timeoff.py +0 -0
  28. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob/work.py +0 -0
  29. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
  30. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
  31. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
  32. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob.egg-info/requires.txt +0 -0
  33. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
  34. {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brynq_sdk_bob
3
- Version: 2.9.4
3
+ Version: 2.9.6
4
4
  Summary: Bob wrapper from BrynQ
5
5
  Author: BrynQ
6
6
  Author-email: support@brynq.com
@@ -1,21 +1,27 @@
1
1
  import base64
2
- from typing import List, Optional, Literal
3
- import requests
4
2
  import os
5
- from .reports import Reports
3
+ from typing import List, Literal, Optional
4
+
5
+ import requests
6
+ from requests.adapters import HTTPAdapter
7
+ from urllib3.util.retry import Retry
8
+
6
9
  from brynq_sdk_brynq import BrynQ
10
+
7
11
  from .bank import Bank
8
12
  from .company import Company
13
+ from .custom_tables import CustomTables
9
14
  from .documents import CustomDocuments
10
15
  from .employment import Employment
11
16
  from .named_lists import NamedLists
12
17
  from .payments import Payments
18
+ from .payroll_history import History
13
19
  from .people import People
20
+ from .reports import Reports
14
21
  from .salaries import Salaries
15
22
  from .timeoff import TimeOff
16
23
  from .work import Work
17
- from .custom_tables import CustomTables
18
- from .payroll_history import History
24
+
19
25
 
20
26
  class Bob(BrynQ):
21
27
  def __init__(self, system_type: Optional[Literal['source', 'target']] = None, test_environment: bool = True, debug: bool = False, target_system: str = None):
@@ -28,6 +34,15 @@ class Bob(BrynQ):
28
34
  else:
29
35
  self.base_url = "https://api.hibob.com/v1/"
30
36
  self.session = requests.Session()
37
+ retry_strategy = Retry(
38
+ total=5,
39
+ backoff_factor=1.0,
40
+ status_forcelist=[429, 500, 502, 503, 504],
41
+ respect_retry_after_header=True
42
+ )
43
+ adapter = HTTPAdapter(max_retries=retry_strategy)
44
+ self.session.mount("http://", adapter)
45
+ self.session.mount("https://", adapter)
31
46
  self.session.headers.update(self.headers)
32
47
  self.people = People(self)
33
48
  self.salaries = Salaries(self)
@@ -1,6 +1,10 @@
1
+ from typing import List, Optional
2
+
1
3
  import pandas as pd
2
- from brynq_sdk_functions import Functions
3
- from .schemas.custom_tables import CustomTableSchema, CustomTableMetadataSchema
4
+
5
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel, Functions
6
+
7
+ from .schemas.custom_tables import CustomTableMetadataSchema, CustomTableSchema
4
8
 
5
9
 
6
10
  class CustomTables:
@@ -8,29 +12,37 @@ class CustomTables:
8
12
  self.bob = bob
9
13
  self.schema = CustomTableSchema
10
14
 
11
- def get(self, employee_id: str, custom_table_id: str) -> tuple[pd.DataFrame, pd.DataFrame]:
15
+ def get(self, employee_ids: List[str], custom_table_id: str, schema_custom_fields: Optional[BrynQPanderaDataFrameModel] = None) -> tuple[pd.DataFrame, pd.DataFrame]:
12
16
  """
13
- Get custom table data for an employee
17
+ Get custom table data for employees
14
18
 
15
19
  Args:
16
- employee_id: The employee ID
20
+ employee_ids: List of employee IDs
17
21
  custom_table_id: The custom table ID
22
+ schema_custom_fields: Optional custom schema for validation
18
23
 
19
24
  Returns:
20
25
  A tuple of (valid_data, invalid_data) as pandas DataFrames
21
26
  """
22
- resp = self.bob.session.get(url=f"{self.bob.base_url}people/custom-tables/{employee_id}/{custom_table_id}")
23
- resp.raise_for_status()
24
- data = resp.json()
27
+ df = pd.DataFrame()
28
+ for employee_id in employee_ids:
29
+ resp = self.bob.session.get(url=f"{self.bob.base_url}people/custom-tables/{employee_id}/{custom_table_id}", timeout=self.bob.timeout)
30
+ resp.raise_for_status()
31
+ data = resp.json()
25
32
 
26
- # Normalize the nested JSON response
27
- df = pd.json_normalize(
28
- data,
29
- record_path=['values']
30
- )
33
+ # Normalize the nested JSON response
34
+ df_temp = pd.json_normalize(
35
+ data,
36
+ record_path=['values']
37
+ )
38
+ df_temp['employee_id'] = employee_id
39
+ df = pd.concat([df, df_temp])
40
+ df = df.reset_index(drop=True)
31
41
 
32
- df['employee_id'] = employee_id
33
- valid_data, invalid_data = Functions.validate_data(df=df, schema=self.schema, debug=True)
42
+ if schema_custom_fields is not None:
43
+ valid_data, invalid_data = Functions.validate_data(df=df, schema=schema_custom_fields, debug=True)
44
+ else:
45
+ valid_data, invalid_data = Functions.validate_data(df=df, schema=self.schema, debug=True)
34
46
 
35
47
  return valid_data, invalid_data
36
48
 
@@ -1,14 +1,16 @@
1
- import pandas as pd
2
1
  import re
3
2
  from typing import Optional
4
- from brynq_sdk_functions import Functions
5
- from brynq_sdk_functions import BrynQPanderaDataFrameModel
3
+
4
+ import pandas as pd
5
+
6
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel, Functions
7
+
6
8
  from .bank import Bank
9
+ from .custom_tables import CustomTables
7
10
  from .employment import Employment
8
11
  from .salaries import Salaries
9
12
  from .schemas.people import PeopleSchema
10
13
  from .work import Work
11
- from .custom_tables import CustomTables
12
14
 
13
15
 
14
16
  class People:
@@ -87,8 +89,12 @@ class People:
87
89
 
88
90
 
89
91
  if schema_custom_fields is not None:
92
+ # Make all custom schema columns nullable to avoid validation errors for missing values
93
+ custom_schema = schema_custom_fields.to_schema()
94
+ for col_name in custom_schema.columns:
95
+ custom_schema.columns[col_name].nullable = True
90
96
 
91
- valid_people, invalid_people_custom = Functions.validate_data(df=df, schema=schema_custom_fields, debug=True)
97
+ valid_people, invalid_people_custom = Functions.validate_data(df=df, schema=custom_schema, debug=True)
92
98
 
93
99
 
94
100
  else:
@@ -1,9 +1,12 @@
1
- import pandera as pa
2
- from pandera.typing import Series, String, Float, DateTime
3
1
  from typing import Optional
2
+
4
3
  import pandas as pd
4
+ import pandera as pa
5
+ from pandera.typing import DateTime, Float, Series, String
6
+
5
7
  from brynq_sdk_functions import BrynQPanderaDataFrameModel
6
8
 
9
+
7
10
  class VariablePaymentSchema(BrynQPanderaDataFrameModel):
8
11
  can_be_deleted: Series[bool] = pa.Field(nullable=True, coerce=True, description="Can Be Deleted", alias="canBeDeleted")
9
12
  department_percent: Series[Float] = pa.Field(nullable=True, coerce=True, description="Department Percent", alias="departmentPercent")
@@ -1,13 +1,14 @@
1
1
  from datetime import datetime
2
- from typing import Optional, List, Dict
2
+ from typing import Dict, List, Optional
3
3
 
4
4
  import pandas as pd
5
5
  import pandera as pa
6
- from pandera import Bool
7
- from pandera.typing import Series, String, Float
8
6
  import pandera.extensions as extensions
9
- from brynq_sdk_functions import BrynQPanderaDataFrameModel
7
+ from pandera import Bool
10
8
  from pandera.engines.pandas_engine import DateTime
9
+ from pandera.typing import Float, Series, String
10
+
11
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
11
12
 
12
13
 
13
14
  @extensions.register_check_method()
@@ -194,15 +195,16 @@ class PeopleSchema(BrynQPanderaDataFrameModel):
194
195
  payroll_employment_hours_in_day_not_worked: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Hours in Day Not Worked", alias="payroll.employment.hoursInDayNotWorked")
195
196
  payroll_employment_site_working_pattern: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Site Working Pattern", alias="payroll.employment.siteWorkingPattern")
196
197
  payroll_employment_actual_working_pattern: Optional[Series[dict]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern", alias="payroll.employment.actualWorkingPattern")
197
- payroll_employment_actual_working_pattern_days_sunday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Sunday", alias="payroll.employment.actualWorkingPattern.days.sunday")
198
+ payroll_employment_actual_working_pattern_days_monday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Monday", alias="payroll.employment.actualWorkingPattern.days.monday")
198
199
  payroll_employment_actual_working_pattern_days_tuesday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Tuesday", alias="payroll.employment.actualWorkingPattern.days.tuesday")
199
200
  payroll_employment_actual_working_pattern_days_wednesday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Wednesday", alias="payroll.employment.actualWorkingPattern.days.wednesday")
200
- payroll_employment_actual_working_pattern_days_monday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Monday", alias="payroll.employment.actualWorkingPattern.days.monday")
201
- payroll_employment_actual_working_pattern_days_friday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Friday", alias="payroll.employment.actualWorkingPattern.days.friday")
202
201
  payroll_employment_actual_working_pattern_days_thursday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Thursday", alias="payroll.employment.actualWorkingPattern.days.thursday")
202
+ payroll_employment_actual_working_pattern_days_friday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Friday", alias="payroll.employment.actualWorkingPattern.days.friday")
203
203
  payroll_employment_actual_working_pattern_days_saturday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Saturday", alias="payroll.employment.actualWorkingPattern.days.saturday")
204
+ payroll_employment_actual_working_pattern_days_sunday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Sunday", alias="payroll.employment.actualWorkingPattern.days.sunday")
204
205
  payroll_employment_actual_working_pattern_hours_per_day: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Hours Per Day", alias="payroll.employment.actualWorkingPattern.hoursPerDay")
205
206
  payroll_employment_actual_working_pattern_working_pattern_id: Optional[Series[pd.Int64Dtype]] = pa.Field(coerce=True, nullable=True, description="Actual Working Pattern - Working Pattern ID", alias="payroll.employment.actualWorkingPattern.workingPatternId")
207
+ payroll_employment_actual_working_pattern_weekly_work_percentage: Optional[Series[pd.Int64Dtype]] = pa.Field(coerce=True, nullable=True, description="Actual Working Patttern - working pattern weekly work percentage", alias="payroll.employment.actualWorkingPattern.weeklyWorkPercentage")
206
208
  payroll_employment_site_working_pattern_working_pattern_type: Optional[Series[String]] = pa.Field(coerce=True, nullable=True, description="Site Working Pattern - Working Pattern Type", alias="payroll.employment.siteWorkingPattern.workingPatternType")
207
209
  payroll_employment_site_working_pattern_days_sunday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Site Working Pattern - Sunday", alias="payroll.employment.siteWorkingPattern.days.sunday")
208
210
  payroll_employment_site_working_pattern_days_tuesday: Optional[Series[float]] = pa.Field(coerce=True, nullable=True, description="Site Working Pattern - Tuesday", alias="payroll.employment.siteWorkingPattern.days.tuesday")
@@ -1,12 +1,14 @@
1
+ from datetime import date, datetime
2
+ from typing import Any, Dict, Optional
3
+
1
4
  import pandas as pd
2
5
  import pandera as pa
3
- from pandera import Bool
4
- from pandera.typing import Series, String, Float, DateTime
5
6
  import pandera.extensions as extensions
6
- from brynq_sdk_functions import BrynQPanderaDataFrameModel
7
+ from pandera import Bool
8
+ from pandera.typing import DateTime, Float, Series, String
7
9
  from pydantic import BaseModel, Field
8
- from datetime import datetime, date
9
- from typing import Optional, Dict, Any
10
+
11
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
10
12
 
11
13
 
12
14
  class SalarySchema(BrynQPanderaDataFrameModel):
@@ -25,6 +27,9 @@ class SalarySchema(BrynQPanderaDataFrameModel):
25
27
 
26
28
 
27
29
  class SalaryCreateSchema(BaseModel):
30
+ # Function parameters
31
+ salary_data: Optional[Dict[str, Any]] = Field(None, description="Salary data", alias="salaryData")
32
+
28
33
  can_be_deleted: Optional[bool] = Field(None, description="internal flag", alias="canBeDeleted")
29
34
  work_change_type: Optional[str] = Field(None, description="The type of the change that was performed for this work entry. This will contain the ID of the value from the Change Type list.", alias="workChangeType")
30
35
  salary_change_reason: Optional[str] = Field(None, description="Reason for the change", alias="change.reason")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brynq_sdk_bob
3
- Version: 2.9.4
3
+ Version: 2.9.6
4
4
  Summary: Bob wrapper from BrynQ
5
5
  Author: BrynQ
6
6
  Author-email: support@brynq.com
@@ -2,7 +2,7 @@ from setuptools import find_namespace_packages, setup
2
2
 
3
3
  setup(
4
4
  name='brynq_sdk_bob',
5
- version='2.9.4',
5
+ version='2.9.6',
6
6
  description='Bob wrapper from BrynQ',
7
7
  long_description='Bob wrapper from BrynQ',
8
8
  author='BrynQ',
File without changes