brynq-sdk-nmbrs 2.3.2.dev0__py3-none-any.whl → 2.3.3.dev0__py3-none-any.whl

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_nmbrs/bank.py CHANGED
@@ -1,9 +1,12 @@
1
1
  import math
2
+ from typing import Any, Dict
3
+
2
4
  import pandas as pd
3
5
  import requests
6
+
4
7
  from brynq_sdk_functions import Functions
5
- from typing import Dict, Any
6
- from .schemas.bank import BankGet, BankCreate, BankUpdate, BankDelete
8
+
9
+ from .schemas.bank import BankCreate, BankDelete, BankGet, BankUpdate
7
10
 
8
11
 
9
12
  class Bank:
@@ -1,12 +1,15 @@
1
+ from typing import Annotated, Optional
2
+
1
3
  import pandas as pd
2
4
  import pandera as pa
3
- from pandera import Bool
4
- from pandera.typing import Series, String, Float, DateTime
5
5
  import pandera.extensions as extensions
6
- from brynq_sdk_functions import BrynQPanderaDataFrameModel
7
- from typing import Optional, Annotated
6
+ from pandera import Bool
7
+ from pandera.typing import DateTime, Float, Series, String
8
8
  from pydantic import BaseModel, Field, StringConstraints
9
9
 
10
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
11
+
12
+
10
13
  # ---------------------------
11
14
  # Get Schemas
12
15
  # ---------------------------
@@ -98,4 +101,4 @@ class AddressUpdate(BaseModel):
98
101
  address_type: str = Field("HomeAddress", example="HomeAddress", description="Address type", alias="type")
99
102
 
100
103
  class Config:
101
- populate_by_name = True
104
+ populate_by_name = True
@@ -1,20 +1,26 @@
1
1
  from datetime import datetime
2
- from typing import Dict, Any, Optional
2
+ from typing import Any, Dict, Optional
3
+
3
4
  import pandas as pd
4
5
  import pandera as pa
5
- from pandera import Bool, Int
6
- from pandera.typing import Series, String, Float, DateTime
7
6
  import pandera.extensions as extensions
8
- from brynq_sdk_functions import BrynQPanderaDataFrameModel
7
+ from pandera import Bool, Int
8
+ from pandera.typing import DateTime, Float, Series, String
9
9
  from pydantic import BaseModel, Field
10
10
 
11
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
12
+
13
+
11
14
  # ---------------------------
12
15
  # Get Schemas
13
16
  # ---------------------------
14
17
  class ScheduleGet(BrynQPanderaDataFrameModel):
15
18
  schedule_id: Series[String] = pa.Field(coerce=True, description="Schedule ID", alias="scheduleId")
16
- start_date: Series[datetime] = pa.Field(coerce=True, description="Start Date", alias="startDate")
19
+ start_date_schedule: Series[datetime] = pa.Field(coerce=True, description="Start Date", alias="startDate")
17
20
  parttime_percentage: Series[Float] = pa.Field(coerce=True, description="Part-Time Percentage", alias="parttimePercentage")
21
+ hours_per_week: Series[Float] = pa.Field(coerce=True, nullable=True, description="Hours per week", alias="hoursPerWeek")
22
+ days_per_week: Series[Float] = pa.Field(coerce=True, nullable=True, description="Days per week", alias="daysPerWeek")
23
+
18
24
  week1_hours_monday: Series[Float] = pa.Field(coerce=True, description="Week 1 Hours Monday", alias="week1.hoursMonday")
19
25
  week1_hours_tuesday: Series[Float] = pa.Field(coerce=True, description="Week 1 Hours Tuesday", alias="week1.hoursTuesday")
20
26
  week1_hours_wednesday: Series[Float] = pa.Field(coerce=True, description="Week 1 Hours Wednesday", alias="week1.hoursWednesday")
@@ -42,19 +48,28 @@ class ScheduleGet(BrynQPanderaDataFrameModel):
42
48
  }
43
49
  }
44
50
 
45
-
46
51
  # ---------------------------
47
52
  # Upload Schemas
48
53
  # ---------------------------
49
- class ScheduleHours(BaseModel):
54
+ class ScheduleHoursWeek1(BaseModel):
55
+ """Schedule hours for each day of the week"""
56
+ week1_hours_monday: Optional[float] = Field(None, description="Monday hours", alias="hoursMonday")
57
+ week1_hours_tuesday: Optional[float] = Field(None, description="Tuesday hours", alias="hoursTuesday")
58
+ week1_hours_wednesday: Optional[float] = Field(None, description="Wednesday hours", alias="hoursWednesday")
59
+ week1_hours_thursday: Optional[float] = Field(None, description="Thursday hours", alias="hoursThursday")
60
+ week1_hours_friday: Optional[float] = Field(None, description="Friday hours", alias="hoursFriday")
61
+ week1_hours_saturday: Optional[float] = Field(None, description="Saturday hours", alias="hoursSaturday")
62
+ week1_hours_sunday: Optional[float] = Field(None, description="Sunday hours", alias="hoursSunday")
63
+
64
+ class ScheduleHoursWeek2(BaseModel):
50
65
  """Schedule hours for each day of the week"""
51
- hours_monday: Optional[float] = Field(None, description="Monday hours", alias="hoursMonday")
52
- hours_tuesday: Optional[float] = Field(None, description="Tuesday hours", alias="hoursTuesday")
53
- hours_wednesday: Optional[float] = Field(None, description="Wednesday hours", alias="hoursWednesday")
54
- hours_thursday: Optional[float] = Field(None, description="Thursday hours", alias="hoursThursday")
55
- hours_friday: Optional[float] = Field(None, description="Friday hours", alias="hoursFriday")
56
- hours_saturday: Optional[float] = Field(None, description="Saturday hours", alias="hoursSaturday")
57
- hours_sunday: Optional[float] = Field(None, description="Sunday hours", alias="hoursSunday")
66
+ week2_hours_monday: Optional[float] = Field(None, description="Monday hours", alias="hoursMonday")
67
+ week2_hours_tuesday: Optional[float] = Field(None, description="Tuesday hours", alias="hoursTuesday")
68
+ week2_hours_wednesday: Optional[float] = Field(None, description="Wednesday hours", alias="hoursWednesday")
69
+ week2_hours_thursday: Optional[float] = Field(None, description="Thursday hours", alias="hoursThursday")
70
+ week2_hours_friday: Optional[float] = Field(None, description="Friday hours", alias="hoursFriday")
71
+ week2_hours_saturday: Optional[float] = Field(None, description="Saturday hours", alias="hoursSaturday")
72
+ week2_hours_sunday: Optional[float] = Field(None, description="Sunday hours", alias="hoursSunday")
58
73
 
59
74
  class ScheduleCreate(BaseModel):
60
75
  """
@@ -62,8 +77,9 @@ class ScheduleCreate(BaseModel):
62
77
  """
63
78
  start_date_schedule: datetime = Field(..., description="Start date of the schedule", example="2021-01-01T09:29:18Z", alias="startDate")
64
79
  hours_per_week: Optional[float] = Field(None, description="Hours per week", example=40, alias="hoursPerWeek")
65
- week1: Optional[ScheduleHours] = Field(None, description="Week 1 schedule hours", alias="week1")
66
- week2: Optional[ScheduleHours] = Field(None, description="Week 2 schedule hours", alias="week2")
80
+ # split per week schema so we can better sync with get fields.
81
+ week1: Optional[ScheduleHoursWeek1] = Field(None, description="Week 1 schedule hours", alias="week1")
82
+ week2: Optional[ScheduleHoursWeek2] = Field(None, description="Week 2 schedule hours", alias="week2")
67
83
 
68
84
  class Config:
69
85
  json_encoders = {
@@ -141,4 +157,4 @@ class ScheduleUpdate(BaseModel):
141
157
  )
142
158
 
143
159
  class Config:
144
- populate_by_name = True
160
+ populate_by_name = True
@@ -1,11 +1,19 @@
1
1
  import math
2
+ from typing import Optional
3
+
2
4
  import pandas as pd
3
5
  import pandera as pa
4
- from pandera.typing import Series, String, Float
5
- from brynq_sdk_functions import BrynQPanderaDataFrameModel
6
+ from pandera.typing import Float, Series, String
7
+ from pydantic import (
8
+ BaseModel,
9
+ Field,
10
+ confloat,
11
+ conint,
12
+ field_validator,
13
+ model_serializer,
14
+ )
6
15
 
7
- from typing import Optional
8
- from pydantic import BaseModel, Field, conint, confloat
16
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
9
17
 
10
18
 
11
19
  # ---------------------------
@@ -61,8 +69,8 @@ class VariableWageComponentGet(BrynQPanderaDataFrameModel):
61
69
  # Upload Schemas
62
70
  # ---------------------------
63
71
  class PeriodPost(BaseModel):
64
- year: int = Field(..., ge=1900, le=2100, example=2021, description="Year", alias="year")
65
- period: int = Field(..., ge=1, le=53, example=4, description="Period", alias="period")
72
+ period_details_year: int = Field(..., ge=1900, le=2100, example=2021, description="Year", alias="year")
73
+ period_details_period: int = Field(..., ge=1, le=53, example=4, description="Period", alias="period")
66
74
 
67
75
  class FixedWageComponentCreate(BaseModel):
68
76
  code: int = Field(..., ge=1, example=1100, description="Wage Component Code", alias="code")
@@ -72,9 +80,36 @@ class FixedWageComponentCreate(BaseModel):
72
80
  comment: Optional[str] = Field(None, example="some comment", description="Comment", alias="comment")
73
81
  cost_center_id: Optional[str] = Field(None, example="aa506564-d1db-4fa8-83dc-d68db4cfcd82", description="Cost Center ID", alias="costCenterId")
74
82
  cost_unit_id: Optional[str] = Field(None, example="d8ac6afb-2ac6-43bf-9880-2d382cdace43", description="Cost Unit ID", alias="costUnitId")
75
- period_details: PeriodPost
83
+ period_details: Optional[PeriodPost] = Field(None, description="Period Details", alias="periodDetails")
76
84
  unprotected_mode: Optional[bool] = Field(None, example=True, description="Unprotected Mode", alias="unprotectedMode")
77
85
 
86
+ @field_validator("end_year", "end_period", mode="before")
87
+ @classmethod
88
+ def empty_str_to_none(cls, v):
89
+ """Convert empty strings to None for optional integer fields"""
90
+ if v == "" or v is None:
91
+ return None
92
+ return v
93
+
94
+ @field_validator("period_details", mode="before")
95
+ @classmethod
96
+ def empty_dict_to_none(cls, v):
97
+ """Convert empty dicts to None for period_details"""
98
+ if isinstance(v, dict) and (not v or all(val is None for val in v.values())):
99
+ return None
100
+ return v
101
+
102
+ @model_serializer(mode='wrap')
103
+ def serialize_model(self, serializer, info):
104
+ data = serializer(self)
105
+ # Exclude periodDetails if it exists but is None or all its nested fields are None
106
+ if 'periodDetails' in data and data['periodDetails'] is not None:
107
+ if isinstance(data['periodDetails'], dict) and all(v is None for v in data['periodDetails'].values()):
108
+ data.pop('periodDetails')
109
+ elif 'periodDetails' in data and data['periodDetails'] is None:
110
+ data.pop('periodDetails')
111
+ return data
112
+
78
113
  class FixedWageComponentUpdate(BaseModel):
79
114
  fixed_wage_component_id: str = Field(..., example="643c6b90-57c6-4199-9e4e-ded553572d78", description="Fixed Wage Component ID", alias="fixedWageComponentId")
80
115
  code: Optional[int] = Field(None, ge=1, example=1100, description="Wage Component Code", alias="code")
@@ -93,9 +128,28 @@ class VariableWageComponentCreate(BaseModel):
93
128
  comment: Optional[str] = Field(None, example="comment", description="Comment", alias="comment")
94
129
  cost_center_id: Optional[str] = Field(None, example="aa506564-d1db-4fa8-83dc-d68db4cfcd82", description="Cost Center ID", alias="costCenterId")
95
130
  cost_unit_id: Optional[str] = Field(None, example="d8ac6afb-2ac6-43bf-9880-2d382cdace43", description="Cost Unit ID", alias="costUnitId")
96
- period_details: PeriodPost
131
+ period_details: Optional[PeriodPost] = Field(None, description="Period Details", alias="periodDetails")
97
132
  unprotected_mode: Optional[bool] = Field(None, example=True, description="Unprotected Mode", alias="unprotectedMode")
98
133
 
134
+ @field_validator("period_details", mode="before")
135
+ @classmethod
136
+ def empty_dict_to_none(cls, v):
137
+ """Convert empty dicts to None for period_details"""
138
+ if isinstance(v, dict) and (not v or all(val is None for val in v.values())):
139
+ return None
140
+ return v
141
+
142
+ @model_serializer(mode='wrap')
143
+ def serialize_model(self, serializer, info):
144
+ data = serializer(self)
145
+ # Exclude periodDetails if it exists but is None or all its nested fields are None
146
+ if 'periodDetails' in data and data['periodDetails'] is not None:
147
+ if isinstance(data['periodDetails'], dict) and all(v is None for v in data['periodDetails'].values()):
148
+ data.pop('periodDetails')
149
+ elif 'periodDetails' in data and data['periodDetails'] is None:
150
+ data.pop('periodDetails')
151
+ return data
152
+
99
153
  class VariableWageComponentUpdate(BaseModel):
100
154
  variable_wage_component_id: str = Field(..., example="7fc59095-daed-4746-a7f8-a454e38e3683", description="Variable Wage Component ID", alias="variableWageComponentId")
101
155
  code: Optional[int] = Field(None, ge=1, example=3045, description="Wage Component Code", alias="code")
@@ -107,4 +161,7 @@ class VariableWageComponentUpdate(BaseModel):
107
161
  unprotected_mode: Optional[bool] = Field(None, example=True, description="Unprotected Mode", alias="unprotectedMode")
108
162
 
109
163
  class WageComponentDelete(BaseModel):
110
- wage_component_id: str = Field(..., example="7fc59095-daed-4746-a7f8-a454e38e3683", description="Wage Component ID", alias="wageComponentId")
164
+ fixed_wage_component_id: str = Field(..., example="7fc59095-daed-4746-a7f8-a454e38e3683", description="Wage Component ID", alias="wageComponentId")
165
+
166
+ class Config:
167
+ populate_by_name = True
@@ -1,17 +1,19 @@
1
- import math
1
+ from typing import Any, Dict
2
+
2
3
  import pandas as pd
3
4
  import requests
4
- from typing import Dict, Any
5
+
6
+ from brynq_sdk_functions import Functions
7
+
5
8
  from .schemas.wagecomponents import (
9
+ FixedWageComponentCreate,
6
10
  FixedWageComponentGet,
11
+ FixedWageComponentUpdate,
12
+ VariableWageComponentCreate,
7
13
  VariableWageComponentGet,
8
- FixedWageComponentCreate,
9
- FixedWageComponentUpdate,
10
- VariableWageComponentCreate,
11
14
  VariableWageComponentUpdate,
12
- WageComponentDelete
15
+ WageComponentDelete,
13
16
  )
14
- from brynq_sdk_functions import Functions
15
17
 
16
18
 
17
19
  class EmployeeFixedWageComponents:
@@ -62,24 +64,25 @@ class EmployeeFixedWageComponents:
62
64
  def create(self, employee_id: str, data: Dict[str, Any]):
63
65
  """
64
66
  Create a new fixed wage component for an employee using Pydantic validation.
65
-
67
+
66
68
  Args:
67
69
  employee_id: The ID of the employee
68
70
  data: Dictionary containing fixed wage component data with fields matching
69
71
  the FixedWageComponentCreate schema (using camelCase field names)
70
-
72
+
71
73
  Returns:
72
74
  Response from the API
73
75
  """
74
76
  # Validate with Pydantic model - this will raise an error if required fields are missing
75
- wage_component_model = FixedWageComponentCreate(**data)
76
-
77
+ nested_data = self.nmbrs.flat_dict_to_nested_dict(data, FixedWageComponentCreate)
78
+ wage_component_model = FixedWageComponentCreate(**nested_data)
79
+
77
80
  if self.nmbrs.mock_mode:
78
81
  return wage_component_model
79
-
82
+
80
83
  # Convert validated model to dict for API payload
81
- payload = wage_component_model.dict(exclude_none=True)
82
-
84
+ payload = wage_component_model.model_dump(exclude_none=True, by_alias=True)
85
+
83
86
  # Send request
84
87
  resp = self.nmbrs.session.post(
85
88
  url=f"{self.nmbrs.base_url}employees/{employee_id}/fixedwagecomponent",
@@ -91,24 +94,35 @@ class EmployeeFixedWageComponents:
91
94
  def update(self, employee_id: str, data: Dict[str, Any]):
92
95
  """
93
96
  Update an existing fixed wage component for an employee using Pydantic validation.
94
-
97
+
95
98
  Args:
96
99
  employee_id: The ID of the employee
97
100
  data: Dictionary containing fixed wage component data with fields matching
98
101
  the FixedWageComponentUpdate schema (using camelCase field names)
99
-
102
+
100
103
  Returns:
101
104
  Response from the API
102
105
  """
106
+ # Clean empty strings before validation
107
+ data = {k: (None if v == "" else v) for k, v in data.items()}
108
+ # Handle flat period_details fields
109
+ if 'period_details_period' in data and data['period_details_period'] == "":
110
+ data['period_details_period'] = None
111
+ if 'period_details_year' in data and data['period_details_year'] == "":
112
+ data['period_details_year'] = None
113
+ if 'period_details' in data and isinstance(data['period_details'], dict):
114
+ data['period_details'] = {k: (None if v == "" else v) for k, v in data['period_details'].items()}
115
+
103
116
  # Validate with Pydantic model - this will raise an error if required fields are missing
104
- wage_component_model = FixedWageComponentUpdate(**data)
105
-
117
+ nested_data = self.nmbrs.flat_dict_to_nested_dict(data, FixedWageComponentUpdate)
118
+ wage_component_model = FixedWageComponentUpdate(**nested_data)
119
+
106
120
  if self.nmbrs.mock_mode:
107
121
  return wage_component_model
108
-
122
+
109
123
  # Convert validated model to dict for API payload
110
- payload = wage_component_model.dict(exclude_none=True)
111
-
124
+ payload = wage_component_model.model_dump(exclude_none=True, by_alias=True)
125
+
112
126
  # Send request
113
127
  resp = self.nmbrs.session.put(
114
128
  url=f"{self.nmbrs.base_url}employees/{employee_id}/fixedwagecomponent",
@@ -120,20 +134,20 @@ class EmployeeFixedWageComponents:
120
134
  def delete(self, employee_id: str, wagecomponent_id: str):
121
135
  """
122
136
  Delete a wage component for an employee.
123
-
137
+
124
138
  Args:
125
139
  employee_id: The ID of the employee
126
140
  wagecomponent_id: The ID of the wage component to delete
127
-
141
+
128
142
  Returns:
129
143
  Response from the API
130
144
  """
131
145
  # Validate with Pydantic model
132
- delete_model = WageComponentDelete(wagecomponentId=wagecomponent_id)
133
-
146
+ delete_model = WageComponentDelete(fixed_wage_component_id=wagecomponent_id)
147
+
134
148
  if self.nmbrs.mock_mode:
135
149
  return delete_model
136
-
150
+
137
151
  resp = self.nmbrs.session.delete(
138
152
  url=f"{self.nmbrs.base_url}employees/{employee_id}/wagecomponents/{wagecomponent_id}",
139
153
  timeout=self.nmbrs.timeout
@@ -189,24 +203,35 @@ class EmployeeVariableWageComponents:
189
203
  def create(self, employee_id: str, data: Dict[str, Any]):
190
204
  """
191
205
  Create a new variable wage component for an employee using Pydantic validation.
192
-
206
+
193
207
  Args:
194
208
  employee_id: The ID of the employee
195
209
  data: Dictionary containing variable wage component data with fields matching
196
210
  the VariableWageComponentCreate schema (using camelCase field names)
197
-
211
+
198
212
  Returns:
199
213
  Response from the API
200
214
  """
215
+ # Clean empty strings before validation
216
+ data = {k: (None if v == "" else v) for k, v in data.items()}
217
+ # Handle flat period_details fields
218
+ if 'period_details_period' in data and data['period_details_period'] == "":
219
+ data['period_details_period'] = None
220
+ if 'period_details_year' in data and data['period_details_year'] == "":
221
+ data['period_details_year'] = None
222
+ if 'period_details' in data and isinstance(data['period_details'], dict):
223
+ data['period_details'] = {k: (None if v == "" else v) for k, v in data['period_details'].items()}
224
+
201
225
  # Validate with Pydantic model - this will raise an error if required fields are missing
202
- wage_component_model = VariableWageComponentCreate(**data)
203
-
226
+ nested_data = self.nmbrs.flat_dict_to_nested_dict(data, VariableWageComponentCreate)
227
+ wage_component_model = VariableWageComponentCreate(**nested_data)
228
+
204
229
  if self.nmbrs.mock_mode:
205
230
  return wage_component_model
206
-
231
+
207
232
  # Convert validated model to dict for API payload
208
- payload = wage_component_model.dict(exclude_none=True)
209
-
233
+ payload = wage_component_model.model_dump(exclude_none=True, by_alias=True)
234
+
210
235
  # Send request
211
236
  resp = self.nmbrs.session.post(
212
237
  url=f"{self.nmbrs.base_url}employees/{employee_id}/variablewagecomponent",
@@ -218,24 +243,35 @@ class EmployeeVariableWageComponents:
218
243
  def update(self, employee_id: str, data: Dict[str, Any]):
219
244
  """
220
245
  Update an existing variable wage component for an employee using Pydantic validation.
221
-
246
+
222
247
  Args:
223
248
  employee_id: The ID of the employee
224
249
  data: Dictionary containing variable wage component data with fields matching
225
250
  the VariableWageComponentUpdate schema (using camelCase field names)
226
-
251
+
227
252
  Returns:
228
253
  Response from the API
229
254
  """
255
+ # Clean empty strings before validation
256
+ data = {k: (None if v == "" else v) for k, v in data.items()}
257
+ # Handle flat period_details fields
258
+ if 'period_details_period' in data and data['period_details_period'] == "":
259
+ data['period_details_period'] = None
260
+ if 'period_details_year' in data and data['period_details_year'] == "":
261
+ data['period_details_year'] = None
262
+ if 'period_details' in data and isinstance(data['period_details'], dict):
263
+ data['period_details'] = {k: (None if v == "" else v) for k, v in data['period_details'].items()}
264
+
230
265
  # Validate with Pydantic model - this will raise an error if required fields are missing
231
- wage_component_model = VariableWageComponentUpdate(**data)
232
-
266
+ nested_data = self.nmbrs.flat_dict_to_nested_dict(data, VariableWageComponentUpdate)
267
+ wage_component_model = VariableWageComponentUpdate(**nested_data)
268
+
233
269
  if self.nmbrs.mock_mode:
234
270
  return wage_component_model
235
-
271
+
236
272
  # Convert validated model to dict for API payload
237
- payload = wage_component_model.dict(exclude_none=True)
238
-
273
+ payload = wage_component_model.model_dump(exclude_none=True, by_alias=True)
274
+
239
275
  # Send request
240
276
  resp = self.nmbrs.session.put(
241
277
  url=f"{self.nmbrs.base_url}employees/{employee_id}/variablewagecomponent",
@@ -247,20 +283,20 @@ class EmployeeVariableWageComponents:
247
283
  def delete(self, employee_id: str, wagecomponent_id: str):
248
284
  """
249
285
  Delete a wage component for an employee.
250
-
286
+
251
287
  Args:
252
288
  employee_id: The ID of the employee
253
289
  wagecomponent_id: The ID of the wage component to delete
254
-
290
+
255
291
  Returns:
256
292
  Response from the API
257
293
  """
258
294
  # Validate with Pydantic model
259
- delete_model = WageComponentDelete(wagecomponentId=wagecomponent_id)
260
-
295
+ delete_model = WageComponentDelete(fixed_wage_component_id=wagecomponent_id)
296
+
261
297
  if self.nmbrs.mock_mode:
262
298
  return delete_model
263
-
299
+
264
300
  resp = self.nmbrs.session.delete(
265
301
  url=f"{self.nmbrs.base_url}employees/{employee_id}/wagecomponents/{wagecomponent_id}",
266
302
  timeout=self.nmbrs.timeout
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brynq_sdk_nmbrs
3
- Version: 2.3.2.dev0
3
+ Version: 2.3.3.dev0
4
4
  Summary: Nmbrs wrapper from BrynQ
5
5
  Author: BrynQ
6
6
  Author-email: support@brynq.com
@@ -1,7 +1,7 @@
1
1
  brynq_sdk_nmbrs/__init__.py,sha256=nLoRHD7jH2z521_hyeG0uMPEAvpz-BFQ1nUmgWWwRJI,10889
2
2
  brynq_sdk_nmbrs/absence.py,sha256=xNzoDgw0Jj-JYS68lpwNzbrDy3BKsR-Iz-anlJW7YS0,4658
3
3
  brynq_sdk_nmbrs/address.py,sha256=x_AmaNPp-rjsHie2i6EfiC5hYoZQbJxiLYB7-REvEyg,5427
4
- brynq_sdk_nmbrs/bank.py,sha256=2zZ9pCEdPkxvjqyyo0bfZw0JpJpzDBXZVNmO3lHjHGQ,4165
4
+ brynq_sdk_nmbrs/bank.py,sha256=_XRQMBgSovaaLhx_lIaFDtGOeBtRbZ4skaXgtbck3lc,4168
5
5
  brynq_sdk_nmbrs/children.py,sha256=jlA8R0fLTwq53TTYZQPar01iZWtZgGiDnZxdIELXKGc,4377
6
6
  brynq_sdk_nmbrs/companies.py,sha256=e4I6mjItbuQN-ZeEe1I4HD-4x3lW5brTAc0C6fMEloQ,5243
7
7
  brynq_sdk_nmbrs/contract.py,sha256=lccpAbhNjj4x45WOnF7h2LlBG5XCXelnis7WyPvJJrE,4527
@@ -23,10 +23,10 @@ brynq_sdk_nmbrs/salary_tables.py,sha256=T7_bJE-CtRF08FWyLJnXm5Q3Q5Usozx4iCByqoTP
23
23
  brynq_sdk_nmbrs/schedules.py,sha256=vXJ3iZ3BatosL3V_v7UlABrTJVmXXpgSItCrxrCfDXc,5714
24
24
  brynq_sdk_nmbrs/social_insurance.py,sha256=4hmuXoeHGl2LUhXwtRL2KMXFu9iyrUgsYHTgUAINMSA,5105
25
25
  brynq_sdk_nmbrs/wage_tax.py,sha256=ukNV-BxOHiwPm0ktYdvuul-S6RZuJWHN34RpAdV1rH4,9554
26
- brynq_sdk_nmbrs/wagecomponents.py,sha256=nkk7HGlcdEx2K3VQ2G2zwLbNMFPNHQK4YwOEnFBtDj0,9539
26
+ brynq_sdk_nmbrs/wagecomponents.py,sha256=fr9FpRMyB9yxQTT2t_5_Aa9_CdjqN9erj0ZseaGJjkM,11611
27
27
  brynq_sdk_nmbrs/schemas/__init__.py,sha256=rwMb9AJSBXn_50SOa1rIvwOsCrtpj3vQxjXioxrxuyI,2301
28
28
  brynq_sdk_nmbrs/schemas/absence.py,sha256=f2ZDpy0qnyUyCjk2JjTNCazB_12lmP462MkI4eyf3ws,3320
29
- brynq_sdk_nmbrs/schemas/address.py,sha256=iQvJEseqjBKzITJUpojmTHEhTExeQ7Ps0MrVlwbWIUE,5763
29
+ brynq_sdk_nmbrs/schemas/address.py,sha256=Wd_Jq8bEOpKYSHMoDgG0P6fme8SRmQVK9h3zkSYsDlE,5767
30
30
  brynq_sdk_nmbrs/schemas/bank.py,sha256=QWMGevA4TKju8i20kAwEaV3FW7tpG4vjo0XTQvX90pw,4359
31
31
  brynq_sdk_nmbrs/schemas/children.py,sha256=Vae7v2XPKwGQh3Oiz8cg-N0nbnTxDGVzMjOA7cKzFCY,3293
32
32
  brynq_sdk_nmbrs/schemas/company.py,sha256=utYRXj_ch-RmI-AIShTqPj-LpdftEc8seHzkHZbxgew,1049
@@ -44,12 +44,12 @@ brynq_sdk_nmbrs/schemas/hours.py,sha256=dwH7_Dn0atztYHh35UzEX2i6e1Jr8ltZun_zsAXb
44
44
  brynq_sdk_nmbrs/schemas/leave.py,sha256=IGV_n3lIeMQ5m9jV9ew2dz-F0oaN_BQBuiQ8h2tQ3ss,3893
45
45
  brynq_sdk_nmbrs/schemas/manager.py,sha256=Wxbpv_ts0q7ywe63GTu0FxP_7s-NHFXvBYDBpjM4GJg,9055
46
46
  brynq_sdk_nmbrs/schemas/salary.py,sha256=2dU9Pj1FM_4mGJEZAAsU1-6z6Wkjhc_cyjuN5Gdok_s,6168
47
- brynq_sdk_nmbrs/schemas/schedules.py,sha256=KE5xDLrLPr63BqOHK20cPocHC73X9H6x0dZZTp48N5A,8851
47
+ brynq_sdk_nmbrs/schemas/schedules.py,sha256=ycS3Gb7ozqXro-56I1jQqaI_EP4fDPLRGYKkOdL06vI,10068
48
48
  brynq_sdk_nmbrs/schemas/social_insurance.py,sha256=Bmxzas6rFZ5j127GtvixsZJWv0PAucVZ_m73p_THryo,5377
49
49
  brynq_sdk_nmbrs/schemas/wage_tax.py,sha256=5BKZCwy6pZGyNRiPftN53bkLkUZkAIHcPice6aJsOmo,12122
50
50
  brynq_sdk_nmbrs/schemas/wage_tax_settings.py,sha256=LkZqNff4Eo79HdwB-o9fYwpZh-fqBccf_DnHWkWNRRM,5705
51
- brynq_sdk_nmbrs/schemas/wagecomponents.py,sha256=ysuGH3af0OIoMefBiJIgbe7hMXDRolpdEjNoKBN8nvw,7413
52
- brynq_sdk_nmbrs-2.3.2.dev0.dist-info/METADATA,sha256=aqRwyUOCzUVNkvBxpMWi9XgB6S7n9tA-LS87-9TQfZ8,534
53
- brynq_sdk_nmbrs-2.3.2.dev0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
54
- brynq_sdk_nmbrs-2.3.2.dev0.dist-info/top_level.txt,sha256=LrSQFzIV7FP02jBHdBKubiCbIy0C_5YnTz3DSYYoQzg,16
55
- brynq_sdk_nmbrs-2.3.2.dev0.dist-info/RECORD,,
51
+ brynq_sdk_nmbrs/schemas/wagecomponents.py,sha256=_l9KlS1z_-L3rHVrl2Q-rYMUcWJmv-DUx3P4Anm6Ans,9711
52
+ brynq_sdk_nmbrs-2.3.3.dev0.dist-info/METADATA,sha256=Naj9B86uVpkq_7NArd0rPyKypwmActFpVWoiakCDuzc,534
53
+ brynq_sdk_nmbrs-2.3.3.dev0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
54
+ brynq_sdk_nmbrs-2.3.3.dev0.dist-info/top_level.txt,sha256=LrSQFzIV7FP02jBHdBKubiCbIy0C_5YnTz3DSYYoQzg,16
55
+ brynq_sdk_nmbrs-2.3.3.dev0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5