brynq-sdk-bob 2.9.4__tar.gz → 2.9.5__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.9.4 → brynq_sdk_bob-2.9.5}/PKG-INFO +1 -1
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/__init__.py +20 -5
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/custom_tables.py +27 -15
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/people.py +11 -5
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/payments.py +5 -2
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/people.py +9 -7
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/salary.py +10 -5
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/setup.py +1 -1
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/bank.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/company.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/documents.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/employment.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/named_lists.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/payments.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/payroll_history.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/reports.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/salaries.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/__init__.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/bank.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/employment.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/named_lists.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/timeoff.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/schemas/work.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/timeoff.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob/work.py +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob.egg-info/requires.txt +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
- {brynq_sdk_bob-2.9.4 → brynq_sdk_bob-2.9.5}/setup.cfg +0 -0
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
import base64
|
|
2
|
-
from typing import List, Optional, Literal
|
|
3
|
-
import requests
|
|
4
2
|
import os
|
|
5
|
-
from
|
|
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
|
-
|
|
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
|
-
|
|
3
|
-
from
|
|
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,
|
|
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
|
|
17
|
+
Get custom table data for employees
|
|
14
18
|
|
|
15
19
|
Args:
|
|
16
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
|
|
5
|
-
|
|
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=
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
7
|
+
from pandera import Bool
|
|
8
|
+
from pandera.typing import DateTime, Float, Series, String
|
|
7
9
|
from pydantic import BaseModel, Field
|
|
8
|
-
|
|
9
|
-
from
|
|
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")
|
|
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
|