brynq-sdk-bob 2.6.6__tar.gz → 2.6.8__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.6 → brynq_sdk_bob-2.6.8}/PKG-INFO +1 -1
  2. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/__init__.py +3 -4
  3. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/people.py +27 -1
  4. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/people.py +8 -2
  5. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob.egg-info/PKG-INFO +1 -1
  6. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/setup.py +1 -1
  7. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/bank.py +0 -0
  8. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/company.py +0 -0
  9. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/custom_tables.py +0 -0
  10. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/documents.py +0 -0
  11. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/employment.py +0 -0
  12. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/named_lists.py +0 -0
  13. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/payments.py +0 -0
  14. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/payroll_history.py +0 -0
  15. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/salaries.py +0 -0
  16. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/__init__.py +0 -0
  17. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/bank.py +0 -0
  18. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/custom_tables.py +0 -0
  19. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/employment.py +0 -0
  20. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/named_lists.py +0 -0
  21. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/payments.py +0 -0
  22. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/payroll_history.py +0 -0
  23. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/salary.py +0 -0
  24. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/timeoff.py +0 -0
  25. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/schemas/work.py +0 -0
  26. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/timeoff.py +0 -0
  27. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob/work.py +0 -0
  28. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob.egg-info/SOURCES.txt +0 -0
  29. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob.egg-info/dependency_links.txt +0 -0
  30. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob.egg-info/not-zip-safe +0 -0
  31. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob.egg-info/requires.txt +0 -0
  32. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/brynq_sdk_bob.egg-info/top_level.txt +0 -0
  33. {brynq_sdk_bob-2.6.6 → brynq_sdk_bob-2.6.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq_sdk_bob
3
- Version: 2.6.6
3
+ Version: 2.6.8
4
4
  Summary: Bob wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -1,11 +1,8 @@
1
1
  import base64
2
- import re
3
- from typing import Union, List, Optional, Literal
4
- import pandas as pd
2
+ from typing import List, Optional, Literal
5
3
  import requests
6
4
  import os
7
5
  from brynq_sdk_brynq import BrynQ
8
- from brynq_sdk_functions import Functions
9
6
  from .bank import Bank
10
7
  from .company import Company
11
8
  from .documents import CustomDocuments
@@ -17,6 +14,7 @@ from .salaries import Salaries
17
14
  from .timeoff import TimeOff
18
15
  from .work import Work
19
16
  from .custom_tables import CustomTables
17
+ from .payroll_history import History
20
18
 
21
19
  class Bob(BrynQ):
22
20
  def __init__(self, system_type: Optional[Literal['source', 'target']] = None, test_environment: bool = True, debug: bool = False, target_system: str = None):
@@ -40,6 +38,7 @@ class Bob(BrynQ):
40
38
  self.companies = Company(self)
41
39
  self.named_lists = NamedLists(self)
42
40
  self.custom_tables = CustomTables(self)
41
+ self.payroll_history = History(self)
43
42
  self.data_interface_id = os.getenv("DATA_INTERFACE_ID")
44
43
  self.debug = debug
45
44
 
@@ -1,4 +1,5 @@
1
1
  import pandas as pd
2
+ import re
2
3
  from typing import Optional
3
4
  from brynq_sdk_functions import Functions
4
5
  from brynq_sdk_functions import BrynQPanderaDataFrameModel
@@ -21,6 +22,7 @@ class People:
21
22
  self.schema = PeopleSchema
22
23
 
23
24
 
25
+
24
26
  # Build API fields using column metadata if present (api_field), otherwise use the column (alias) name
25
27
  def __build_api_fields(self, schema_model: BrynQPanderaDataFrameModel) -> list[str]:
26
28
  schema = schema_model.to_schema()
@@ -74,6 +76,30 @@ class People:
74
76
 
75
77
 
76
78
  valid_people, invalid_people = Functions.validate_data(df=valid_people, schema=PeopleSchema, debug=True)
77
- valid_people = valid_people.loc[:, ~valid_people.columns.str.contains(r'\.value|_get')]
78
79
 
80
+ # For columns ending with .value.value, use fillna to fill the corresponding base column since that's not done automatically
81
+ def _normalize_key(key: str) -> str:
82
+ # Build mapping from custom schema alias (API path) to the real column name used after validation
83
+ key = key.lstrip('.')
84
+ key = key.replace('/', '.')
85
+ key = key.replace('.', '_')
86
+ key = re.sub(r'(?<!^)([A-Z])', r'_\1', key).lower()
87
+ return key
88
+
89
+ alias_to_real: dict = {}
90
+ if schema_custom_fields is not None:
91
+ alias_map = getattr(schema_custom_fields, "_alias_map", {}) # real_name -> alias
92
+ alias_to_real = {_normalize_key(alias): real for real, alias in alias_map.items()}
93
+
94
+ for col in valid_people.columns:
95
+ if col.endswith('value.value'):
96
+ # Compute the base alias (remove suffix), normalise, and resolve to real column name via custom schema
97
+ base_alias = col[:-12]
98
+ target_key = _normalize_key(base_alias)
99
+ target_col = alias_to_real.get(target_key, target_key)
100
+ if target_col in valid_people.columns:
101
+ valid_people[target_col] = valid_people[target_col].fillna(valid_people[col])
102
+
103
+ # Remove columns that contain '.value' or '_get'
104
+ valid_people = valid_people.loc[:, ~valid_people.columns.str.contains(r'\.value|_get')]
79
105
  return valid_people, pd.concat([invalid_people, invalid_people_custom])
@@ -220,10 +220,16 @@ class PeopleSchema(BrynQPanderaDataFrameModel):
220
220
  payroll_employment_weekly_hours: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Weekly Hours", alias="payroll.employment.weeklyHours")
221
221
 
222
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")
223
+ # SOLUTION NOW FOR MFT: TODO: FIX UNNESTING (including .value.value)
224
+ payroll_salary_monthly_get: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="Base salary (monthly), used for getting nested json", alias="payroll.salary.monthlyPayment")
225
+ payroll_salary_monthly_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base salary (monthly)", alias="payroll.salary.monthlyPayment.value")
226
+ payroll_salary_monthly_payment_currency: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="Base salary (monthly) currency", alias="payroll.salary.monthlyPayment.currency")
227
+
224
228
  payroll_salary_yearly_get: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly), used for getting nested json", alias="payroll.salary.yearlyPayment")
225
229
  payroll_salary_yearly_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly)", alias="payroll.salary.yearlyPayment.value")
226
- payroll_salary_yearly_payment_currency: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly)", alias="payroll.salary.yearlyPayment.currency")
230
+ payroll_salary_yearly_payment_currency: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="Base salary (yearly) currency", alias="payroll.salary.yearlyPayment.currency")
231
+
232
+ payroll_salary_active_effective_date: Optional[Series[str]] = pa.Field(coerce=True, nullable=True, description="effective date payment", alias="payroll.salary.activeEffectiveDate")
227
233
  payroll_salary_payment: Optional[Series[Float]] = pa.Field(coerce=True, nullable=True, description="Base Salary", alias="payroll.salary.payment")
228
234
 
229
235
  # Emergency contact
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq-sdk-bob
3
- Version: 2.6.6
3
+ Version: 2.6.8
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.6',
5
+ version='2.6.8',
6
6
  description='Bob wrapper from BrynQ',
7
7
  long_description='Bob wrapper from BrynQ',
8
8
  author='BrynQ',
File without changes