brynq-sdk-bob 1.0.0__tar.gz → 1.1.1__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-1.0.0 → brynq_sdk_bob-1.1.1}/PKG-INFO +1 -1
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/__init__.py +5 -3
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/bank.py +1 -1
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/company.py +2 -2
- brynq_sdk_bob-1.1.1/brynq_sdk_bob/custom_tables.py +36 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/documents.py +4 -3
- brynq_sdk_bob-1.1.1/brynq_sdk_bob/named_lists.py +37 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/payments.py +1 -1
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/people.py +15 -6
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/bank.py +1 -0
- brynq_sdk_bob-1.1.1/brynq_sdk_bob/schemas/custom_tables.py +10 -0
- brynq_sdk_bob-1.1.1/brynq_sdk_bob/schemas/named_lists.py +13 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/people.py +9 -9
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/timeoff.py +2 -1
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob.egg-info/SOURCES.txt +4 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/setup.py +1 -1
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/employment.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/salaries.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/__init__.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/employment.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/payments.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/salary.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/timeoff.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/schemas/work.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob/work.py +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob.egg-info/requires.txt +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
- {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.1}/setup.cfg +0 -0
|
@@ -8,15 +8,15 @@ from .bank import Bank
|
|
|
8
8
|
from .company import Company
|
|
9
9
|
from .documents import CustomDocuments
|
|
10
10
|
from .employment import Employment
|
|
11
|
+
from .named_lists import NamedLists
|
|
11
12
|
from .payments import Payments
|
|
12
13
|
from .people import People
|
|
13
14
|
from .salaries import Salaries
|
|
14
15
|
from .timeoff import TimeOff
|
|
15
16
|
from .work import Work
|
|
16
17
|
|
|
17
|
-
|
|
18
18
|
class Bob(BrynQ):
|
|
19
|
-
def __init__(self, label: Union[str, List], test_environment: bool = True, debug: bool = False):
|
|
19
|
+
def __init__(self, label: Union[str, List], test_environment: bool = True, debug: bool = False, target_system: str = None):
|
|
20
20
|
super().__init__()
|
|
21
21
|
self.headers = self._get_request_headers(label=label)
|
|
22
22
|
if test_environment:
|
|
@@ -34,6 +34,8 @@ class Bob(BrynQ):
|
|
|
34
34
|
self.time_off = TimeOff(self)
|
|
35
35
|
self.documents = CustomDocuments(self)
|
|
36
36
|
self.companies = Company(self)
|
|
37
|
+
self.named_lists = NamedLists(self)
|
|
38
|
+
self.timeout = 3600
|
|
37
39
|
|
|
38
40
|
def _get_request_headers(self, label):
|
|
39
41
|
credentials = self.get_system_credential(system='bob', label=label)
|
|
@@ -52,7 +54,7 @@ class Bob(BrynQ):
|
|
|
52
54
|
while has_next_page:
|
|
53
55
|
prepped = request.prepare()
|
|
54
56
|
prepped.headers.update(self.session.headers)
|
|
55
|
-
resp = self.session.send(prepped)
|
|
57
|
+
resp = self.session.send(prepped, timeout=self.timeout)
|
|
56
58
|
resp.raise_for_status()
|
|
57
59
|
response_data = resp.json()
|
|
58
60
|
result_data += response_data['results']
|
|
@@ -10,7 +10,7 @@ class Bank:
|
|
|
10
10
|
def get(self, person_ids: pd.Series) -> (pd.DataFrame, pd.DataFrame):
|
|
11
11
|
data = []
|
|
12
12
|
for person_id in person_ids:
|
|
13
|
-
resp = self.bob.session.get(url=f"{self.bob.base_url}people/{person_id}/bank-accounts")
|
|
13
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}people/{person_id}/bank-accounts", timeout=self.bob.timeout)
|
|
14
14
|
resp.raise_for_status()
|
|
15
15
|
temp_data = resp.json()['values']
|
|
16
16
|
# when an employee has one or more bank accounts, the response is a list of dictionaries.
|
|
@@ -9,12 +9,12 @@ class Company:
|
|
|
9
9
|
values = {}
|
|
10
10
|
|
|
11
11
|
if list_name is not None:
|
|
12
|
-
resp = self.bob.session.get(url=f"{self.bob.base_url}company/named-lists/{list_name}")
|
|
12
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}company/named-lists/{list_name}", timeout=self.bob.timeout)
|
|
13
13
|
resp.raise_for_status()
|
|
14
14
|
data = resp.json()
|
|
15
15
|
values.update({data["name"]: [value['id'] for value in data['values']]})
|
|
16
16
|
else:
|
|
17
|
-
resp = self.bob.session.get(url=f"{self.bob.base_url}company/named-lists")
|
|
17
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}company/named-lists", timeout=self.bob.timeout)
|
|
18
18
|
resp.raise_for_status()
|
|
19
19
|
data = resp.json()
|
|
20
20
|
for list_key, list_data in data.items():
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
import pandas as pd
|
|
3
|
+
from brynq_sdk_functions import Functions
|
|
4
|
+
from .schemas.custom_tables import CustomTableSchema
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class CustomTables:
|
|
8
|
+
def __init__(self, bob):
|
|
9
|
+
self.bob = bob
|
|
10
|
+
|
|
11
|
+
def get(self, employee_id: str, custom_table_id: str) -> (pd.DataFrame, pd.DataFrame):
|
|
12
|
+
"""
|
|
13
|
+
Get custom table data for an employee
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
employee_id: The employee ID
|
|
17
|
+
custom_table_id: The custom table ID
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
A tuple of (valid_data, invalid_data) as pandas DataFrames
|
|
21
|
+
"""
|
|
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()
|
|
25
|
+
|
|
26
|
+
# Normalize the nested JSON response
|
|
27
|
+
df = pd.json_normalize(
|
|
28
|
+
data,
|
|
29
|
+
record_path=['values']
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
df['employee_id'] = employee_id
|
|
33
|
+
df = self.bob.rename_camel_columns_to_snake_case(df)
|
|
34
|
+
valid_data, invalid_data = Functions.validate_data(df=df, schema=CustomTableSchema, debug=True)
|
|
35
|
+
|
|
36
|
+
return valid_data, invalid_data
|
|
@@ -13,7 +13,7 @@ class CustomDocuments:
|
|
|
13
13
|
# self.headers_upload['Accept'] = 'application/json'
|
|
14
14
|
|
|
15
15
|
def get(self, person_id: datetime) -> pd.DataFrame:
|
|
16
|
-
resp = self.bob.session.get(url=f"{self.bob.base_url}docs/people/{person_id}")
|
|
16
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}docs/people/{person_id}", timeout=self.bob.timeout)
|
|
17
17
|
resp.raise_for_status()
|
|
18
18
|
data = resp.json()['documents']
|
|
19
19
|
df = pd.DataFrame(data)
|
|
@@ -29,7 +29,7 @@ class CustomDocuments:
|
|
|
29
29
|
return df
|
|
30
30
|
|
|
31
31
|
def get_folders(self) -> dict:
|
|
32
|
-
resp = self.bob.session.get(url=f"{self.bob.base_url}docs/folders/metadata")
|
|
32
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}docs/folders/metadata", timeout=self.bob.timeout)
|
|
33
33
|
resp.raise_for_status()
|
|
34
34
|
data = resp.json()
|
|
35
35
|
|
|
@@ -42,5 +42,6 @@ class CustomDocuments:
|
|
|
42
42
|
file_object: BytesIO):
|
|
43
43
|
files = {"file": (file_name, file_object, "application/pdf")}
|
|
44
44
|
resp = self.bob.session.post(url=f"{self.bob.base_url}docs/people/{person_id}/folders/{folder_id}/upload",
|
|
45
|
-
files=files
|
|
45
|
+
files=files,
|
|
46
|
+
timeout=self.bob.timeout)
|
|
46
47
|
resp.raise_for_status()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
import pandas as pd
|
|
3
|
+
from brynq_sdk_functions import Functions
|
|
4
|
+
from .schemas.named_lists import NamedListSchema
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class NamedLists:
|
|
8
|
+
def __init__(self, bob):
|
|
9
|
+
self.bob = bob
|
|
10
|
+
|
|
11
|
+
def get(self) -> (pd.DataFrame, pd.DataFrame):
|
|
12
|
+
"""
|
|
13
|
+
Get custom table data for an employee
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
list_name: The list name
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
A tuple of (valid_data, invalid_data) as pandas DataFrames
|
|
20
|
+
"""
|
|
21
|
+
url = f"{self.bob.base_url}company/named-lists/"
|
|
22
|
+
resp = self.bob.session.get(url=url)
|
|
23
|
+
resp.raise_for_status()
|
|
24
|
+
data = resp.json()
|
|
25
|
+
|
|
26
|
+
df = pd.DataFrame([
|
|
27
|
+
{**item, "type": key}
|
|
28
|
+
for key, group in data.items()
|
|
29
|
+
for item in group["values"]
|
|
30
|
+
])
|
|
31
|
+
|
|
32
|
+
# Normalize the nested JSON response
|
|
33
|
+
# df = pd.DataFrame(data.get('values'))
|
|
34
|
+
df = self.bob.rename_camel_columns_to_snake_case(df)
|
|
35
|
+
valid_data, invalid_data = Functions.validate_data(df=df, schema=NamedListSchema, debug=True)
|
|
36
|
+
|
|
37
|
+
return valid_data, invalid_data
|
|
@@ -9,7 +9,7 @@ class Payments:
|
|
|
9
9
|
self.bob = bob
|
|
10
10
|
|
|
11
11
|
def get(self, person_id: str) -> (pd.DataFrame, pd.DataFrame):
|
|
12
|
-
resp = self.bob.session.get(url=f"{self.bob.base_url}people/{person_id}/variable")
|
|
12
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}people/{person_id}/variable", timeout=self.bob.timeout)
|
|
13
13
|
resp.raise_for_status()
|
|
14
14
|
data = resp.json()
|
|
15
15
|
df = pd.json_normalize(
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import pandas as pd
|
|
2
2
|
from brynq_sdk_functions import Functions
|
|
3
|
-
|
|
4
3
|
from .bank import Bank
|
|
5
4
|
from .employment import Employment
|
|
6
5
|
from .salaries import Salaries
|
|
7
6
|
from .schemas.people import PeopleSchema
|
|
8
7
|
from .work import Work
|
|
8
|
+
from .custom_tables import CustomTables
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class People:
|
|
@@ -15,9 +15,10 @@ class People:
|
|
|
15
15
|
self.employment = Employment(bob)
|
|
16
16
|
self.bank = Bank(bob)
|
|
17
17
|
self.work = Work(bob)
|
|
18
|
+
self.custom_tables = CustomTables(bob)
|
|
18
19
|
|
|
19
20
|
def get(self) -> pd.DataFrame:
|
|
20
|
-
resp = self.bob.session.get(url=f"{self.bob.base_url}profiles")
|
|
21
|
+
resp = self.bob.session.get(url=f"{self.bob.base_url}profiles", timeout=self.bob.timeout)
|
|
21
22
|
# Bob sucks with default fields so you need to do a search call to retrieve additional fields.
|
|
22
23
|
additional_fields = [
|
|
23
24
|
"personal.birthDate",
|
|
@@ -27,21 +28,29 @@ class People:
|
|
|
27
28
|
"address.line2",
|
|
28
29
|
"address.activeEffectiveDate",
|
|
29
30
|
"address.country",
|
|
30
|
-
"home.legalGender",
|
|
31
|
+
# "home.legalGender",
|
|
31
32
|
"home.spouse.firstName",
|
|
32
33
|
"home.spouse.surname",
|
|
33
|
-
"home.spouse.birthDate",
|
|
34
|
+
# "home.spouse.birthDate",
|
|
34
35
|
"home.spouse.gender",
|
|
35
36
|
"internal.terminationReason",
|
|
36
37
|
"internal.terminationDate",
|
|
37
38
|
"internal.terminationType",
|
|
38
|
-
"employee.lastDayOfWork"
|
|
39
|
+
"employee.lastDayOfWork",
|
|
40
|
+
# housenumber addition
|
|
41
|
+
"address.customColumns.column_1740046184782",
|
|
42
|
+
# contract end date (bob only fills this when you get a new contract normally)
|
|
43
|
+
"payroll.employment.customColumns.column_1680013460318",
|
|
44
|
+
# iban
|
|
45
|
+
"financial.iban"
|
|
46
|
+
# ploegentoeslag
|
|
39
47
|
]
|
|
40
48
|
resp_additional_fields = self.bob.session.post(url=f"{self.bob.base_url}people/search",
|
|
41
49
|
json={
|
|
42
50
|
"fields": ["root.id"] + additional_fields,
|
|
43
51
|
"filters": []
|
|
44
|
-
}
|
|
52
|
+
},
|
|
53
|
+
timeout=self.bob.timeout)
|
|
45
54
|
df_extra_fields = pd.json_normalize(resp_additional_fields.json()['employees'])
|
|
46
55
|
resp.raise_for_status()
|
|
47
56
|
data = resp.json()
|
|
@@ -5,6 +5,7 @@ import pandas as pd
|
|
|
5
5
|
|
|
6
6
|
class BankSchema(pa.DataFrameModel):
|
|
7
7
|
id: Series[pd.Int64Dtype] = pa.Field(coerce=True)
|
|
8
|
+
employee_id: Series[pd.Int64Dtype] = pa.Field(coerce=True)
|
|
8
9
|
amount: Series[pd.Int64Dtype] = pa.Field(coerce=True)
|
|
9
10
|
allocation: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
10
11
|
branch_address: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import pandera as pa
|
|
2
|
+
from pandera.typing import Series
|
|
3
|
+
import pandas as pd
|
|
4
|
+
|
|
5
|
+
class CustomTableSchema(pa.DataFrameModel):
|
|
6
|
+
id: Series[pd.Int64Dtype] = pa.Field(coerce=True)
|
|
7
|
+
employee_id: Series[pd.Int64Dtype] = pa.Field(coerce=True)
|
|
8
|
+
|
|
9
|
+
class Config:
|
|
10
|
+
coerce = True
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import pandera as pa
|
|
2
|
+
from pandera.typing import Series
|
|
3
|
+
|
|
4
|
+
class NamedListSchema(pa.DataFrameModel):
|
|
5
|
+
id: Series[str] = pa.Field(coerce=True)
|
|
6
|
+
value: Series[str] = pa.Field(coerce=True)
|
|
7
|
+
name: Series[str] = pa.Field(coerce=True)
|
|
8
|
+
archived: Series[bool] = pa.Field(coerce=True)
|
|
9
|
+
# children: Series[list] = pa.Field(coerce=True)
|
|
10
|
+
type: Series[str] = pa.Field(coerce=True)
|
|
11
|
+
|
|
12
|
+
class Config:
|
|
13
|
+
coerce = True
|
|
@@ -24,10 +24,10 @@ class PeopleSchema(pa.DataFrameModel):
|
|
|
24
24
|
personal_pronouns: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
25
25
|
personal_honorific: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
26
26
|
personal_nationality: Series[object] = pa.Field(coerce=True, check_name=check_list)
|
|
27
|
-
employee_payroll_manager: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
28
|
-
employee_hrbp: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
29
|
-
employee_it_admin: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
30
|
-
employee_buddy: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
27
|
+
# employee_payroll_manager: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
28
|
+
# employee_hrbp: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
29
|
+
# employee_it_admin: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
30
|
+
# employee_buddy: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
31
31
|
employee_veteran_status: Series[object] = pa.Field(coerce=True, check_name=check_list)
|
|
32
32
|
employee_disability_status: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
33
33
|
work_start_date: Series[DateTime] = pa.Field(coerce=True, nullable=True)
|
|
@@ -58,12 +58,12 @@ class PeopleSchema(pa.DataFrameModel):
|
|
|
58
58
|
work_original_start_date: Series[DateTime] = pa.Field(coerce=True, nullable=True)
|
|
59
59
|
work_active_effective_date: Series[DateTime] = pa.Field(coerce=True, nullable=True)
|
|
60
60
|
work_direct_reports: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True)
|
|
61
|
-
work_work_change_type: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
61
|
+
# work_work_change_type: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
62
62
|
work_second_level_manager: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True)
|
|
63
63
|
work_days_of_previous_service: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True)
|
|
64
64
|
work_years_of_service: Series[Float] = pa.Field(coerce=True, nullable=True)
|
|
65
65
|
about_food_preferences: Series[object] = pa.Field(coerce=True, check_name=check_list)
|
|
66
|
-
about_social_data_linkedin: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
66
|
+
# about_social_data_linkedin: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
67
67
|
about_social_data_twitter: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
68
68
|
about_social_data_facebook: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
69
69
|
about_superpowers: Series[object] = pa.Field(coerce=True, check_name=check_list)
|
|
@@ -74,12 +74,12 @@ class PeopleSchema(pa.DataFrameModel):
|
|
|
74
74
|
address_post_code: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
75
75
|
address_line1: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
76
76
|
address_line2: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
77
|
-
address_country: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
77
|
+
# address_country: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
78
78
|
address_active_effective_date: Series[DateTime] = pa.Field(coerce=True, nullable=True)
|
|
79
|
-
home_legal_gender: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
79
|
+
# home_legal_gender: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
80
80
|
home_spouse_first_name: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
81
81
|
home_spouse_surname: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
82
|
-
home_spouse_birth_date: Series[DateTime] = pa.Field(coerce=True, nullable=True)
|
|
82
|
+
# home_spouse_birth_date: Series[DateTime] = pa.Field(coerce=True, nullable=True)
|
|
83
83
|
home_spouse_gender: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
84
84
|
internal_termination_reason: Series[String] = pa.Field(coerce=True, nullable=True)
|
|
85
85
|
internal_termination_date: Series[DateTime] = pa.Field(coerce=True, nullable=True)
|
|
@@ -10,7 +10,8 @@ class TimeOff:
|
|
|
10
10
|
|
|
11
11
|
def get(self, since: datetime) -> (pd.DataFrame, pd.DataFrame):
|
|
12
12
|
resp = self.bob.session.get(url=f"{self.bob.base_url}timeoff/requests/changes",
|
|
13
|
-
params={'since': since.replace(tzinfo=timezone.utc).isoformat(timespec='milliseconds')}
|
|
13
|
+
params={'since': since.replace(tzinfo=timezone.utc).isoformat(timespec='milliseconds')},
|
|
14
|
+
timeout=self.bob.timeout)
|
|
14
15
|
resp.raise_for_status()
|
|
15
16
|
data = resp.json()['changes']
|
|
16
17
|
# data = self.bob.get_paginated_result(request)
|
|
@@ -2,8 +2,10 @@ setup.py
|
|
|
2
2
|
brynq_sdk_bob/__init__.py
|
|
3
3
|
brynq_sdk_bob/bank.py
|
|
4
4
|
brynq_sdk_bob/company.py
|
|
5
|
+
brynq_sdk_bob/custom_tables.py
|
|
5
6
|
brynq_sdk_bob/documents.py
|
|
6
7
|
brynq_sdk_bob/employment.py
|
|
8
|
+
brynq_sdk_bob/named_lists.py
|
|
7
9
|
brynq_sdk_bob/payments.py
|
|
8
10
|
brynq_sdk_bob/people.py
|
|
9
11
|
brynq_sdk_bob/salaries.py
|
|
@@ -17,7 +19,9 @@ brynq_sdk_bob.egg-info/requires.txt
|
|
|
17
19
|
brynq_sdk_bob.egg-info/top_level.txt
|
|
18
20
|
brynq_sdk_bob/schemas/__init__.py
|
|
19
21
|
brynq_sdk_bob/schemas/bank.py
|
|
22
|
+
brynq_sdk_bob/schemas/custom_tables.py
|
|
20
23
|
brynq_sdk_bob/schemas/employment.py
|
|
24
|
+
brynq_sdk_bob/schemas/named_lists.py
|
|
21
25
|
brynq_sdk_bob/schemas/payments.py
|
|
22
26
|
brynq_sdk_bob/schemas/people.py
|
|
23
27
|
brynq_sdk_bob/schemas/salary.py
|
|
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
|