brynq-sdk-nmbrs 2.0.1__tar.gz → 2.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 (45) hide show
  1. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/PKG-INFO +1 -1
  2. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/__init__.py +6 -5
  3. brynq_sdk_nmbrs-2.1.0/brynq_sdk_nmbrs/manager.py +294 -0
  4. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/__init__.py +3 -0
  5. brynq_sdk_nmbrs-2.1.0/brynq_sdk_nmbrs/schemas/manager.py +123 -0
  6. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs.egg-info/PKG-INFO +1 -1
  7. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs.egg-info/SOURCES.txt +2 -0
  8. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/setup.py +1 -1
  9. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/address.py +0 -0
  10. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/bank.py +0 -0
  11. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/children.py +0 -0
  12. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/companies.py +0 -0
  13. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/contract.py +0 -0
  14. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/costcenter.py +0 -0
  15. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/costunit.py +0 -0
  16. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/debtors.py +0 -0
  17. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/department.py +0 -0
  18. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/document.py +0 -0
  19. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/employees.py +0 -0
  20. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/employment.py +0 -0
  21. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/function.py +0 -0
  22. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/hours.py +0 -0
  23. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/salaries.py +0 -0
  24. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/salary_tables.py +0 -0
  25. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schedules.py +0 -0
  26. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/address.py +0 -0
  27. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/bank.py +0 -0
  28. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/contracts.py +0 -0
  29. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/costcenter.py +0 -0
  30. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/costunit.py +0 -0
  31. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/debtor.py +0 -0
  32. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/department.py +0 -0
  33. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/employees.py +0 -0
  34. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/employment.py +0 -0
  35. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/function.py +0 -0
  36. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/hours.py +0 -0
  37. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/salary.py +0 -0
  38. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/schedules.py +0 -0
  39. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/schemas/wagecomponents.py +0 -0
  40. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs/wagecomponents.py +0 -0
  41. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs.egg-info/dependency_links.txt +0 -0
  42. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs.egg-info/not-zip-safe +0 -0
  43. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs.egg-info/requires.txt +0 -0
  44. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/brynq_sdk_nmbrs.egg-info/top_level.txt +0 -0
  45. {brynq_sdk_nmbrs-2.0.1 → brynq_sdk_nmbrs-2.1.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq_sdk_nmbrs
3
- Version: 2.0.1
3
+ Version: 2.1.0
4
4
  Summary: Nmbrs wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -20,6 +20,7 @@ from .salary_tables import SalaryTables, SalaryScales, SalarySteps
20
20
  from .employment import Employment
21
21
  from .function import EmployeeFunction
22
22
  from .hours import VariableHours, FixedHours
23
+ from .manager import EmployeeManager, Manager
23
24
  from .salaries import Salaries
24
25
  from .schedules import Schedule
25
26
  from .wagecomponents import EmployeeFixedWageComponents, EmployeeVariableWageComponents
@@ -73,6 +74,8 @@ class Nmbrs(BrynQ):
73
74
  self.function = EmployeeFunction(self)
74
75
  self.fixed_hours = FixedHours(self)
75
76
  self.variable_hours = VariableHours(self)
77
+ self.manager = Manager(self)
78
+ self.employee_manager = EmployeeManager(self)
76
79
  self.salaries = Salaries(self)
77
80
  self.schedule = Schedule(self)
78
81
  self.fixed_wagecomponents = EmployeeFixedWageComponents(self)
@@ -96,23 +99,22 @@ class Nmbrs(BrynQ):
96
99
  def _get_soap_auth_header(self):
97
100
  """
98
101
  Creates the SOAP authentication header using credentials from initial_credentials.
99
-
100
102
  Returns:
101
103
  AuthHeaderWithDomainType: The authentication header for SOAP requests
102
104
  """
103
105
  initial_credentials = self.get_system_credential(system='nmbrs', label='bob')
104
106
  config = initial_credentials.get("config", {})
105
-
107
+
106
108
  # Get the AuthHeaderWithDomain type from the WSDL
107
109
  AuthHeaderWithDomainType = self.soap_client.get_element('ns0:AuthHeaderWithDomain')
108
-
110
+
109
111
  # Create the auth header using credentials from config
110
112
  auth_header = AuthHeaderWithDomainType(
111
113
  Username=config.get("soap_api_username"),
112
114
  Token=config.get("soap_api_token"),
113
115
  Domain=config.get("soap_api_domain")
114
116
  )
115
-
117
+
116
118
  return auth_header
117
119
 
118
120
  def get_paginated_result(self, request: requests.Request) -> List:
@@ -158,4 +160,3 @@ class Nmbrs(BrynQ):
158
160
  df.columns = map(camel_to_snake_case, df.columns)
159
161
 
160
162
  return df
161
-
@@ -0,0 +1,294 @@
1
+ import pandas as pd
2
+ import requests
3
+ from brynq_sdk_functions import Functions as BrynQFunctions
4
+ import math
5
+ from typing import Dict, Any
6
+ from .schemas.manager import (
7
+ ManagerGet, ManagerBasicGet, EmployeeManagerGet, ManagerHistoricBasicGet,
8
+ ManagerCreate, ManagerUpdate, ManagerDelete, UpdateEmployeeManager
9
+ )
10
+
11
+
12
+ class EmployeeManager:
13
+ def __init__(self, nmbrs):
14
+ self.nmbrs = nmbrs
15
+
16
+ def get(self, created_from: str = None) -> tuple[pd.DataFrame, pd.DataFrame]:
17
+ """
18
+ Get employee manager history for all companies.
19
+
20
+ Args:
21
+ created_from: Optional filter to get managers created from a specific date
22
+
23
+ Returns:
24
+ Tuple of (valid_managers, invalid_managers) DataFrames
25
+ """
26
+ managers = pd.DataFrame()
27
+ for company in self.nmbrs.company_ids:
28
+ managers = pd.concat([managers, self._get(company, created_from)])
29
+
30
+ valid_managers, invalid_managers = BrynQFunctions.validate_data(df=managers, schema=EmployeeManagerGet, debug=True)
31
+
32
+ return valid_managers, invalid_managers
33
+
34
+ def _get(self, company_id: str, created_from: str = None) -> pd.DataFrame:
35
+ """
36
+ Get employee manager history for a specific company.
37
+
38
+ Args:
39
+ company_id: The ID of the company
40
+ created_from: Optional filter to get managers created from a specific date
41
+
42
+ Returns:
43
+ DataFrame containing employee manager data
44
+ """
45
+ params = {}
46
+ if created_from:
47
+ params['createdFrom'] = created_from
48
+
49
+ try:
50
+ request = requests.Request(
51
+ method='GET',
52
+ url=f"{self.nmbrs.base_url}companies/{company_id}/employees/managers",
53
+ params=params
54
+ )
55
+ data = self.nmbrs.get_paginated_result(request)
56
+ df = pd.json_normalize(
57
+ data,
58
+ record_path='managers',
59
+ meta=['employeeId']
60
+ )
61
+ df['companyId'] = company_id
62
+ except requests.HTTPError as e:
63
+ df = pd.DataFrame()
64
+
65
+ return df
66
+
67
+ def get_historic_basic(self, created_from: str = None) -> tuple[pd.DataFrame, pd.DataFrame]:
68
+ """
69
+ Get historic basic manager information for employees.
70
+
71
+ Args:
72
+ created_from: Optional filter to get managers created from a specific date
73
+
74
+ Returns:
75
+ Tuple of (valid_managers, invalid_managers) DataFrames
76
+ """
77
+ managers = pd.DataFrame()
78
+ for company in self.nmbrs.company_ids:
79
+ managers = pd.concat([managers, self._get_historic_basic(company, created_from)])
80
+
81
+ valid_managers, invalid_managers = BrynQFunctions.validate_data(df=managers, schema=ManagerHistoricBasicGet, debug=True)
82
+
83
+ return valid_managers, invalid_managers
84
+
85
+ def _get_historic_basic(self, company_id: str, created_from: str = None) -> pd.DataFrame:
86
+ """
87
+ Get historic basic manager information for a specific company.
88
+
89
+ Args:
90
+ company_id: The ID of the company
91
+ created_from: Optional filter to get managers created from a specific date
92
+
93
+ Returns:
94
+ DataFrame containing historic basic manager data
95
+ """
96
+ params = {}
97
+ if created_from:
98
+ params['createdFrom'] = created_from
99
+
100
+ try:
101
+ request = requests.Request(
102
+ method='GET',
103
+ url=f"{self.nmbrs.base_url}companies/{company_id}/employees/managers",
104
+ params=params
105
+ )
106
+ data = self.nmbrs.get_paginated_result(request)
107
+ df = pd.json_normalize(
108
+ data,
109
+ record_path='managers',
110
+ meta=['employeeId']
111
+ )
112
+ df['companyId'] = company_id
113
+ except requests.HTTPError as e:
114
+ df = pd.DataFrame()
115
+
116
+ return df
117
+
118
+ def update(self, employee_id: str, data: Dict[str, Any]):
119
+ """
120
+ Update the manager of a specific employee using Pydantic validation.
121
+
122
+ Args:
123
+ employee_id: The ID of the employee
124
+ data: Dictionary containing manager data with fields matching
125
+ the UpdateEmployeeManager schema (using camelCase field names)
126
+
127
+ Returns:
128
+ Response from the API
129
+ """
130
+ # Validate with Pydantic model
131
+ manager_model = UpdateEmployeeManager(**data)
132
+
133
+ if self.nmbrs.mock_mode:
134
+ return manager_model
135
+
136
+ # Convert validated model to dict for API payload
137
+ payload = manager_model.dict(exclude_none=True)
138
+
139
+ # Send request
140
+ resp = self.nmbrs.session.put(
141
+ url=f"{self.nmbrs.base_url}employees/{employee_id}/manager",
142
+ json=payload,
143
+ timeout=self.nmbrs.timeout
144
+ )
145
+ return resp
146
+
147
+
148
+ class Manager:
149
+ def __init__(self, nmbrs):
150
+ self.nmbrs = nmbrs
151
+
152
+ def get(self, debtor_id: str) -> tuple[pd.DataFrame, pd.DataFrame]:
153
+ """
154
+ Get all managers for a specific debtor.
155
+
156
+ Args:
157
+ debtor_id: The ID of the debtor
158
+
159
+ Returns:
160
+ Tuple of (valid_managers, invalid_managers) DataFrames
161
+ """
162
+ try:
163
+ request = requests.Request(
164
+ method='GET',
165
+ url=f"{self.nmbrs.base_url}debtors/{debtor_id}/managers"
166
+ )
167
+
168
+ data = self.nmbrs.get_paginated_result(request)
169
+ df = pd.DataFrame(data)
170
+ df['debtorId'] = debtor_id
171
+
172
+ valid_managers, invalid_managers = BrynQFunctions.validate_data(df=df, schema=ManagerGet, debug=True)
173
+
174
+ except requests.HTTPError as e:
175
+ df = pd.DataFrame()
176
+ valid_managers = df
177
+ invalid_managers = df
178
+
179
+ return valid_managers, invalid_managers
180
+
181
+ def get_basic(self, debtor_id: str) -> tuple[pd.DataFrame, pd.DataFrame]:
182
+ """
183
+ Get basic manager information for a specific debtor.
184
+
185
+ Args:
186
+ debtor_id: The ID of the debtor
187
+
188
+ Returns:
189
+ Tuple of (valid_managers, invalid_managers) DataFrames
190
+ """
191
+ try:
192
+ request = requests.Request(
193
+ method='GET',
194
+ url=f"{self.nmbrs.base_url}debtors/{debtor_id}/managers"
195
+ )
196
+
197
+ data = self.nmbrs.get_paginated_result(request)
198
+ df = pd.DataFrame(data)
199
+ df['debtorId'] = debtor_id
200
+
201
+ valid_managers, invalid_managers = BrynQFunctions.validate_data(df=df, schema=ManagerBasicGet, debug=True)
202
+
203
+ except requests.HTTPError as e:
204
+ df = pd.DataFrame()
205
+ valid_managers = df
206
+ invalid_managers = df
207
+
208
+ return valid_managers, invalid_managers
209
+
210
+ def create(self, debtor_id: str, data: Dict[str, Any]):
211
+ """
212
+ Create a new manager using Pydantic validation.
213
+
214
+ Args:
215
+ debtor_id: The ID of the debtor
216
+ data: Dictionary containing manager data with fields matching
217
+ the ManagerCreate schema (using camelCase field names)
218
+
219
+ Returns:
220
+ Response from the API
221
+ """
222
+ # Validate with Pydantic model
223
+ manager_model = ManagerCreate(**data)
224
+
225
+ if self.nmbrs.mock_mode:
226
+ return manager_model
227
+
228
+ # Convert validated model to dict for API payload
229
+ payload = manager_model.dict(exclude_none=True)
230
+
231
+ # Send request
232
+ resp = self.nmbrs.session.post(
233
+ url=f"{self.nmbrs.base_url}debtors/{debtor_id}/managers",
234
+ json=payload,
235
+ timeout=self.nmbrs.timeout
236
+ )
237
+ return resp
238
+
239
+ def update(self, debtor_id: str, data: Dict[str, Any]):
240
+ """
241
+ Update a manager using Pydantic validation.
242
+
243
+ Args:
244
+ debtor_id: The ID of the debtor
245
+ data: Dictionary containing manager data with fields matching
246
+ the ManagerUpdate schema (using camelCase field names)
247
+
248
+ Returns:
249
+ Response from the API
250
+ """
251
+ # Validate with Pydantic model
252
+ manager_model = ManagerUpdate(**data)
253
+
254
+ if self.nmbrs.mock_mode:
255
+ return manager_model
256
+
257
+ # Convert validated model to dict for API payload
258
+ payload = manager_model.dict(exclude_none=True)
259
+
260
+ # Send request
261
+ resp = self.nmbrs.session.put(
262
+ url=f"{self.nmbrs.base_url}debtors/{debtor_id}/managers/{payload['managerId']}",
263
+ json=payload,
264
+ timeout=self.nmbrs.timeout
265
+ )
266
+ return resp
267
+
268
+ def delete(self, debtor_id: str, data: Dict[str, Any]):
269
+ """
270
+ Delete a manager using Pydantic validation.
271
+
272
+ Args:
273
+ debtor_id: The ID of the debtor
274
+ data: Dictionary containing manager data with fields matching
275
+ the ManagerDelete schema (using camelCase field names)
276
+
277
+ Returns:
278
+ Response from the API
279
+ """
280
+ # Validate with Pydantic model
281
+ manager_model = ManagerDelete(**data)
282
+
283
+ if self.nmbrs.mock_mode:
284
+ return manager_model
285
+
286
+ # Convert validated model to dict for API payload
287
+ payload = manager_model.dict(exclude_none=True)
288
+
289
+ # Send request
290
+ resp = self.nmbrs.session.delete(
291
+ url=f"{self.nmbrs.base_url}debtors/{debtor_id}/managers/{payload['managerId']}",
292
+ timeout=self.nmbrs.timeout
293
+ )
294
+ return resp
@@ -10,6 +10,7 @@ from .employees import EmployeeGet, EmployeeCreate, EmployeeUpdate, EmployeeDele
10
10
  from .employment import EmploymentGet, EmploymentCreate, EmploymentUpdate, EmploymentDelete
11
11
  from .function import FunctionGet, FunctionCreate, FunctionUpdate, FunctionDelete
12
12
  from .hours import FixedHoursGet, FixedHoursCreate, FixedHoursUpdate, HoursDelete, VariableHoursGet, VariableHoursCreate, VariableHoursUpdate
13
+ from .manager import ManagerGet, ManagerBasicGet, EmployeeManagerGet, ManagerHistoricBasicGet, ManagerCreate, ManagerUpdate, ManagerDelete, UpdateEmployeeManager
13
14
  from .salary import SalaryGet, SalaryCreate, SalaryUpdate, SalaryDelete
14
15
  from .wagecomponents import FixedWageComponentGet, FixedWageComponentCreate, FixedWageComponentUpdate, WageComponentDelete, VariableWageComponentGet, VariableWageComponentCreate, VariableWageComponentUpdate
15
16
 
@@ -25,6 +26,8 @@ __all__ = [
25
26
  'FunctionGet', 'FunctionCreate', 'FunctionUpdate', 'FunctionDelete',
26
27
  'FixedHoursGet', 'FixedHoursCreate', 'FixedHoursUpdate', 'HoursDelete',
27
28
  'VariableHoursGet', 'VariableHoursCreate', 'VariableHoursUpdate',
29
+ 'ManagerGet', 'ManagerBasicGet', 'EmployeeManagerGet', 'ManagerHistoricBasicGet',
30
+ 'ManagerCreate', 'ManagerUpdate', 'ManagerDelete', 'UpdateEmployeeManager',
28
31
  'SalaryGet', 'SalaryCreate', 'SalaryUpdate', 'SalaryDelete',
29
32
  'FixedWageComponentGet', 'FixedWageComponentCreate', 'FixedWageComponentUpdate', 'WageComponentDelete',
30
33
  'VariableWageComponentGet', 'VariableWageComponentCreate', 'VariableWageComponentUpdate'
@@ -0,0 +1,123 @@
1
+ from datetime import datetime
2
+
3
+ import pandas as pd
4
+ import pandera as pa
5
+ from pandera.typing import Series, String, Float, DateTime
6
+ import pandera.extensions as extensions
7
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
8
+
9
+ from typing import Optional
10
+ from pydantic import BaseModel, Field
11
+
12
+ # ---------------------------
13
+ # Get Schemas
14
+ # ---------------------------
15
+ class ManagerGet(BrynQPanderaDataFrameModel):
16
+ manager_id: Series[pa.String] = pa.Field(coerce=True, description="Manager unique identifier", alias="managerId")
17
+ number: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="The manager's number", alias="number")
18
+ first_name: Series[pa.String] = pa.Field(coerce=True, description="The manager's first name", alias="firstName")
19
+ last_name: Series[pa.String] = pa.Field(coerce=True, description="The manager's last name", alias="lastName")
20
+ gender: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="The manager's gender", alias="gender")
21
+ phone_number: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="The manager's phone number", alias="phoneNumber")
22
+ cellphone: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="The manager's cellphone", alias="cellphone")
23
+ fax: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="The manager's fax", alias="fax")
24
+ email: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="The manager's email", alias="email")
25
+ department_id: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Department ID", alias="department.departmentId")
26
+ department_code: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Department Code", alias="department.code")
27
+ department_description: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Department Description", alias="department.description")
28
+ department_created_at: Series[datetime] = pa.Field(coerce=True, nullable=True, description="Department Created At", alias="department.createdAt")
29
+ function_id: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Function ID", alias="function.functionId")
30
+ function_code: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Function Code", alias="function.code")
31
+ function_description: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Function Description", alias="function.description")
32
+ function_created_at: Series[datetime] = pa.Field(coerce=True, nullable=True, description="Function Created At", alias="function.createdAt")
33
+
34
+ class _Annotation:
35
+ primary_key = "manager_id"
36
+
37
+ class ManagerBasicGet(BrynQPanderaDataFrameModel):
38
+ manager_id: Series[pa.String] = pa.Field(coerce=True, description="Manager unique identifier", alias="managerId")
39
+ first_name: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager first name", alias="firstName")
40
+ last_name: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager last name", alias="lastName")
41
+ email: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager email", alias="email")
42
+
43
+ class _Annotation:
44
+ primary_key = "manager_id"
45
+
46
+ class EmployeeManagerGet(BrynQPanderaDataFrameModel):
47
+ employee_id: Series[pa.String] = pa.Field(coerce=True, description="Employee ID", alias="employeeId")
48
+ manager_id: Series[pa.String] = pa.Field(coerce=True, description="Manager ID", alias="managerId")
49
+ number: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Manager number", alias="number")
50
+ first_name: Series[pa.String] = pa.Field(coerce=True, description="Manager first name", alias="firstName")
51
+ last_name: Series[pa.String] = pa.Field(coerce=True, description="Manager last name", alias="lastName")
52
+ gender: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager gender", alias="gender")
53
+ phone_number: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager phone number", alias="phoneNumber")
54
+ cellphone: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager cellphone", alias="cellphone")
55
+ fax: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager fax", alias="fax")
56
+ email: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager email", alias="email")
57
+ created_at: Series[datetime] = pa.Field(coerce=True, description="Manager created at", alias="createdAt")
58
+ period_period: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Period", alias="period.period")
59
+ period_year: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Year", alias="period.year")
60
+ department_id: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Department ID", alias="department.departmentId")
61
+ department_code: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Department Code", alias="department.code")
62
+ department_description: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Department Description", alias="department.description")
63
+ department_created_at: Series[datetime] = pa.Field(coerce=True, nullable=True, description="Department Created At", alias="department.createdAt")
64
+ function_id: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Function ID", alias="function.functionId")
65
+ function_code: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Function Code", alias="function.code")
66
+ function_description: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Function Description", alias="function.description")
67
+ function_created_at: Series[datetime] = pa.Field(coerce=True, nullable=True, description="Function Created At", alias="function.createdAt")
68
+
69
+ class _Annotation:
70
+ primary_key = "manager_id"
71
+ foreign_keys = {
72
+ "employee_id": {
73
+ "parent_schema": "EmployeeSchema",
74
+ "parent_column": "employee_id",
75
+ "cardinality": "N:1"
76
+ }
77
+ }
78
+
79
+ class ManagerHistoricBasicGet(BrynQPanderaDataFrameModel):
80
+ employee_id: Series[pa.String] = pa.Field(coerce=True, description="Employee ID", alias="employeeId")
81
+ manager_id: Series[pa.String] = pa.Field(coerce=True, description="Manager ID", alias="managerId")
82
+ first_name: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager first name", alias="firstName")
83
+ last_name: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager last name", alias="lastName")
84
+ email: Series[pa.String] = pa.Field(coerce=True, nullable=True, description="Manager email", alias="email")
85
+ created_at: Series[datetime] = pa.Field(coerce=True, description="Manager created at", alias="createdAt")
86
+
87
+ class _Annotation:
88
+ primary_key = "manager_id"
89
+ foreign_keys = {
90
+ "employee_id": {
91
+ "parent_schema": "EmployeeSchema",
92
+ "parent_column": "employee_id",
93
+ "cardinality": "N:1"
94
+ }
95
+ }
96
+
97
+ # ---------------------------
98
+ # Upload Schemas
99
+ # ---------------------------
100
+ class Period(BaseModel):
101
+ year: int = Field(..., ge=1900, le=2100, example=2021, description="Year", alias="year")
102
+ period: int = Field(..., ge=1, le=53, example=4, description="Period", alias="period")
103
+
104
+ class ManagerCreate(BaseModel):
105
+ number: int = Field(..., ge=1, example=1, description="Manager number", alias="number")
106
+ first_name: str = Field(..., max_length=100, example="John", description="Manager first name", alias="firstName")
107
+ last_name: str = Field(..., max_length=100, example="Doe", description="Manager last name", alias="lastName")
108
+ gender: Optional[str] = Field(None, example="Male", description="Manager gender", alias="gender")
109
+ phone_number: Optional[str] = Field(None, max_length=50, example="0640986755", description="Manager phone number", alias="phoneNumber")
110
+ cellphone: Optional[str] = Field(None, max_length=50, example="0640986755", description="Manager cellphone", alias="cellphone")
111
+ fax: Optional[str] = Field(None, max_length=50, description="Manager fax", alias="fax")
112
+ email: Optional[str] = Field(None, max_length=100, example="john.doe@company.com", description="Manager email", alias="email")
113
+
114
+ class ManagerUpdate(BaseModel):
115
+ manager_id: str = Field(..., example="2f6aa11c-504a-49a1-903b-e15e79965702", description="Manager ID", alias="managerId")
116
+ period_details: Period = Field(..., alias="periodDetails")
117
+
118
+ class ManagerDelete(BaseModel):
119
+ manager_id: str = Field(..., example="2f6aa11c-504a-49a1-903b-e15e79965702", description="Manager ID", alias="managerId")
120
+
121
+ class UpdateEmployeeManager(BaseModel):
122
+ manager_id: str = Field(..., example="2f6aa11c-504a-49a1-903b-e15e79965702", description="Manager ID", alias="managerId")
123
+ period_details: Period = Field(..., alias="periodDetails")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: brynq-sdk-nmbrs
3
- Version: 2.0.1
3
+ Version: 2.1.0
4
4
  Summary: Nmbrs wrapper from BrynQ
5
5
  Home-page: UNKNOWN
6
6
  Author: BrynQ
@@ -14,6 +14,7 @@ brynq_sdk_nmbrs/employees.py
14
14
  brynq_sdk_nmbrs/employment.py
15
15
  brynq_sdk_nmbrs/function.py
16
16
  brynq_sdk_nmbrs/hours.py
17
+ brynq_sdk_nmbrs/manager.py
17
18
  brynq_sdk_nmbrs/salaries.py
18
19
  brynq_sdk_nmbrs/salary_tables.py
19
20
  brynq_sdk_nmbrs/schedules.py
@@ -36,6 +37,7 @@ brynq_sdk_nmbrs/schemas/employees.py
36
37
  brynq_sdk_nmbrs/schemas/employment.py
37
38
  brynq_sdk_nmbrs/schemas/function.py
38
39
  brynq_sdk_nmbrs/schemas/hours.py
40
+ brynq_sdk_nmbrs/schemas/manager.py
39
41
  brynq_sdk_nmbrs/schemas/salary.py
40
42
  brynq_sdk_nmbrs/schemas/schedules.py
41
43
  brynq_sdk_nmbrs/schemas/wagecomponents.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_namespace_packages
2
2
 
3
3
  setup(
4
4
  name='brynq_sdk_nmbrs',
5
- version='2.0.1',
5
+ version='2.1.0',
6
6
  description='Nmbrs wrapper from BrynQ',
7
7
  long_description='Nmbrs wrapper from BrynQ',
8
8
  author='BrynQ',