brynq-sdk-nmbrs 2.3.1__py3-none-any.whl → 2.3.2.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.
Files changed (46) hide show
  1. brynq_sdk_nmbrs/__init__.py +104 -84
  2. brynq_sdk_nmbrs/address.py +82 -2
  3. brynq_sdk_nmbrs/children.py +96 -61
  4. brynq_sdk_nmbrs/companies.py +45 -1
  5. brynq_sdk_nmbrs/costcenter.py +53 -8
  6. brynq_sdk_nmbrs/costunit.py +16 -4
  7. brynq_sdk_nmbrs/debtors.py +76 -2
  8. brynq_sdk_nmbrs/department.py +149 -28
  9. brynq_sdk_nmbrs/document.py +50 -0
  10. brynq_sdk_nmbrs/employee_wage_tax_settings.py +113 -0
  11. brynq_sdk_nmbrs/employees.py +119 -24
  12. brynq_sdk_nmbrs/employment.py +12 -4
  13. brynq_sdk_nmbrs/function.py +128 -2
  14. brynq_sdk_nmbrs/leave.py +105 -8
  15. brynq_sdk_nmbrs/salaries.py +78 -3
  16. brynq_sdk_nmbrs/schedules.py +77 -3
  17. brynq_sdk_nmbrs/schemas/address.py +30 -5
  18. brynq_sdk_nmbrs/schemas/bank.py +0 -2
  19. brynq_sdk_nmbrs/schemas/children.py +67 -0
  20. brynq_sdk_nmbrs/schemas/company.py +16 -0
  21. brynq_sdk_nmbrs/schemas/contracts.py +25 -11
  22. brynq_sdk_nmbrs/schemas/costcenter.py +57 -18
  23. brynq_sdk_nmbrs/schemas/costunit.py +0 -2
  24. brynq_sdk_nmbrs/schemas/days.py +0 -2
  25. brynq_sdk_nmbrs/schemas/debtor.py +23 -1
  26. brynq_sdk_nmbrs/schemas/department.py +41 -7
  27. brynq_sdk_nmbrs/schemas/document.py +13 -0
  28. brynq_sdk_nmbrs/schemas/employees.py +44 -38
  29. brynq_sdk_nmbrs/schemas/employment.py +10 -10
  30. brynq_sdk_nmbrs/schemas/function.py +34 -7
  31. brynq_sdk_nmbrs/schemas/hours.py +0 -4
  32. brynq_sdk_nmbrs/schemas/leave.py +12 -1
  33. brynq_sdk_nmbrs/schemas/manager.py +0 -3
  34. brynq_sdk_nmbrs/schemas/salary.py +37 -12
  35. brynq_sdk_nmbrs/schemas/schedules.py +49 -1
  36. brynq_sdk_nmbrs/schemas/social_insurance.py +39 -6
  37. brynq_sdk_nmbrs/schemas/wage_tax.py +68 -8
  38. brynq_sdk_nmbrs/schemas/wage_tax_settings.py +76 -0
  39. brynq_sdk_nmbrs/schemas/wagecomponents.py +0 -4
  40. brynq_sdk_nmbrs/social_insurance.py +81 -3
  41. brynq_sdk_nmbrs/wage_tax.py +105 -4
  42. {brynq_sdk_nmbrs-2.3.1.dist-info → brynq_sdk_nmbrs-2.3.2.dev0.dist-info}/METADATA +1 -1
  43. brynq_sdk_nmbrs-2.3.2.dev0.dist-info/RECORD +55 -0
  44. {brynq_sdk_nmbrs-2.3.1.dist-info → brynq_sdk_nmbrs-2.3.2.dev0.dist-info}/WHEEL +1 -1
  45. brynq_sdk_nmbrs-2.3.1.dist-info/RECORD +0 -50
  46. {brynq_sdk_nmbrs-2.3.1.dist-info → brynq_sdk_nmbrs-2.3.2.dev0.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,76 @@
1
1
  import math
2
+ from datetime import datetime
3
+ from typing import Annotated, Optional, Union
4
+
2
5
  import pandas as pd
3
6
  import pandera as pa
4
- from pandera import Bool
5
- from pandera.typing import Series, String, Float, DateTime
6
7
  import pandera.extensions as extensions
7
- from brynq_sdk_functions import BrynQPanderaDataFrameModel
8
- from typing import Optional, Annotated
8
+ from pandera import Bool
9
+ from pandera.typing import DateTime, Float, Series, String
9
10
  from pydantic import BaseModel, Field, StringConstraints
10
- from datetime import datetime
11
+
12
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
11
13
 
12
14
 
15
+ # ---------------------------
16
+ # REST API Get Schema (Wage Tax Settings History)
17
+ # ---------------------------
13
18
  class WageTaxSettingsGet(BrynQPanderaDataFrameModel):
19
+ """Schema for REST API: GET /companies/{companyId}/employees/wagetaxsettings"""
20
+ employee_id: Series[String] = pa.Field(coerce=True, description="Employee ID", alias="employeeId")
21
+ wage_tax_setting_id: Series[String] = pa.Field(coerce=True, description="Wage Tax Setting ID", alias="wageTaxSettingId")
22
+ start_date: Series[DateTime] = pa.Field(coerce=True, description="Start Date", alias="startDate")
23
+ created_at: Series[DateTime] = pa.Field(coerce=True, description="Created At", alias="createdAt")
24
+ payroll_tax_reduction: Series[Bool] = pa.Field(coerce=True, nullable=True, description="Payroll Tax Reduction", alias="payrollTaxReduction")
25
+ type_of_income: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Type of Income", alias="typeOfIncome")
26
+ color_table: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Color Table", alias="colorTable")
27
+ period_table: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Period Table", alias="periodTable")
28
+ special_table: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Special Table", alias="specialTable")
29
+ payroll_tax: Series[Bool] = pa.Field(coerce=True, nullable=True, description="Payroll Tax", alias="payrollTax")
30
+ benefit_scheme: Series[Bool] = pa.Field(coerce=True, nullable=True, description="Benefit Scheme", alias="benefitScheme")
31
+ auto_small_jobs: Series[Bool] = pa.Field(coerce=True, nullable=True, description="Auto Small Jobs Regulation", alias="autoSmallJobs")
32
+ yearly_salary: Series[pd.Float64Dtype] = pa.Field(coerce=True, nullable=True, description="Yearly Salary", alias="yearlySalary")
33
+ deviation_special_rate: Series[pd.Float64Dtype] = pa.Field(coerce=True, nullable=True, description="Deviation Special Rate Payroll Tax Deduction", alias="deviationSpecialRatePayrollTaxDeduction")
34
+ code_tax_reduction: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Code Tax Reduction", alias="codeTaxReduction")
35
+ holiday_vouchers: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Holiday Vouchers", alias="holidayVouchers")
36
+ code_30_percent_rule: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Code Calculate 30 Percent Rule", alias="codeCalculate30PercentRule")
37
+
38
+ class _Annotation:
39
+ primary_key = "wage_tax_setting_id"
40
+ foreign_keys = {
41
+ "employee_id": {
42
+ "parent_schema": "EmployeeSchema",
43
+ "parent_column": "employee_id",
44
+ "cardinality": "N:1"
45
+ }
46
+ }
47
+
48
+
49
+ class WageTaxSettingsCreate(BaseModel):
50
+ """Schema for REST API: POST /employees/{employeeId}/wagetaxsetting"""
51
+ start_date: datetime = Field(..., example="2024-01-01T00:00:00Z", description="Start Date", alias="startDate")
52
+ payroll_tax_reduction: Optional[bool] = Field(None, example=True, description="Payroll Tax Reduction", alias="payrollTaxReduction")
53
+ type_of_income: Optional[int] = Field(None, example=15, description="Type of Income", alias="typeOfIncome")
54
+ color_table: Optional[int] = Field(None, example=1, description="Color Table", alias="colorTable")
55
+ period_table: Optional[int] = Field(None, example=2, description="Period Table", alias="periodTable")
56
+ special_table: Optional[int] = Field(None, example=0, description="Special Table", alias="specialTable")
57
+ payroll_tax: Optional[bool] = Field(None, example=True, description="Payroll Tax", alias="payrollTax")
58
+ benefit_scheme: Optional[bool] = Field(None, example=True, description="Benefit Scheme", alias="benefitScheme")
59
+ auto_small_jobs: Optional[bool] = Field(None, example=False, description="Auto Small Jobs Regulation", alias="autoSmallJobs")
60
+ yearly_salary: Optional[float] = Field(None, example=45000.00, description="Yearly Salary", alias="yearlySalary")
61
+ deviation_special_rate: Optional[float] = Field(None, example=0.0, description="Deviation Special Rate Payroll Tax Deduction", alias="deviationSpecialRatePayrollTaxDeduction")
62
+ code_tax_reduction: Optional[int] = Field(None, example=0, description="Code Tax Reduction", alias="codeTaxReduction")
63
+ holiday_vouchers: Optional[int] = Field(None, example=0, description="Holiday Vouchers", alias="holidayVouchers")
64
+ code_30_percent_rule: Optional[int] = Field(None, example=0, description="Code Calculate 30 Percent Rule", alias="codeCalculate30PercentRule")
65
+
66
+ class Config:
67
+ populate_by_name = True
68
+
69
+
70
+ # ---------------------------
71
+ # SOAP API Get Schema (Company Wage Tax List)
72
+ # ---------------------------
73
+ class CompanyWageTaxGet(BrynQPanderaDataFrameModel):
14
74
  wagetax_id: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Loonaangifte ID", alias="LoonaangifteID")
15
75
  serial_number: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Serial Number", alias="SerialNumber")
16
76
  payment_reference: Series[String] = pa.Field(coerce=True, description="Payment Reference", alias="PaymentReference")
@@ -19,8 +79,8 @@ class WageTaxSettingsGet(BrynQPanderaDataFrameModel):
19
79
  year: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Year", alias="Year")
20
80
  status: Series[String] = pa.Field(coerce=True, description="Status", alias="Status")
21
81
  sent_at: Series[DateTime] = pa.Field(coerce=True, description="Sent At", alias="SentAt")
22
- period_start: Series[DateTime] = pa.Field(coerce=True, description="Tijdvak Start", alias="TijdvakStart")
23
- period_end: Series[DateTime] = pa.Field(coerce=True, description="Tijdvak End", alias="TijdvakEnd")
82
+ period_start: Series[String] = pa.Field(coerce=True, description="Tijdvak Start", alias="TijdvakStart")
83
+ period_end: Series[String] = pa.Field(coerce=True, description="Tijdvak End", alias="TijdvakEnd")
24
84
  correction_period_start: Series[DateTime] = pa.Field(nullable=True, coerce=True, description="Correction Tijdvak Start", alias="CorrectionTijdvakStart")
25
85
  correction_period_end: Series[DateTime] = pa.Field(nullable=True, coerce=True, description="Correction Tijdvak End", alias="CorrectionTijdvakEnd")
26
86
 
@@ -53,7 +113,7 @@ class WageTaxGet(BrynQPanderaDataFrameModel):
53
113
  wage_tax_id: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Wage Tax ID", alias="Id")
54
114
  employee_id: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Employee ID", alias="EmployeeId")
55
115
  yearly_salary: Series[pd.Float64Dtype] = pa.Field(coerce=True, description="Yearly Salary", alias="JaarloonBT")
56
- deviation_special_rate_payroll_tax_deduction: Series[pd.Int64Dtype] = pa.Field(coerce=True, description="Afw Bijz Tarief LH", alias="AfwBijzTariefLH")
116
+ deviation_special_rate_payroll_tax_deduction: Series[str] = pa.Field(coerce=True, description="Afw Bijz Tarief LH", alias="AfwBijzTariefLH")
57
117
  auto_small_jobs: Series[Bool] = pa.Field(coerce=True, description="Auto Kleine Banen Regeling", alias="AutoKleineBanenRegeling")
58
118
  payroll_tax_deduction: Series[Bool] = pa.Field(coerce=True, description="Loonheffingkorting", alias="Loonheffingkorting")
59
119
  benefit_scheme: Series[Bool] = pa.Field(coerce=True, description="Voordeelreg", alias="Voordeelreg")
@@ -0,0 +1,76 @@
1
+ from typing import Optional
2
+
3
+ import pandas as pd
4
+ import pandera as pa
5
+ from pandera import Bool
6
+ from pandera.typing import DateTime, Float, Series, String
7
+ from pydantic import BaseModel, Field, model_serializer
8
+
9
+ from brynq_sdk_functions import BrynQPanderaDataFrameModel
10
+
11
+
12
+ # ---------------------------
13
+ # Get Schemas
14
+ # ---------------------------
15
+ class EmployeeWageTaxSettingsGet(BrynQPanderaDataFrameModel):
16
+ employee_id: Series[String] = pa.Field(coerce=True, description="Employee unique identifier", alias="employeeId")
17
+ wage_tax_settings_id: Series[String] = pa.Field(coerce=True, description="Wage Tax Settings ID", alias="wageTaxSettingsId")
18
+ wage_tax: Series[Bool] = pa.Field(coerce=True, nullable=True, description="Wage Tax", alias="wageTax")
19
+ wage_tax_rebate: Series[Bool] = pa.Field(coerce=True, nullable=True, description="Loonheffingskorting", alias="wageTaxRebate")
20
+ single_elderly_discount: Series[Bool] = pa.Field(coerce=True, nullable=True, description="Single Elderly Discount", alias="singleElderlyDiscount")
21
+ color_table: Series[String] = pa.Field(coerce=True, nullable=True, description="List of available color table values for wage tax settings", alias="colorTable")
22
+ period_table: Series[String] = pa.Field(coerce=True, nullable=True, description="List of available period table values for wage tax settings", alias="periodTable")
23
+ income_type: Series[String] = pa.Field(coerce=True, nullable=True, description="Income Type", alias="incomeType")
24
+ special_annual_salary_rate: Series[Float] = pa.Field(coerce=True, nullable=True, description="Loonheffing BT", alias="specialAnnualSalaryRate")
25
+ special_table: Series[String] = pa.Field(coerce=True, nullable=True, description="Special Table", alias="specialTable")
26
+ different_special_rate: Series[String] = pa.Field(coerce=True, nullable=True, description="Afwijkend Bijzonder tarief %", alias="differentSpecialRate")
27
+ calc_30_percent_ruling: Series[String] = pa.Field(coerce=True, nullable=True, description="List of available 30 Percent Ruling Calculation types", alias="Calc30PercentRuling.Cal30PercentRuling")
28
+ calc_30_percent_ruling_end_period: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="30 Percent Ruling End Period", alias="Calc30PercentRuling.endPeriod")
29
+ calc_30_percent_ruling_end_year: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="30 Percent Ruling End Year", alias="Calc30PercentRuling.endYear")
30
+ period_year: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Period Year", alias="period.year")
31
+ period_period: Series[pd.Int64Dtype] = pa.Field(coerce=True, nullable=True, description="Period Period", alias="period.period")
32
+ created_at: Series[DateTime] = pa.Field(coerce=True, nullable=True, description="Created At", alias="createdAt")
33
+
34
+ class _Annotation:
35
+ primary_key = "wage_tax_settings_id"
36
+ foreign_keys = {
37
+ "employee_id": {
38
+ "parent_schema": "EmployeeSchema",
39
+ "parent_column": "employee_id",
40
+ "cardinality": "N:1"
41
+ }
42
+ }
43
+
44
+ # ---------------------------
45
+ # Upload Schemas
46
+ # ---------------------------
47
+ class Period(BaseModel):
48
+ period_year: int = Field(..., ge=1900, le=2100, example=2021, description="Year", alias="year")
49
+ period_period: int = Field(..., ge=1, le=53, example=4, description="Period", alias="period")
50
+
51
+ class Calc30PercentRuling(BaseModel):
52
+ cal_30_percent_ruling: Optional[str] = Field(None, example="None", description="List of available 30 Percent Ruling Calculation types", alias="Cal30PercentRuling")
53
+ end_period: Optional[int] = Field(None, example=8, description="30 Percent Ruling End Period", alias="endPeriod")
54
+ end_year: Optional[int] = Field(None, example=2025, description="30 Percent Ruling End Year", alias="endYear")
55
+
56
+ class EmployeeWageTaxSettingsCreate(BaseModel):
57
+ wage_tax: bool = Field(..., example=True, description="Wage Tax", alias="wageTax")
58
+ wage_tax_rebate: bool = Field(..., example=True, description="Loonheffingskorting", alias="wageTaxRebate")
59
+ single_elderly_discount: bool = Field(..., example=True, description="Single Elderly Discount", alias="singleElderlyDiscount")
60
+ color_table: str = Field(..., example="White", description="List of available color table values for wage tax settings", alias="colorTable")
61
+ period_table: str = Field(..., example="Month", description="List of available period table values for wage tax settings", alias="periodTable")
62
+ income_type: str = Field(..., description="Income Type", alias="incomeType")
63
+ special_annual_salary_rate: Optional[float] = Field(None, ge=0, example=32000.0, description="Loonheffing BT", alias="specialAnnualSalaryRate")
64
+ special_table: str = Field(..., description="Special Table", alias="specialTable")
65
+ different_special_rate: Optional[float] = Field(None, example=0.0, description="Afwijkend Bijzonder tarief %", alias="differentSpecialRate")
66
+ calc_30_percent_ruling: Optional[Calc30PercentRuling] = Field(None, description="Calc 30 percent ruling", alias="Calc30PercentRuling")
67
+ period: Period = Field(..., description="Period", alias="period")
68
+
69
+ @model_serializer(mode='wrap')
70
+ def serialize_model(self, serializer, info):
71
+ data = serializer(self)
72
+ # Exclude Calc30PercentRuling if it exists but all its nested fields are None
73
+ if 'Calc30PercentRuling' in data and data['Calc30PercentRuling'] is not None:
74
+ if isinstance(data['Calc30PercentRuling'], dict) and all(v is None for v in data['Calc30PercentRuling'].values()):
75
+ data.pop('Calc30PercentRuling')
76
+ return data
@@ -65,7 +65,6 @@ class PeriodPost(BaseModel):
65
65
  period: int = Field(..., ge=1, le=53, example=4, description="Period", alias="period")
66
66
 
67
67
  class FixedWageComponentCreate(BaseModel):
68
- employee_id: str = Field(..., description="Employee identifier", alias="employeeId")
69
68
  code: int = Field(..., ge=1, example=1100, description="Wage Component Code", alias="code")
70
69
  value: float = Field(..., ge=0, example=500, description="Wage Component Value", alias="value")
71
70
  end_year: Optional[int] = Field(None, ge=1900, le=2100, example=2023, description="End Year", alias="endYear")
@@ -77,7 +76,6 @@ class FixedWageComponentCreate(BaseModel):
77
76
  unprotected_mode: Optional[bool] = Field(None, example=True, description="Unprotected Mode", alias="unprotectedMode")
78
77
 
79
78
  class FixedWageComponentUpdate(BaseModel):
80
- employee_id: str = Field(..., description="Employee identifier", alias="employeeId")
81
79
  fixed_wage_component_id: str = Field(..., example="643c6b90-57c6-4199-9e4e-ded553572d78", description="Fixed Wage Component ID", alias="fixedWageComponentId")
82
80
  code: Optional[int] = Field(None, ge=1, example=1100, description="Wage Component Code", alias="code")
83
81
  value: Optional[float] = Field(None, ge=0, example=500, description="Wage Component Value", alias="value")
@@ -90,7 +88,6 @@ class FixedWageComponentUpdate(BaseModel):
90
88
  unprotected_mode: Optional[bool] = Field(None, example=True, description="Unprotected Mode", alias="unprotectedMode")
91
89
 
92
90
  class VariableWageComponentCreate(BaseModel):
93
- employee_id: str = Field(..., description="Employee identifier", alias="employeeId")
94
91
  code: int = Field(..., ge=1, example=3045, description="Wage Component Code", alias="code")
95
92
  value: float = Field(..., ge=0, example=200, description="Wage Component Value", alias="value")
96
93
  comment: Optional[str] = Field(None, example="comment", description="Comment", alias="comment")
@@ -100,7 +97,6 @@ class VariableWageComponentCreate(BaseModel):
100
97
  unprotected_mode: Optional[bool] = Field(None, example=True, description="Unprotected Mode", alias="unprotectedMode")
101
98
 
102
99
  class VariableWageComponentUpdate(BaseModel):
103
- employee_id: str = Field(..., description="Employee identifier", alias="employeeId")
104
100
  variable_wage_component_id: str = Field(..., example="7fc59095-daed-4746-a7f8-a454e38e3683", description="Variable Wage Component ID", alias="variableWageComponentId")
105
101
  code: Optional[int] = Field(None, ge=1, example=3045, description="Wage Component Code", alias="code")
106
102
  value: Optional[float] = Field(None, ge=0, example=2200, description="Wage Component Value", alias="value")
@@ -1,10 +1,9 @@
1
- from typing import Any, Dict, List, Union, Tuple
1
+ from typing import Any, Dict, Union, Tuple
2
2
  import pandas as pd
3
3
 
4
- from .schemas.social_insurance import SocialInsuranceUpdate
4
+ from .schemas.social_insurance import SocialInsuranceUpdate, SocialInsuranceGet
5
5
  from zeep.exceptions import Fault
6
6
  from zeep.helpers import serialize_object
7
- # import logging
8
7
  from brynq_sdk_functions import Functions
9
8
 
10
9
 
@@ -13,6 +12,85 @@ class SocialInsurance:
13
12
  self.nmbrs = nmbrs
14
13
  self.soap_client_employees = nmbrs.soap_client_employees
15
14
 
15
+ def get(self, employee_id: Union[int, str]) -> Tuple[pd.DataFrame, pd.DataFrame]:
16
+ """
17
+ Get current social insurance settings for an employee.
18
+
19
+ Args:
20
+ employee_id: The ID of the employee
21
+
22
+ Returns:
23
+ Tuple of (valid_data, invalid_data) DataFrames
24
+ """
25
+ if self.nmbrs.mock_mode:
26
+ return pd.DataFrame(), pd.DataFrame()
27
+
28
+ try:
29
+ response = self.nmbrs.soap_client_employees.service.SVW_GetCurrent(
30
+ EmployeeId=int(employee_id),
31
+ _soapheaders={'AuthHeaderWithDomain': self.nmbrs.soap_auth_header_employees}
32
+ )
33
+
34
+ if response:
35
+ serialized_response = serialize_object(response)
36
+ if not isinstance(serialized_response, list):
37
+ serialized_response = [serialized_response]
38
+ df = pd.DataFrame(serialized_response)
39
+ df['employee_id'] = str(employee_id)
40
+
41
+ valid_data, invalid_data = Functions.validate_data(df=df, schema=SocialInsuranceGet, debug=True)
42
+ return valid_data, invalid_data
43
+ else:
44
+ return pd.DataFrame(), pd.DataFrame()
45
+
46
+ except Fault as e:
47
+ raise Exception(f"SOAP request failed: {str(e)}")
48
+ except Exception as e:
49
+ raise Exception(f"Failed to get Social Insurance: {str(e)}")
50
+
51
+ def get_all_by_company(self, company_id: Union[int, str]) -> Tuple[pd.DataFrame, pd.DataFrame]:
52
+ """
53
+ Get all social insurance settings for all employees in a company.
54
+
55
+ Args:
56
+ company_id: The ID of the company
57
+
58
+ Returns:
59
+ Tuple of (valid_data, invalid_data) DataFrames
60
+ """
61
+ if self.nmbrs.mock_mode:
62
+ return pd.DataFrame(), pd.DataFrame()
63
+
64
+ try:
65
+ response = self.nmbrs.soap_client_employees.service.SVW_GetAll_AllEmployeesByCompany(
66
+ CompanyID=int(company_id),
67
+ _soapheaders={'AuthHeaderWithDomain': self.nmbrs.soap_auth_header_employees}
68
+ )
69
+
70
+ if response:
71
+ all_data = []
72
+ for emp in response:
73
+ emp_id = emp.EmployeeId
74
+ if emp.EmployeeSVWSettings and emp.EmployeeSVWSettings.EmployeeSVWSettings:
75
+ for svw in emp.EmployeeSVWSettings.EmployeeSVWSettings:
76
+ svw_data = serialize_object(svw)
77
+ svw_data['employee_id'] = str(emp_id)
78
+ all_data.append(svw_data)
79
+
80
+ if all_data:
81
+ df = pd.DataFrame(all_data)
82
+ valid_data, invalid_data = Functions.validate_data(df=df, schema=SocialInsuranceGet, debug=True)
83
+ return valid_data, invalid_data
84
+ else:
85
+ return pd.DataFrame(), pd.DataFrame()
86
+ else:
87
+ return pd.DataFrame(), pd.DataFrame()
88
+
89
+ except Fault as e:
90
+ raise Exception(f"SOAP request failed: {str(e)}")
91
+ except Exception as e:
92
+ raise Exception(f"Failed to get Social Insurance for company: {str(e)}")
93
+
16
94
  def update(self, data: Dict[str, Any]) -> pd.DataFrame:
17
95
  try:
18
96
  social_insurance_model = SocialInsuranceUpdate(**data)
@@ -1,14 +1,115 @@
1
1
  from typing import Any, Dict, List, Union, Tuple
2
2
  import pandas as pd
3
- from .schemas.wage_tax import WageTaxGet, WageTaxUpdate, WageTaxSettingsGet
3
+ import requests
4
+ from .schemas.wage_tax import (
5
+ WageTaxGet, WageTaxUpdate, CompanyWageTaxGet,
6
+ WageTaxSettingsGet, WageTaxSettingsCreate
7
+ )
4
8
  from zeep.exceptions import Fault
5
9
  from zeep.ns import WSDL, SOAP_ENV_11
6
10
  from zeep.xsd import ComplexType, Element, String
7
11
  from zeep.helpers import serialize_object
8
- # import logging
9
12
  from brynq_sdk_functions import Functions
10
13
 
11
14
 
15
+ class WageTaxSettings:
16
+ """Wage Tax Settings History - uses REST API."""
17
+
18
+ def __init__(self, nmbrs):
19
+ self.nmbrs = nmbrs
20
+
21
+ def get(self,
22
+ created_from: str = None,
23
+ employee_id: str = None) -> Tuple[pd.DataFrame, pd.DataFrame]:
24
+ """
25
+ Get wage tax settings history for all employees across all companies.
26
+
27
+ Args:
28
+ created_from: Optional filter to get settings created from a specific date (ISO format)
29
+ employee_id: Optional filter to get settings for a specific employee
30
+
31
+ Returns:
32
+ Tuple of (valid_settings, invalid_settings) DataFrames
33
+ """
34
+ wage_tax_settings = pd.DataFrame()
35
+ for company in self.nmbrs.company_ids:
36
+ wage_tax_settings = pd.concat([wage_tax_settings, self._get(company, created_from, employee_id)])
37
+
38
+ valid_settings, invalid_settings = Functions.validate_data(
39
+ df=wage_tax_settings,
40
+ schema=WageTaxSettingsGet,
41
+ debug=True
42
+ )
43
+
44
+ return valid_settings, invalid_settings
45
+
46
+ def _get(self,
47
+ company_id: str,
48
+ created_from: str = None,
49
+ employee_id: str = None) -> pd.DataFrame:
50
+ """
51
+ Get wage tax settings history for a specific company.
52
+
53
+ Args:
54
+ company_id: The ID of the company
55
+ created_from: Optional filter to get settings created from a specific date
56
+ employee_id: Optional filter to get settings for a specific employee
57
+
58
+ Returns:
59
+ DataFrame containing wage tax settings history
60
+ """
61
+ params = {}
62
+ if created_from:
63
+ params['createdFrom'] = created_from
64
+ if employee_id:
65
+ params['employeeId'] = employee_id
66
+
67
+ request = requests.Request(
68
+ method='GET',
69
+ url=f"{self.nmbrs.base_url}companies/{company_id}/employees/wagetaxsettings",
70
+ params=params
71
+ )
72
+
73
+ data = self.nmbrs.get_paginated_result(request)
74
+ df = pd.json_normalize(
75
+ data,
76
+ record_path='wageTaxSettings',
77
+ meta=['employeeId']
78
+ )
79
+
80
+ return df
81
+
82
+ def create(self, employee_id: str, data: Dict[str, Any]):
83
+ """
84
+ Create a new wage tax setting for an employee using Pydantic validation.
85
+
86
+ Args:
87
+ employee_id: The ID of the employee
88
+ data: Dictionary containing wage tax settings data with fields matching
89
+ the EmployeeWageTaxSettingsCreate schema (using camelCase field names)
90
+
91
+ Returns:
92
+ Response from the API
93
+ """
94
+ # Validate with Pydantic model
95
+ nested_data = self.nmbrs.flat_dict_to_nested_dict(data, WageTaxSettingsCreate)
96
+ wage_tax_model = WageTaxSettingsCreate(**nested_data)
97
+
98
+ if self.nmbrs.mock_mode:
99
+ return wage_tax_model
100
+
101
+ # Convert validated model to dict for API payload
102
+ payload = wage_tax_model.model_dump(exclude_none=True, by_alias=True)
103
+
104
+ # Send request
105
+ resp = self.nmbrs.session.post(
106
+ url=f"{self.nmbrs.base_url}employees/{employee_id}/wagetaxsetting",
107
+ json=payload,
108
+ timeout=self.nmbrs.timeout
109
+ )
110
+ return resp
111
+
112
+
12
113
  class WageTax:
13
114
  def __init__(self, nmbrs):
14
115
  self.nmbrs = nmbrs
@@ -33,7 +134,7 @@ class WageTax:
33
134
  wagetax_settings_temp['companyId'] = company['number']
34
135
  wagetax_settings = pd.concat([wagetax_settings, wagetax_settings_temp])
35
136
 
36
- valid_wagetax_settings, invalid_wagetax_settings = Functions.validate_data(df=wagetax_settings, schema=WageTaxSettingsGet, debug=True)
137
+ valid_wagetax_settings, invalid_wagetax_settings = Functions.validate_data(df=wagetax_settings, schema=CompanyWageTaxGet, debug=True)
37
138
 
38
139
  # No validation schema for now, but could be added later
39
140
  return valid_wagetax_settings, invalid_wagetax_settings
@@ -94,7 +195,7 @@ class WageTax:
94
195
  auth_header = self.nmbrs._get_soap_auth_header_employees()
95
196
 
96
197
  # Make SOAP request with the proper header structure
97
- response = self.soap_client_employees.service.WageTax_GetCurrent(
198
+ response = self.soap_client_employees.service.WageTax_GetList(
98
199
  EmployeeId=employee_id,
99
200
  _soapheaders=[auth_header]
100
201
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brynq_sdk_nmbrs
3
- Version: 2.3.1
3
+ Version: 2.3.2.dev0
4
4
  Summary: Nmbrs wrapper from BrynQ
5
5
  Author: BrynQ
6
6
  Author-email: support@brynq.com
@@ -0,0 +1,55 @@
1
+ brynq_sdk_nmbrs/__init__.py,sha256=nLoRHD7jH2z521_hyeG0uMPEAvpz-BFQ1nUmgWWwRJI,10889
2
+ brynq_sdk_nmbrs/absence.py,sha256=xNzoDgw0Jj-JYS68lpwNzbrDy3BKsR-Iz-anlJW7YS0,4658
3
+ brynq_sdk_nmbrs/address.py,sha256=x_AmaNPp-rjsHie2i6EfiC5hYoZQbJxiLYB7-REvEyg,5427
4
+ brynq_sdk_nmbrs/bank.py,sha256=2zZ9pCEdPkxvjqyyo0bfZw0JpJpzDBXZVNmO3lHjHGQ,4165
5
+ brynq_sdk_nmbrs/children.py,sha256=jlA8R0fLTwq53TTYZQPar01iZWtZgGiDnZxdIELXKGc,4377
6
+ brynq_sdk_nmbrs/companies.py,sha256=e4I6mjItbuQN-ZeEe1I4HD-4x3lW5brTAc0C6fMEloQ,5243
7
+ brynq_sdk_nmbrs/contract.py,sha256=lccpAbhNjj4x45WOnF7h2LlBG5XCXelnis7WyPvJJrE,4527
8
+ brynq_sdk_nmbrs/costcenter.py,sha256=eT_tHPI5VzC1Do46fYlXbv1Pi4l9izi6b03eXJkjfLg,7923
9
+ brynq_sdk_nmbrs/costunit.py,sha256=AUpik9lz-HaE23Z1_kw0dWdcgaBR9m0UDUK8AIcXj-E,3269
10
+ brynq_sdk_nmbrs/days.py,sha256=T2ZdMCN1iE6WseX40Hn8-iNRCz47kWUuwNVRwQJX7TY,4534
11
+ brynq_sdk_nmbrs/debtors.py,sha256=5YRqi3n6XoI3ccubRt6AnEj80oAGsAJjUlss_dwZxVo,3274
12
+ brynq_sdk_nmbrs/department.py,sha256=uhV-ZlnfcrhhZznXYiWSoySRynE73AW5XuD7CWYEqNM,8324
13
+ brynq_sdk_nmbrs/document.py,sha256=9t1l9oN2k6xZj0OkhBRjvVijGTuQNM_5o5AyYloJvY8,2539
14
+ brynq_sdk_nmbrs/employee_wage_tax_settings.py,sha256=mFFZ8ltivztBOSLG-V_bfJgaxMVLefr6syfBHZQLmfQ,4031
15
+ brynq_sdk_nmbrs/employees.py,sha256=O-agb_l8cb3cFjZ46u4XekrNF2B2TZwyen6EnkOeQqI,10944
16
+ brynq_sdk_nmbrs/employment.py,sha256=L5Oc-5Y3bj2Eqm5u8lDGIgwYSS-leK8fRaVQKePCLhI,3839
17
+ brynq_sdk_nmbrs/function.py,sha256=QuDHrgVy_KNP2rM6L53MXKYJsr5FZlb8vwTcW3AM6P8,7379
18
+ brynq_sdk_nmbrs/hours.py,sha256=3pbl6IA8BBC6wrfTvkJha1LJi4SjrZCBINUANhuDvDQ,8140
19
+ brynq_sdk_nmbrs/leave.py,sha256=XL3xXNUmkjpbvoXjY42m4uLm4rfB4WsvU0WDP2t88N8,8270
20
+ brynq_sdk_nmbrs/manager.py,sha256=wE2UJYPsKUN5jv3HmLpVAERcxcChwoMLfFgja8vxM6U,9441
21
+ brynq_sdk_nmbrs/salaries.py,sha256=zGKPrkvm1672gYR7aVwXUnLP3AbyoUhWn2TGZANLggA,5500
22
+ brynq_sdk_nmbrs/salary_tables.py,sha256=T7_bJE-CtRF08FWyLJnXm5Q3Q5Usozx4iCByqoTPOwo,9390
23
+ brynq_sdk_nmbrs/schedules.py,sha256=vXJ3iZ3BatosL3V_v7UlABrTJVmXXpgSItCrxrCfDXc,5714
24
+ brynq_sdk_nmbrs/social_insurance.py,sha256=4hmuXoeHGl2LUhXwtRL2KMXFu9iyrUgsYHTgUAINMSA,5105
25
+ brynq_sdk_nmbrs/wage_tax.py,sha256=ukNV-BxOHiwPm0ktYdvuul-S6RZuJWHN34RpAdV1rH4,9554
26
+ brynq_sdk_nmbrs/wagecomponents.py,sha256=nkk7HGlcdEx2K3VQ2G2zwLbNMFPNHQK4YwOEnFBtDj0,9539
27
+ brynq_sdk_nmbrs/schemas/__init__.py,sha256=rwMb9AJSBXn_50SOa1rIvwOsCrtpj3vQxjXioxrxuyI,2301
28
+ brynq_sdk_nmbrs/schemas/absence.py,sha256=f2ZDpy0qnyUyCjk2JjTNCazB_12lmP462MkI4eyf3ws,3320
29
+ brynq_sdk_nmbrs/schemas/address.py,sha256=iQvJEseqjBKzITJUpojmTHEhTExeQ7Ps0MrVlwbWIUE,5763
30
+ brynq_sdk_nmbrs/schemas/bank.py,sha256=QWMGevA4TKju8i20kAwEaV3FW7tpG4vjo0XTQvX90pw,4359
31
+ brynq_sdk_nmbrs/schemas/children.py,sha256=Vae7v2XPKwGQh3Oiz8cg-N0nbnTxDGVzMjOA7cKzFCY,3293
32
+ brynq_sdk_nmbrs/schemas/company.py,sha256=utYRXj_ch-RmI-AIShTqPj-LpdftEc8seHzkHZbxgew,1049
33
+ brynq_sdk_nmbrs/schemas/contracts.py,sha256=g5Wcn6QGhc95ZIyySSECiyMKJ_lUoeQgfa8rb-30ms0,4138
34
+ brynq_sdk_nmbrs/schemas/costcenter.py,sha256=YYuHr_9eNxM3pRXLYEBT4CU8KCleyJO9O-2d-_91AME,6961
35
+ brynq_sdk_nmbrs/schemas/costunit.py,sha256=WsICBZz2xliPoRyl1qT61AzcHE0o2ytmQLWCTmTSHww,1682
36
+ brynq_sdk_nmbrs/schemas/days.py,sha256=rLMETxP9yYD7mBX2pZDK9IJs4w16ejuwZ0tBip9bY6Q,6774
37
+ brynq_sdk_nmbrs/schemas/debtor.py,sha256=iCrVgSvwn0qXLGsEDlthmCznO_a2SsDWIV6ipsZmjZw,1608
38
+ brynq_sdk_nmbrs/schemas/department.py,sha256=Rhm-vTq5QdvMZeCrsgTF3hvzo1IC76MT4f2Gi8nK5qk,4475
39
+ brynq_sdk_nmbrs/schemas/document.py,sha256=RXTWQqoURv1G25foLtjcmWxcbFjneiuzlKjLcgGV_2E,598
40
+ brynq_sdk_nmbrs/schemas/employees.py,sha256=23bIe7KJIiVGrNSzDnUZIpNd5JVRxWS1x9V8qqMj7ms,11327
41
+ brynq_sdk_nmbrs/schemas/employment.py,sha256=cAZ5hfn01ipv3gTB3cSVRYKBBoeXSbE2K8L5nu0T2QY,2489
42
+ brynq_sdk_nmbrs/schemas/function.py,sha256=fPtF1yYJ_UMTx0ZTT2I3vBMW430doD3oi0HZ892shh8,3427
43
+ brynq_sdk_nmbrs/schemas/hours.py,sha256=dwH7_Dn0atztYHh35UzEX2i6e1Jr8ltZun_zsAXbbRw,7845
44
+ brynq_sdk_nmbrs/schemas/leave.py,sha256=IGV_n3lIeMQ5m9jV9ew2dz-F0oaN_BQBuiQ8h2tQ3ss,3893
45
+ brynq_sdk_nmbrs/schemas/manager.py,sha256=Wxbpv_ts0q7ywe63GTu0FxP_7s-NHFXvBYDBpjM4GJg,9055
46
+ brynq_sdk_nmbrs/schemas/salary.py,sha256=2dU9Pj1FM_4mGJEZAAsU1-6z6Wkjhc_cyjuN5Gdok_s,6168
47
+ brynq_sdk_nmbrs/schemas/schedules.py,sha256=KE5xDLrLPr63BqOHK20cPocHC73X9H6x0dZZTp48N5A,8851
48
+ brynq_sdk_nmbrs/schemas/social_insurance.py,sha256=Bmxzas6rFZ5j127GtvixsZJWv0PAucVZ_m73p_THryo,5377
49
+ brynq_sdk_nmbrs/schemas/wage_tax.py,sha256=5BKZCwy6pZGyNRiPftN53bkLkUZkAIHcPice6aJsOmo,12122
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,50 +0,0 @@
1
- brynq_sdk_nmbrs/__init__.py,sha256=O6SxqypTQcyz-CpgFu23RZWR5SekYirLn8iEydp9bAE,9836
2
- brynq_sdk_nmbrs/absence.py,sha256=xNzoDgw0Jj-JYS68lpwNzbrDy3BKsR-Iz-anlJW7YS0,4658
3
- brynq_sdk_nmbrs/address.py,sha256=FTzzs04tyNZNoysQ18lei137JXhvZUjYH8vS3Z5Nnk4,2325
4
- brynq_sdk_nmbrs/bank.py,sha256=2zZ9pCEdPkxvjqyyo0bfZw0JpJpzDBXZVNmO3lHjHGQ,4165
5
- brynq_sdk_nmbrs/children.py,sha256=hwgh3RKTs6oK6ztZ-TADXXK4Ekq_svo81D9aytCzkE4,3479
6
- brynq_sdk_nmbrs/companies.py,sha256=fqG9JERkaatkfzLFO3vC37rHr_W6pZ2DOeWS68b-TGc,3426
7
- brynq_sdk_nmbrs/contract.py,sha256=lccpAbhNjj4x45WOnF7h2LlBG5XCXelnis7WyPvJJrE,4527
8
- brynq_sdk_nmbrs/costcenter.py,sha256=gz7e486E9NqFXkqt50CctQ8DERC3pI2SPWsQWpIkHos,6087
9
- brynq_sdk_nmbrs/costunit.py,sha256=GGLwdCOYGU96Zr-zyG86rggzdsccH0IojfrPn5GanTI,3092
10
- brynq_sdk_nmbrs/days.py,sha256=T2ZdMCN1iE6WseX40Hn8-iNRCz47kWUuwNVRwQJX7TY,4534
11
- brynq_sdk_nmbrs/debtors.py,sha256=yig5Fdv9deyeoVwlGu8n5wwKdx7gZBDKtJLitQDAX98,785
12
- brynq_sdk_nmbrs/department.py,sha256=9Yk80w9lME5cN9FjtQ8_w0RDjqVwny54xDkI2FWmJ8M,4216
13
- brynq_sdk_nmbrs/document.py,sha256=Eb2mpsQRI1t5u0szUsc8YYI8tC_8ARW7wZUZRFA8RzQ,839
14
- brynq_sdk_nmbrs/employees.py,sha256=9ypKi7dFh5rqXL9mFJ2ltHci40idsk_sbuZjYfT_b_w,7517
15
- brynq_sdk_nmbrs/employment.py,sha256=P5EQhSAA6LOfeF2VeaAI8NZFTwSpD81ggJ9kUQp-WpE,3789
16
- brynq_sdk_nmbrs/function.py,sha256=bsafEcLglr2iT3jehbmGAme6-xI2ieOvaAueeVVT64I,3066
17
- brynq_sdk_nmbrs/hours.py,sha256=3pbl6IA8BBC6wrfTvkJha1LJi4SjrZCBINUANhuDvDQ,8140
18
- brynq_sdk_nmbrs/leave.py,sha256=Z17nPlRTVy_pqyInrbJNnF_83c8__Z207nh1aWVycCg,4515
19
- brynq_sdk_nmbrs/manager.py,sha256=wE2UJYPsKUN5jv3HmLpVAERcxcChwoMLfFgja8vxM6U,9441
20
- brynq_sdk_nmbrs/salaries.py,sha256=0VZgPwIl4YSeil7IUliPg8XFWloIQX2rBoWurSOLa9g,2910
21
- brynq_sdk_nmbrs/salary_tables.py,sha256=T7_bJE-CtRF08FWyLJnXm5Q3Q5Usozx4iCByqoTPOwo,9390
22
- brynq_sdk_nmbrs/schedules.py,sha256=jvi3aRdsgU_lalVWAcnfsfg8-g7J4m8pVW42HP-aExA,2928
23
- brynq_sdk_nmbrs/social_insurance.py,sha256=7sfgZeGDXGrvcsj8tTj7JaFK2fSOzVdtEjJ0wKRr2BI,1899
24
- brynq_sdk_nmbrs/wage_tax.py,sha256=NgqzEwzc_n28LtWhOM4EfHUo-vy-QwZA6wiL2n8LcdM,6241
25
- brynq_sdk_nmbrs/wagecomponents.py,sha256=nkk7HGlcdEx2K3VQ2G2zwLbNMFPNHQK4YwOEnFBtDj0,9539
26
- brynq_sdk_nmbrs/schemas/__init__.py,sha256=rwMb9AJSBXn_50SOa1rIvwOsCrtpj3vQxjXioxrxuyI,2301
27
- brynq_sdk_nmbrs/schemas/absence.py,sha256=f2ZDpy0qnyUyCjk2JjTNCazB_12lmP462MkI4eyf3ws,3320
28
- brynq_sdk_nmbrs/schemas/address.py,sha256=jgckNL5GhI23U0CS6VSs8vdl0pd4Goue57pIB8Mg6RU,4151
29
- brynq_sdk_nmbrs/schemas/bank.py,sha256=h5OtnD9DfJXfNeAoD9gm1434qXchbS6RPLKNRpxQ2RU,4537
30
- brynq_sdk_nmbrs/schemas/contracts.py,sha256=wb_NJyzKg7pjtWVelKj1_rfI57cs8jQ2QnMVu-aS_jI,3848
31
- brynq_sdk_nmbrs/schemas/costcenter.py,sha256=vB-cJCaLn57Gc7oAK2PTJvIpnz7zZkEX5ry0iJ_ZaX8,5328
32
- brynq_sdk_nmbrs/schemas/costunit.py,sha256=dH1nD9yuT94YamBz8phhuZ7E7AEuU4DmL6dXQYI8lu0,1854
33
- brynq_sdk_nmbrs/schemas/days.py,sha256=GJC9-ELfWCFVA7Z1vq4UANq8omFnPdeiowhjUu7-7a0,6952
34
- brynq_sdk_nmbrs/schemas/debtor.py,sha256=07FUL9MNKMfGKUifqeWSgQBTq1pVG5NB0OkaFgB9v88,721
35
- brynq_sdk_nmbrs/schemas/department.py,sha256=Rq88XAOIMNzojpHhb3awdV1ALlmkI_ZjMbiwXKSz6lY,3106
36
- brynq_sdk_nmbrs/schemas/employees.py,sha256=QblOZk4BCbXGoDW-kdAAykl-aLXzsBmfjewG_vU0qwg,11077
37
- brynq_sdk_nmbrs/schemas/employment.py,sha256=4KY0WEdZfJ-4x_loaZhBLoPYwQcA3k3TYuWRZj4PDxI,2678
38
- brynq_sdk_nmbrs/schemas/function.py,sha256=c0LkdAvyLr1_b9e7h7-2KD4v-YHtCKrm3x54Lc6V_sk,2503
39
- brynq_sdk_nmbrs/schemas/hours.py,sha256=CJOD3-NL80bh3nqIZ6DwoKQ0MGfe5ba84IXv0HsA_pA,8201
40
- brynq_sdk_nmbrs/schemas/leave.py,sha256=pofHHdYuPTS4hdFQbYQf2NbbYb4QlD3jI5CPGXSpNq8,3313
41
- brynq_sdk_nmbrs/schemas/manager.py,sha256=NT8Uh1yfoZQ9ODCZBkVUJ50QwQ5GtHNG6_Rx_EO674U,9310
42
- brynq_sdk_nmbrs/schemas/salary.py,sha256=pq-4hOB7QIo0BG8_Q_JnDbovPAhXOytfCpSuU_kXrGw,5511
43
- brynq_sdk_nmbrs/schemas/schedules.py,sha256=ITB4GAVNXyQLh0Ji_kJpdp1ZNGtYRlOTNHRvNiLg8wg,5481
44
- brynq_sdk_nmbrs/schemas/social_insurance.py,sha256=xJX7Duzcnu4vrKWIAan1iCUhNDtRflOLrIg7YBbtu70,2470
45
- brynq_sdk_nmbrs/schemas/wage_tax.py,sha256=ohbsc0zIHcZ-oj4vctxFA6XWIs0Wv9Uu4jUy7EP61ZU,7342
46
- brynq_sdk_nmbrs/schemas/wagecomponents.py,sha256=_t00-b22JEgihDdMMjwVw1mzCEnna55RnEZDYFwDZ1c,7769
47
- brynq_sdk_nmbrs-2.3.1.dist-info/METADATA,sha256=Q0gZCGo8Lx9WF_6Difmfx_ClIhndS-fEgNELrzp0hUo,529
48
- brynq_sdk_nmbrs-2.3.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
49
- brynq_sdk_nmbrs-2.3.1.dist-info/top_level.txt,sha256=LrSQFzIV7FP02jBHdBKubiCbIy0C_5YnTz3DSYYoQzg,16
50
- brynq_sdk_nmbrs-2.3.1.dist-info/RECORD,,