brynq-sdk-bob 1.0.0__tar.gz → 1.1.0__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 (31) hide show
  1. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/PKG-INFO +1 -1
  2. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/__init__.py +3 -2
  3. brynq_sdk_bob-1.1.0/brynq_sdk_bob/custom_tables.py +36 -0
  4. brynq_sdk_bob-1.1.0/brynq_sdk_bob/named_lists.py +37 -0
  5. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/people.py +12 -4
  6. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/bank.py +1 -0
  7. brynq_sdk_bob-1.1.0/brynq_sdk_bob/schemas/custom_tables.py +10 -0
  8. brynq_sdk_bob-1.1.0/brynq_sdk_bob/schemas/named_lists.py +13 -0
  9. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/people.py +9 -9
  10. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
  11. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob.egg-info/SOURCES.txt +4 -0
  12. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/setup.py +1 -1
  13. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/bank.py +0 -0
  14. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/company.py +0 -0
  15. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/documents.py +0 -0
  16. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/employment.py +0 -0
  17. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/payments.py +0 -0
  18. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/salaries.py +0 -0
  19. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/__init__.py +0 -0
  20. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/employment.py +0 -0
  21. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/payments.py +0 -0
  22. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/salary.py +0 -0
  23. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/timeoff.py +0 -0
  24. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/schemas/work.py +0 -0
  25. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/timeoff.py +0 -0
  26. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob/work.py +0 -0
  27. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
  28. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
  29. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob.egg-info/requires.txt +0 -0
  30. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
  31. {brynq_sdk_bob-1.0.0 → brynq_sdk_bob-1.1.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq_sdk_bob
3
- Version: 1.0.0
3
+ Version: 1.1.0
4
4
  Summary: Bob wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -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,7 @@ 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)
37
38
 
38
39
  def _get_request_headers(self, label):
39
40
  credentials = self.get_system_credential(system='bob', label=label)
@@ -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
@@ -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
@@ -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,6 +15,7 @@ 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
21
  resp = self.bob.session.get(url=f"{self.bob.base_url}profiles")
@@ -27,15 +28,22 @@ 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={
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq-sdk-bob
3
- Version: 1.0.0
3
+ Version: 1.1.0
4
4
  Summary: Bob wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -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
@@ -2,7 +2,7 @@ from setuptools import setup, find_namespace_packages
2
2
 
3
3
  setup(
4
4
  name='brynq_sdk_bob',
5
- version='1.0.0',
5
+ version='1.1.0',
6
6
  description='Bob wrapper from BrynQ',
7
7
  long_description='Bob wrapper from BrynQ',
8
8
  author='BrynQ',
File without changes