brynq-sdk-sage-germany 1.0.0__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_sage_germany/__init__.py +278 -0
- brynq_sdk_sage_germany/absences.py +175 -0
- brynq_sdk_sage_germany/allowances.py +100 -0
- brynq_sdk_sage_germany/contracts.py +145 -0
- brynq_sdk_sage_germany/cost_centers.py +89 -0
- brynq_sdk_sage_germany/employees.py +140 -0
- brynq_sdk_sage_germany/helpers.py +391 -0
- brynq_sdk_sage_germany/organization.py +90 -0
- brynq_sdk_sage_germany/payroll.py +167 -0
- brynq_sdk_sage_germany/payslips.py +106 -0
- brynq_sdk_sage_germany/salaries.py +95 -0
- brynq_sdk_sage_germany/schemas/__init__.py +44 -0
- brynq_sdk_sage_germany/schemas/absences.py +311 -0
- brynq_sdk_sage_germany/schemas/allowances.py +147 -0
- brynq_sdk_sage_germany/schemas/cost_centers.py +46 -0
- brynq_sdk_sage_germany/schemas/employees.py +487 -0
- brynq_sdk_sage_germany/schemas/organization.py +172 -0
- brynq_sdk_sage_germany/schemas/organization_assignment.py +61 -0
- brynq_sdk_sage_germany/schemas/payroll.py +287 -0
- brynq_sdk_sage_germany/schemas/payslips.py +34 -0
- brynq_sdk_sage_germany/schemas/salaries.py +101 -0
- brynq_sdk_sage_germany/schemas/start_end_dates.py +194 -0
- brynq_sdk_sage_germany/schemas/vacation_account.py +117 -0
- brynq_sdk_sage_germany/schemas/work_hours.py +94 -0
- brynq_sdk_sage_germany/start_end_dates.py +123 -0
- brynq_sdk_sage_germany/vacation_account.py +70 -0
- brynq_sdk_sage_germany/work_hours.py +97 -0
- brynq_sdk_sage_germany-1.0.0.dist-info/METADATA +21 -0
- brynq_sdk_sage_germany-1.0.0.dist-info/RECORD +31 -0
- brynq_sdk_sage_germany-1.0.0.dist-info/WHEEL +5 -0
- brynq_sdk_sage_germany-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Schemas for Sage Germany organization payloads.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import List, Optional
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
import pandera as pa
|
|
9
|
+
from pandera.typing import Series
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
12
|
+
|
|
13
|
+
from brynq_sdk_functions import BrynQPanderaDataFrameModel
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"OrganizationGet",
|
|
17
|
+
"OrganizationCreate",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class OrgIdText(BaseModel):
|
|
22
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Identifier value.", example=1)
|
|
23
|
+
text: Optional[str] = Field(default=None, alias="Text", description="Display text value.", example="Sample text")
|
|
24
|
+
|
|
25
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class OrganizationKey(BaseModel):
|
|
29
|
+
date: str = Field(alias="Date", description="Snapshot date.", example="2024-01-01T00:00:00", json_schema_extra={"prefix": "key_"})
|
|
30
|
+
company_id: int = Field(alias="MdNr", description="Company id (Mandant).", example=1, json_schema_extra={"prefix": "key_"})
|
|
31
|
+
employee_number: int = Field(alias="AnNr", description="Employee number.", example=100, json_schema_extra={"prefix": "key_"})
|
|
32
|
+
combined_key: Optional[str] = Field(default=None, alias="CombinedKey", description="Combined key string.", example="1_100", json_schema_extra={"prefix": "key_"})
|
|
33
|
+
|
|
34
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class OrgGeneralData(BaseModel):
|
|
38
|
+
use_operating_sites: Optional[bool] = Field(default=None, alias="VerwendungBetriebsstaetten", description="Use operating sites flag.", example=True, json_schema_extra={"prefix": "general_"})
|
|
39
|
+
payroll_group: Optional[OrgIdText] = Field(default=None, alias="Abrechnungskreis", description="Payroll group reference.", json_schema_extra={"prefix": "general_payroll_group_"})
|
|
40
|
+
payroll_run: Optional[OrgIdText] = Field(default=None, alias="Abrechnungslauf", description="Payroll run reference.", json_schema_extra={"prefix": "general_payroll_run_"})
|
|
41
|
+
federal_state: Optional[OrgIdText] = Field(default=None, alias="Bundesland", description="Federal state reference.", json_schema_extra={"prefix": "general_state_"})
|
|
42
|
+
site: Optional[OrgIdText] = Field(default=None, alias="Betriebsstaette", description="Operating site reference.", json_schema_extra={"prefix": "general_site_"})
|
|
43
|
+
debtor_number: Optional[str] = Field(default=None, alias="DebitorenNummer", description="Debtor number.", example="DEB001", json_schema_extra={"prefix": "general_"})
|
|
44
|
+
calc_cost_center: Optional[OrgIdText] = Field(default=None, alias="KalkulatorischeKostenstelle", description="Calculated cost center reference.", json_schema_extra={"prefix": "general_calc_cost_center_"})
|
|
45
|
+
position: Optional[OrgIdText] = Field(default=None, alias="Position", description="Position reference.", json_schema_extra={"prefix": "general_position_"})
|
|
46
|
+
|
|
47
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class OrgSearchTerms(BaseModel):
|
|
51
|
+
search_1: Optional[str] = Field(default=None, alias="Such1", description="Search term 1.", example="Engineering", json_schema_extra={"prefix": "search_terms_"})
|
|
52
|
+
search_2: Optional[str] = Field(default=None, alias="Such2", description="Search term 2.", example="Berlin", json_schema_extra={"prefix": "search_terms_"})
|
|
53
|
+
search_3: Optional[str] = Field(default=None, alias="Such3", description="Search term 3.", example="Full-time", json_schema_extra={"prefix": "search_terms_"})
|
|
54
|
+
search_4: Optional[str] = Field(default=None, alias="Such4", description="Search term 4.", example="Active", json_schema_extra={"prefix": "search_terms_"})
|
|
55
|
+
|
|
56
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class OrgSplitEntry(BaseModel):
|
|
60
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Split entry identifier.", example=1)
|
|
61
|
+
number: Optional[str] = Field(default=None, alias="Number", description="Split entry number.", example="001")
|
|
62
|
+
text: Optional[str] = Field(default=None, alias="Text", description="Split entry text.", example="Main")
|
|
63
|
+
portion: Optional[float] = Field(default=None, alias="Anteil", description="Portion percentage.", example=100.0)
|
|
64
|
+
|
|
65
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class OrgSplitContainer(BaseModel):
|
|
69
|
+
split: Optional[List[OrgSplitEntry]] = Field(default=None, alias="Aufteilung", description="Split entries list.", example=[])
|
|
70
|
+
|
|
71
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class OrgStructure(BaseModel):
|
|
75
|
+
id: Optional[str] = Field(default=None, alias="Id", description="Structure identifier.", example="STR001")
|
|
76
|
+
structure: Optional[OrgIdText] = Field(default=None, alias="Struktur", description="Structure reference.")
|
|
77
|
+
unit: Optional[OrgIdText] = Field(default=None, alias="Einheit", description="Unit reference.")
|
|
78
|
+
valid_from: Optional[str] = Field(default=None, alias="ValidFrom", description="Valid from date.", example="2024-01-01")
|
|
79
|
+
valid_to: Optional[str] = Field(default=None, alias="ValidTo", description="Valid to date.", example="2024-12-31")
|
|
80
|
+
|
|
81
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class OrgFixedDistribution(BaseModel):
|
|
85
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Fixed distribution identifier.", example=1)
|
|
86
|
+
cost_center: Optional[OrgIdText] = Field(default=None, alias="Kostenstelle", description="Cost center reference.")
|
|
87
|
+
cost_unit: Optional[OrgIdText] = Field(default=None, alias="Kostentraeger", description="Cost unit reference.")
|
|
88
|
+
dimension_one: Optional[OrgIdText] = Field(default=None, alias="Dimension1", description="Dimension 1 reference.")
|
|
89
|
+
dimension_two: Optional[OrgIdText] = Field(default=None, alias="Dimension2", description="Dimension 2 reference.")
|
|
90
|
+
dimension_three: Optional[OrgIdText] = Field(default=None, alias="Dimension3", description="Dimension 3 reference.")
|
|
91
|
+
portion: Optional[float] = Field(default=None, alias="Anteil", description="Portion percentage.", example=100.0)
|
|
92
|
+
|
|
93
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class OrganizationCreate(BaseModel):
|
|
97
|
+
key: OrganizationKey = Field(alias="Key", description="Organization key.", json_schema_extra={"prefix": "key_"})
|
|
98
|
+
is_fixed_cost_split: Optional[bool] = Field(default=None, alias="IstFesteKostenAufteilung", description="Fixed cost split flag.", example=False)
|
|
99
|
+
general_data: Optional[OrgGeneralData] = Field(default=None, alias="AllgemeineDaten", description="General data block.", json_schema_extra={"prefix": "general_"})
|
|
100
|
+
search_terms: Optional[OrgSearchTerms] = Field(default=None, alias="Suchbegriffe", description="Search terms block.", json_schema_extra={"prefix": "search_terms_"})
|
|
101
|
+
cost_centers: Optional[OrgSplitContainer] = Field(default=None, alias="Kostenstellen", description="Cost centers container.", json_schema_extra={"prefix": "cost_center_"})
|
|
102
|
+
cost_units: Optional[OrgSplitContainer] = Field(default=None, alias="Kostentraeger", description="Cost units container.", json_schema_extra={"prefix": "cost_unit_"})
|
|
103
|
+
dimension_one: Optional[OrgSplitContainer] = Field(default=None, alias="Dimension1", description="Dimension 1 container.", json_schema_extra={"prefix": "dimension_one_"})
|
|
104
|
+
dimension_two: Optional[OrgSplitContainer] = Field(default=None, alias="Dimension2", description="Dimension 2 container.", json_schema_extra={"prefix": "dimension_two_"})
|
|
105
|
+
dimension_three: Optional[OrgSplitContainer] = Field(default=None, alias="Dimension3", description="Dimension 3 container.", json_schema_extra={"prefix": "dimension_three_"})
|
|
106
|
+
org_assignments: Optional[List[OrgStructure]] = Field(default=None, alias="OrgaEinordnungen", description="Organization assignments list.", example=[], json_schema_extra={"prefix": "org_assign_"})
|
|
107
|
+
fixed_distribution: Optional[List[OrgFixedDistribution]] = Field(default=None, alias="FesteAufteilung", description="Fixed distribution list.", example=[], json_schema_extra={"prefix": "fixed_"})
|
|
108
|
+
|
|
109
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class OrganizationGet(BrynQPanderaDataFrameModel):
|
|
113
|
+
"""
|
|
114
|
+
Pandera schema for employee organization data (cost centers, cost units, structures).
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
# Key
|
|
118
|
+
key_date: Series[pd.StringDtype] = pa.Field(alias="Key__Date", coerce=True, nullable=False, description="Snapshot date.")
|
|
119
|
+
company_id: Series[pd.Int64Dtype] = pa.Field(alias="Key__MdNr", coerce=True, nullable=False, description="Company id.")
|
|
120
|
+
employee_number: Series[pd.Int64Dtype] = pa.Field(alias="Key__AnNr", coerce=True, nullable=False, description="Employee number.")
|
|
121
|
+
combined_key: Series[pd.StringDtype] = pa.Field(alias="Key__CombinedKey", coerce=True, nullable=False, description="Combined key.")
|
|
122
|
+
key_is_empty: Optional[Series[bool]] = pa.Field(alias="Key__IsEmpty", coerce=True, nullable=True, description="Key empty flag.")
|
|
123
|
+
|
|
124
|
+
# Flags
|
|
125
|
+
fixed_cost_split: Optional[Series[bool]] = pa.Field(alias="IstFesteKostenAufteilung", coerce=True, nullable=True, description="Fixed cost split flag.")
|
|
126
|
+
uses_operating_sites: Optional[Series[bool]] = pa.Field(alias="AllgemeineDaten__VerwendungBetriebsstaetten", coerce=True, nullable=True, description="Uses operating sites flag.")
|
|
127
|
+
|
|
128
|
+
# General data
|
|
129
|
+
payroll_group_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungskreis__Id", coerce=True, nullable=True, description="Payroll group id.")
|
|
130
|
+
payroll_group_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungskreis__Text", coerce=True, nullable=True, description="Payroll group text.")
|
|
131
|
+
payroll_group_id_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungskreis__IdMitText", coerce=True, nullable=True, description="Payroll group id+text.")
|
|
132
|
+
|
|
133
|
+
payroll_run_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungslauf__Id", coerce=True, nullable=True, description="Payroll run id.")
|
|
134
|
+
payroll_run_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungslauf__Text", coerce=True, nullable=True, description="Payroll run text.")
|
|
135
|
+
payroll_run_id_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungslauf__IdMitText", coerce=True, nullable=True, description="Payroll run id+text.")
|
|
136
|
+
|
|
137
|
+
site_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Betriebsstaette__Id", coerce=True, nullable=True, description="Site id.")
|
|
138
|
+
site_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Betriebsstaette__Text", coerce=True, nullable=True, description="Site text.")
|
|
139
|
+
site_id_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Betriebsstaette__IdMitText", coerce=True, nullable=True, description="Site id+text.")
|
|
140
|
+
|
|
141
|
+
position_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Position__Id", coerce=True, nullable=True, description="Position id.")
|
|
142
|
+
position_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Position__Text", coerce=True, nullable=True, description="Position text.")
|
|
143
|
+
position_id_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Position__IdMitText", coerce=True, nullable=True, description="Position id+text.")
|
|
144
|
+
|
|
145
|
+
debtor_number: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__DebitorenNummer", coerce=True, nullable=True, description="Debtor number.")
|
|
146
|
+
calc_cost_center: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__KalkulatorischeKostenstelle", coerce=True, nullable=True, description="Calculated cost center.")
|
|
147
|
+
|
|
148
|
+
# Search terms
|
|
149
|
+
search_term_1: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such1", coerce=True, nullable=True, description="Search term 1.")
|
|
150
|
+
search_term_2: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such2", coerce=True, nullable=True, description="Search term 2.")
|
|
151
|
+
search_term_3: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such3", coerce=True, nullable=True, description="Search term 3.")
|
|
152
|
+
search_term_4: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such4", coerce=True, nullable=True, description="Search term 4.")
|
|
153
|
+
|
|
154
|
+
# Cost centers split
|
|
155
|
+
cost_center_split: Optional[Series[pd.StringDtype]] = pa.Field(alias="Kostenstellen__Aufteilung", coerce=True, nullable=True, description="Cost center split payload.")
|
|
156
|
+
cost_unit_split: Optional[Series[pd.StringDtype]] = pa.Field(alias="Kostentraeger__Aufteilung", coerce=True, nullable=True, description="Cost unit split payload.")
|
|
157
|
+
|
|
158
|
+
# Dimensions
|
|
159
|
+
dimension_one: Optional[Series[pd.StringDtype]] = pa.Field(alias="Dimension1", coerce=True, nullable=True, description="Dimension 1.")
|
|
160
|
+
dimension_two: Optional[Series[pd.StringDtype]] = pa.Field(alias="Dimension2", coerce=True, nullable=True, description="Dimension 2.")
|
|
161
|
+
dimension_three: Optional[Series[pd.StringDtype]] = pa.Field(alias="Dimension3", coerce=True, nullable=True, description="Dimension 3.")
|
|
162
|
+
|
|
163
|
+
# Org assignments payloads
|
|
164
|
+
org_assignments: Optional[Series[pd.StringDtype]] = pa.Field(alias="OrgaEinordnungen", coerce=True, nullable=True, description="Organization assignments payload.")
|
|
165
|
+
fixed_distribution: Optional[Series[pd.StringDtype]] = pa.Field(alias="FesteAufteilung", coerce=True, nullable=True, description="Fixed distribution payload.")
|
|
166
|
+
|
|
167
|
+
class _Annotation:
|
|
168
|
+
primary_key = "combined_key"
|
|
169
|
+
|
|
170
|
+
class Config:
|
|
171
|
+
coerce = True
|
|
172
|
+
strict = "filter"
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Schemas for Sage Germany organization assignment (person/organisation) payloads.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
import pandera as pa
|
|
9
|
+
from pandera.typing import Series
|
|
10
|
+
|
|
11
|
+
from brynq_sdk_functions import BrynQPanderaDataFrameModel
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class OrganizationAssignmentGet(BrynQPanderaDataFrameModel):
|
|
15
|
+
"""
|
|
16
|
+
Pandera schema for employee organization assignment data.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
# Base identifiers
|
|
20
|
+
key_date: Series[pd.StringDtype] = pa.Field(alias="Key__Date", coerce=True, nullable=False, description="Snapshot date.")
|
|
21
|
+
company_id: Series[pd.Int64Dtype] = pa.Field(alias="Key__MdNr", coerce=True, nullable=False, description="Company id.")
|
|
22
|
+
employee_number: Series[pd.Int64Dtype] = pa.Field(alias="Key__AnNr", coerce=True, nullable=False, description="Employee number.")
|
|
23
|
+
combined_key: Series[pd.StringDtype] = pa.Field(alias="Key__CombinedKey", coerce=True, nullable=False, description="Combined key.")
|
|
24
|
+
key_is_empty: Optional[Series[bool]] = pa.Field(alias="Key__IsEmpty", coerce=True, nullable=True, description="Key empty flag.")
|
|
25
|
+
|
|
26
|
+
fixed_cost_split: Optional[Series[bool]] = pa.Field(alias="IstFesteKostenAufteilung", coerce=True, nullable=True, description="Fixed cost split flag.")
|
|
27
|
+
|
|
28
|
+
# General data
|
|
29
|
+
uses_operating_sites: Optional[Series[bool]] = pa.Field(alias="AllgemeineDaten__VerwendungBetriebsstaetten", coerce=True, nullable=True, description="Uses operating sites flag.")
|
|
30
|
+
payroll_group_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungskreis__Id", coerce=True, nullable=True, description="Payroll group id.")
|
|
31
|
+
payroll_group_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungskreis__Text", coerce=True, nullable=True, description="Payroll group text.")
|
|
32
|
+
payroll_run_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungslauf__Id", coerce=True, nullable=True, description="Payroll run id.")
|
|
33
|
+
payroll_run_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Abrechnungslauf__Text", coerce=True, nullable=True, description="Payroll run text.")
|
|
34
|
+
site_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Betriebsstaette__Id", coerce=True, nullable=True, description="Site id.")
|
|
35
|
+
site_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Betriebsstaette__Text", coerce=True, nullable=True, description="Site text.")
|
|
36
|
+
position_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="AllgemeineDaten__Position__Id", coerce=True, nullable=True, description="Position id.")
|
|
37
|
+
position_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="AllgemeineDaten__Position__Text", coerce=True, nullable=True, description="Position text.")
|
|
38
|
+
|
|
39
|
+
# Search terms
|
|
40
|
+
search_term_1: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such1", coerce=True, nullable=True, description="Search term 1.")
|
|
41
|
+
search_term_2: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such2", coerce=True, nullable=True, description="Search term 2.")
|
|
42
|
+
search_term_3: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such3", coerce=True, nullable=True, description="Search term 3.")
|
|
43
|
+
search_term_4: Optional[Series[pd.StringDtype]] = pa.Field(alias="Suchbegriffe__Such4", coerce=True, nullable=True, description="Search term 4.")
|
|
44
|
+
|
|
45
|
+
# Dimensions
|
|
46
|
+
dimension_one: Optional[Series[pd.StringDtype]] = pa.Field(alias="Dimension1", coerce=True, nullable=True, description="Custom dimension 1.")
|
|
47
|
+
dimension_two: Optional[Series[pd.StringDtype]] = pa.Field(alias="Dimension2", coerce=True, nullable=True, description="Custom dimension 2.")
|
|
48
|
+
dimension_three: Optional[Series[pd.StringDtype]] = pa.Field(alias="Dimension3", coerce=True, nullable=True, description="Custom dimension 3.")
|
|
49
|
+
|
|
50
|
+
# Raw payloads for splits and org assignments
|
|
51
|
+
cost_centers_payload: Optional[Series[pd.StringDtype]] = pa.Field(alias="Kostenstellen", coerce=True, nullable=True, description="Cost centers split payload.")
|
|
52
|
+
cost_units_payload: Optional[Series[pd.StringDtype]] = pa.Field(alias="Kostentraeger", coerce=True, nullable=True, description="Cost units split payload.")
|
|
53
|
+
org_assignments_payload: Optional[Series[pd.StringDtype]] = pa.Field(alias="OrgaEinordnungen", coerce=True, nullable=True, description="Organization assignments payload.")
|
|
54
|
+
fixed_distribution_payload: Optional[Series[pd.StringDtype]] = pa.Field(alias="FesteAufteilung", coerce=True, nullable=True, description="Fixed distribution payload.")
|
|
55
|
+
|
|
56
|
+
class _Annotation:
|
|
57
|
+
primary_key = "combined_key"
|
|
58
|
+
|
|
59
|
+
class Config:
|
|
60
|
+
coerce = True
|
|
61
|
+
strict = "filter"
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Schemas for Sage Germany payroll payloads.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
import pandera as pa
|
|
9
|
+
from pandera.typing import Series
|
|
10
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
11
|
+
|
|
12
|
+
from brynq_sdk_functions import BrynQPanderaDataFrameModel
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"PayrollMasterDataCreate",
|
|
16
|
+
"PayrollMasterDataGet",
|
|
17
|
+
"PayrollGet",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class PayrollIdText(BaseModel):
|
|
22
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Identifier value.", example=1)
|
|
23
|
+
text: Optional[str] = Field(default=None, alias="Text", description="Display text value.", example="Sample text")
|
|
24
|
+
|
|
25
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class PayrollKey(BaseModel):
|
|
29
|
+
date: str = Field(alias="Date", description="Snapshot date.", example="2024-01-01T00:00:00", json_schema_extra={"prefix": "key_"})
|
|
30
|
+
company_id: int = Field(alias="MdNr", description="Company id (Mandant).", example=1, json_schema_extra={"prefix": "key_"})
|
|
31
|
+
employee_number: int = Field(alias="AnNr", description="Employee number.", example=100, json_schema_extra={"prefix": "key_"})
|
|
32
|
+
combined_key: Optional[str] = Field(default=None, alias="CombinedKey", description="Combined key string.", example="1_100", json_schema_extra={"prefix": "key_"})
|
|
33
|
+
|
|
34
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class PayrollTaxData(BaseModel):
|
|
38
|
+
tax_by_class: Optional[bool] = Field(default=None, alias="BesteuerungNachSteuerklasse", description="Tax by class flag.", example=True, json_schema_extra={"prefix": "tax_data_"})
|
|
39
|
+
last_registration: Optional[str] = Field(default=None, alias="LetzteAnmeldung", description="Last registration date.", example="2024-01-01", json_schema_extra={"prefix": "tax_data_"})
|
|
40
|
+
elstam_status_id: Optional[str] = Field(default=None, alias="ElstamStatusId", description="ELStAM status id.", example="1", json_schema_extra={"prefix": "tax_data_"})
|
|
41
|
+
elstam_status_text: Optional[str] = Field(default=None, alias="ElstamStatusText", description="ELStAM status text.", example="Active", json_schema_extra={"prefix": "tax_data_"})
|
|
42
|
+
employment_type: Optional[PayrollIdText] = Field(default=None, alias="Beschaeftigungsart", description="Employment type reference.", json_schema_extra={"prefix": "tax_data_employment_type_"})
|
|
43
|
+
elstam_exclusion_reason: Optional[PayrollIdText] = Field(default=None, alias="GrundElstamAusschluss", description="ELStAM exclusion reason.", json_schema_extra={"prefix": "tax_data_elstam_exclusion_reason_"})
|
|
44
|
+
tax_calc_type: Optional[PayrollIdText] = Field(default=None, alias="ArtDerSteuerberechnung", description="Tax calculation type.", json_schema_extra={"prefix": "tax_data_tax_calc_type_"})
|
|
45
|
+
tax_class: Optional[int] = Field(default=None, alias="Steuerklasse", description="Tax class.", example=1, json_schema_extra={"prefix": "tax_data_"})
|
|
46
|
+
factor: Optional[float] = Field(default=None, alias="Faktor", description="Tax factor.", example=1.0, json_schema_extra={"prefix": "tax_data_"})
|
|
47
|
+
child_allowance: Optional[float] = Field(default=None, alias="Kinderfreibetrag", description="Child allowance.", example=0.5, json_schema_extra={"prefix": "tax_data_"})
|
|
48
|
+
religion: Optional[PayrollIdText] = Field(default=None, alias="Konfession", description="Religion reference.", json_schema_extra={"prefix": "tax_data_religion_"})
|
|
49
|
+
spouse_religion: Optional[PayrollIdText] = Field(default=None, alias="KonfessionEhegatte", description="Spouse religion reference.", json_schema_extra={"prefix": "tax_data_spouse_religion_"})
|
|
50
|
+
allowance_year: Optional[float] = Field(default=None, alias="FreibetragJahr", description="Yearly allowance.", example=1200.0, json_schema_extra={"prefix": "tax_data_"})
|
|
51
|
+
allowance_month: Optional[float] = Field(default=None, alias="FreibetragMonat", description="Monthly allowance.", example=100.0, json_schema_extra={"prefix": "tax_data_"})
|
|
52
|
+
addback_year: Optional[float] = Field(default=None, alias="HinzurechungsbetragJahr", description="Yearly addback.", example=0.0, json_schema_extra={"prefix": "tax_data_"})
|
|
53
|
+
addback_month: Optional[float] = Field(default=None, alias="HinzurechnungsbetragMonat", description="Monthly addback.", example=0.0, json_schema_extra={"prefix": "tax_data_"})
|
|
54
|
+
income_tax_equalization: Optional[bool] = Field(default=None, alias="Lohnsteuerjahresausgleich", description="Income tax equalization flag.", example=True, json_schema_extra={"prefix": "tax_data_"})
|
|
55
|
+
clawback_tax: Optional[bool] = Field(default=None, alias="Nachversteuerung", description="Clawback tax flag.", example=False, json_schema_extra={"prefix": "tax_data_"})
|
|
56
|
+
|
|
57
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class PayrollActivity(BaseModel):
|
|
61
|
+
person_group: Optional[PayrollIdText] = Field(default=None, alias="Personengruppenschluessel", description="Person group reference.", json_schema_extra={"prefix": "activity_person_group_"})
|
|
62
|
+
multi_employed: Optional[bool] = Field(default=None, alias="Mehrfachbeschaeftigt", description="Multi-employed flag.", example=False, json_schema_extra={"prefix": "activity_"})
|
|
63
|
+
education: Optional[PayrollIdText] = Field(default=None, alias="Schulabschluss", description="Education level reference.", json_schema_extra={"prefix": "activity_education_"})
|
|
64
|
+
apprenticeship: Optional[PayrollIdText] = Field(default=None, alias="Ausbildung", description="Apprenticeship reference.", json_schema_extra={"prefix": "activity_apprenticeship_"})
|
|
65
|
+
contract_form: Optional[PayrollIdText] = Field(default=None, alias="Vertragsform", description="Contract form reference.", json_schema_extra={"prefix": "activity_contract_form_"})
|
|
66
|
+
employment: Optional[PayrollIdText] = Field(default=None, alias="Beschaeftigung", description="Employment reference.", json_schema_extra={"prefix": "activity_employment_"})
|
|
67
|
+
leasing: Optional[int] = Field(default=None, alias="Leiharbeit", description="Leasing worker code.", example=0, json_schema_extra={"prefix": "activity_"})
|
|
68
|
+
special_case: Optional[PayrollIdText] = Field(default=None, alias="Besonderheit", description="Special case reference.", json_schema_extra={"prefix": "activity_special_case_"})
|
|
69
|
+
occupation_key: Optional[str] = Field(default=None, alias="Taetigkeitsschluessel", description="Occupation key.", example="12345", json_schema_extra={"prefix": "activity_"})
|
|
70
|
+
occupation_key_2010: Optional[str] = Field(default=None, alias="Taetigkeitsschluessel2010", description="Occupation key 2010.", example="54321", json_schema_extra={"prefix": "activity_"})
|
|
71
|
+
|
|
72
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class PayrollHealthFund(BaseModel):
|
|
76
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Health fund identifier.", example=1)
|
|
77
|
+
name: Optional[str] = Field(default=None, alias="Name", description="Health fund name.", example="AOK")
|
|
78
|
+
fund_type: Optional[str] = Field(default=None, alias="Kassenart", description="Fund type.", example="Public")
|
|
79
|
+
|
|
80
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class PayrollSocialInsurance(BaseModel):
|
|
84
|
+
social_key: Optional[str] = Field(default=None, alias="SVSchluessel", description="Social insurance key.", example="1111", json_schema_extra={"prefix": "social_insurance_"})
|
|
85
|
+
health_fund: Optional[PayrollHealthFund] = Field(default=None, alias="Krankenkasse", description="Health fund reference.", json_schema_extra={"prefix": "social_insurance_health_fund_"})
|
|
86
|
+
pension_fund: Optional[PayrollHealthFund] = Field(default=None, alias="Versorgungswerk", description="Pension fund reference.", json_schema_extra={"prefix": "social_insurance_pension_fund_"})
|
|
87
|
+
employee_health_share: Optional[float] = Field(default=None, alias="ArbeitnehmeranteilKrankenversicherung", description="Employee health insurance share.", example=7.3, json_schema_extra={"prefix": "social_insurance_"})
|
|
88
|
+
employer_health_share: Optional[float] = Field(default=None, alias="ArbeitgeberanteilKrankenversicherung", description="Employer health insurance share.", example=7.3, json_schema_extra={"prefix": "social_insurance_"})
|
|
89
|
+
total_private_health: Optional[float] = Field(default=None, alias="GesamtbeitragPrivateKrankenversicherung", description="Total private health insurance.", example=0.0, json_schema_extra={"prefix": "social_insurance_"})
|
|
90
|
+
base_private_health: Optional[float] = Field(default=None, alias="BasistarifPrivateKrankenversicherung", description="Base private health insurance.", example=0.0, json_schema_extra={"prefix": "social_insurance_"})
|
|
91
|
+
employee_care_share: Optional[float] = Field(default=None, alias="ArbeitnehmeranteilPflegeversicherung", description="Employee care insurance share.", example=1.525, json_schema_extra={"prefix": "social_insurance_"})
|
|
92
|
+
employer_care_share: Optional[float] = Field(default=None, alias="ArbeitgeberanteilPflegeversicherung", description="Employer care insurance share.", example=1.525, json_schema_extra={"prefix": "social_insurance_"})
|
|
93
|
+
total_private_care: Optional[float] = Field(default=None, alias="GesamtbeitragPrivatePflegeversicherung", description="Total private care insurance.", example=0.0, json_schema_extra={"prefix": "social_insurance_"})
|
|
94
|
+
base_private_care: Optional[float] = Field(default=None, alias="BasistarifPrivatePflegeversicherung", description="Base private care insurance.", example=0.0, json_schema_extra={"prefix": "social_insurance_"})
|
|
95
|
+
parent_status: Optional[PayrollIdText] = Field(default=None, alias="Elterneigenschaft", description="Parent status reference.", json_schema_extra={"prefix": "social_insurance_parent_status_"})
|
|
96
|
+
health_insurance: Optional[PayrollIdText] = Field(default=None, alias="Krankenversicherung", description="Health insurance reference.", json_schema_extra={"prefix": "social_insurance_health_insurance_"})
|
|
97
|
+
pension_insurance: Optional[PayrollIdText] = Field(default=None, alias="Rentenversicherung", description="Pension insurance reference.", json_schema_extra={"prefix": "social_insurance_pension_insurance_"})
|
|
98
|
+
member_number_pension_fund: Optional[str] = Field(default=None, alias="MitgliedsnummerVersorgungswerk", description="Pension fund member number.", example="12345", json_schema_extra={"prefix": "social_insurance_"})
|
|
99
|
+
employee_pension_share: Optional[float] = Field(default=None, alias="ArbeitnehmeranteilRentenversicherung", description="Employee pension share.", example=9.3, json_schema_extra={"prefix": "social_insurance_"})
|
|
100
|
+
employer_pension_share: Optional[float] = Field(default=None, alias="ArbeitgeberanteilRentenversicherung", description="Employer pension share.", example=9.3, json_schema_extra={"prefix": "social_insurance_"})
|
|
101
|
+
|
|
102
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class PayrollLevy(BaseModel):
|
|
106
|
+
levy_mode: Optional[str] = Field(default=None, alias="AbfuehrungUmlage", description="Levy mode.", example="Standard", json_schema_extra={"prefix": "levy_"})
|
|
107
|
+
levy_fund: Optional[PayrollHealthFund] = Field(default=None, alias="UmlageKasse", description="Levy fund reference.", json_schema_extra={"prefix": "levy_fund_"})
|
|
108
|
+
insolvency_levy: Optional[bool] = Field(default=None, alias="AbfuehrungInsolvenzgeldumlage", description="Insolvency levy flag.", example=True, json_schema_extra={"prefix": "levy_"})
|
|
109
|
+
insolvency_fund: Optional[PayrollHealthFund] = Field(default=None, alias="InsolvenzgeldumlageKasse", description="Insolvency fund reference.", json_schema_extra={"prefix": "levy_insolvency_fund_"})
|
|
110
|
+
|
|
111
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class PayrollMasterDataCreate(BaseModel):
|
|
115
|
+
key: PayrollKey = Field(alias="Key", description="Payroll key.", json_schema_extra={"prefix": "key_"})
|
|
116
|
+
tax_data: Optional[PayrollTaxData] = Field(default=None, alias="Steuerdaten", description="Tax data block.", json_schema_extra={"prefix": "tax_data_"})
|
|
117
|
+
activity: Optional[PayrollActivity] = Field(default=None, alias="Taetigkeit", description="Activity block.", json_schema_extra={"prefix": "activity_"})
|
|
118
|
+
social_insurance: Optional[PayrollSocialInsurance] = Field(default=None, alias="Sozialversicherung", description="Social insurance block.", json_schema_extra={"prefix": "social_insurance_"})
|
|
119
|
+
levy: Optional[PayrollLevy] = Field(default=None, alias="Umlage", description="Levy block.", json_schema_extra={"prefix": "levy_"})
|
|
120
|
+
|
|
121
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class PayrollMasterDataGet(BrynQPanderaDataFrameModel):
|
|
125
|
+
"""
|
|
126
|
+
Pandera schema for payroll master data (Grunddaten) records.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
# Base identifiers
|
|
130
|
+
key_date: Series[pd.StringDtype] = pa.Field(alias="Key__Date", coerce=True, nullable=False, description="Snapshot date.")
|
|
131
|
+
company_id: Series[pd.Int64Dtype] = pa.Field(alias="Key__MdNr", coerce=True, nullable=False, description="Company id.")
|
|
132
|
+
employee_number: Series[pd.Int64Dtype] = pa.Field(alias="Key__AnNr", coerce=True, nullable=False, description="Employee number.")
|
|
133
|
+
combined_key: Series[pd.StringDtype] = pa.Field(alias="Key__CombinedKey", coerce=True, nullable=False, description="Combined key.")
|
|
134
|
+
key_is_empty: Optional[Series[bool]] = pa.Field(alias="Key__IsEmpty", coerce=True, nullable=True, description="Key empty flag.")
|
|
135
|
+
|
|
136
|
+
# Tax data
|
|
137
|
+
tax_by_class: Optional[Series[bool]] = pa.Field(alias="Steuerdaten__BesteuerungNachSteuerklasse", coerce=True, nullable=True, description="Tax based on class flag.")
|
|
138
|
+
last_registration: Optional[Series[pd.StringDtype]] = pa.Field(alias="Steuerdaten__LetzteAnmeldung", coerce=True, nullable=True, description="Last registration date.")
|
|
139
|
+
elstam_status_id: Optional[Series[pd.StringDtype]] = pa.Field(alias="Steuerdaten__ElstamStatusId", coerce=True, nullable=True, description="ELStAM status id.")
|
|
140
|
+
elstam_status_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Steuerdaten__ElstamStatusText", coerce=True, nullable=True, description="ELStAM status text.")
|
|
141
|
+
employment_type_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Steuerdaten__Beschaeftigungsart__Id", coerce=True, nullable=True, description="Employment type id.")
|
|
142
|
+
employment_type_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Steuerdaten__Beschaeftigungsart__Text", coerce=True, nullable=True, description="Employment type text.")
|
|
143
|
+
tax_class: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Steuerdaten__Steuerklasse", coerce=True, nullable=True, description="Tax class.")
|
|
144
|
+
church_tax_flat: Optional[Series[bool]] = pa.Field(alias="Steuerdaten__PauschaleKirchensteuer", coerce=True, nullable=True, description="Flat church tax flag.")
|
|
145
|
+
church_tax_cap: Optional[Series[bool]] = pa.Field(alias="Steuerdaten__KirchensteuerKappung", coerce=True, nullable=True, description="Church tax cap flag.")
|
|
146
|
+
tax_factor: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuerdaten__Faktor", coerce=True, nullable=True, description="Tax factor.")
|
|
147
|
+
child_allowance: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuerdaten__Kinderfreibetrag", coerce=True, nullable=True, description="Child allowance.")
|
|
148
|
+
religion_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Steuerdaten__Konfession__Id", coerce=True, nullable=True, description="Religion id.")
|
|
149
|
+
religion_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Steuerdaten__Konfession__Text", coerce=True, nullable=True, description="Religion text.")
|
|
150
|
+
spouse_religion_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Steuerdaten__KonfessionEhegatte__Id", coerce=True, nullable=True, description="Spouse religion id.")
|
|
151
|
+
spouse_religion_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Steuerdaten__KonfessionEhegatte__Text", coerce=True, nullable=True, description="Spouse religion text.")
|
|
152
|
+
allowance_year: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuerdaten__FreibetragJahr", coerce=True, nullable=True, description="Allowance per year.")
|
|
153
|
+
allowance_month: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuerdaten__FreibetragMonat", coerce=True, nullable=True, description="Allowance per month.")
|
|
154
|
+
addback_year: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuerdaten__HinzurechungsbetragJahr", coerce=True, nullable=True, description="Add-back amount year.")
|
|
155
|
+
addback_month: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuerdaten__HinzurechungsbetragMonat", coerce=True, nullable=True, description="Add-back amount month.")
|
|
156
|
+
income_tax_equalization: Optional[Series[bool]] = pa.Field(alias="Steuerdaten__Lohnsteuerjahresausgleich", coerce=True, nullable=True, description="Income tax equalization flag.")
|
|
157
|
+
clawback_tax: Optional[Series[bool]] = pa.Field(alias="Steuerdaten__Nachversteuerung", coerce=True, nullable=True, description="Clawback tax flag.")
|
|
158
|
+
energy_bonus_claim: Optional[Series[bool]] = pa.Field(alias="Steuerdaten__AnspruchAufEnergiepreispauschale", coerce=True, nullable=True, description="Energy bonus eligibility.")
|
|
159
|
+
chamber_fee: Optional[Series[bool]] = pa.Field(alias="Steuerdaten__KammerbeitragBerechnen", coerce=True, nullable=True, description="Chamber fee flag.")
|
|
160
|
+
company_state_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Steuerdaten__BundeslandBetrieb__Id", coerce=True, nullable=True, description="Company federal state id.")
|
|
161
|
+
company_state_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Steuerdaten__BundeslandBetrieb__Text", coerce=True, nullable=True, description="Company federal state text.")
|
|
162
|
+
|
|
163
|
+
# Activity data
|
|
164
|
+
employee_group_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Taetigkeit__Personengruppenschluessel__Id", coerce=True, nullable=True, description="Employee group id.")
|
|
165
|
+
employee_group_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Personengruppenschluessel__Text", coerce=True, nullable=True, description="Employee group text.")
|
|
166
|
+
multi_employed: Optional[Series[bool]] = pa.Field(alias="Taetigkeit__Mehrfachbeschaeftigt", coerce=True, nullable=True, description="Multiple employment flag.")
|
|
167
|
+
status_flag_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Taetigkeit__Statuskennzeichen__Id", coerce=True, nullable=True, description="Status flag id.")
|
|
168
|
+
status_flag_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Statuskennzeichen__Text", coerce=True, nullable=True, description="Status flag text.")
|
|
169
|
+
education_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Taetigkeit__Ausbildung__Id", coerce=True, nullable=True, description="Education id.")
|
|
170
|
+
education_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Ausbildung__Text", coerce=True, nullable=True, description="Education text.")
|
|
171
|
+
contract_form_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Taetigkeit__Vertragsform__Id", coerce=True, nullable=True, description="Contract form id.")
|
|
172
|
+
contract_form_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Vertragsform__Text", coerce=True, nullable=True, description="Contract form text.")
|
|
173
|
+
occupation_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Taetigkeit__Beschaeftigung__Id", coerce=True, nullable=True, description="Occupation id.")
|
|
174
|
+
occupation_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Beschaeftigung__Text", coerce=True, nullable=True, description="Occupation text.")
|
|
175
|
+
leasing_indicator: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Taetigkeit__Leiharbeit", coerce=True, nullable=True, description="Leasing indicator.")
|
|
176
|
+
special_case_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Taetigkeit__Besonderheit__Id", coerce=True, nullable=True, description="Special case id.")
|
|
177
|
+
special_case_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Besonderheit__Text", coerce=True, nullable=True, description="Special case text.")
|
|
178
|
+
occupation_key: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Taetigkeitsschluessel", coerce=True, nullable=True, description="Occupation key.")
|
|
179
|
+
occupation_key_2010: Optional[Series[pd.StringDtype]] = pa.Field(alias="Taetigkeit__Taetigkeitsschluessel2010", coerce=True, nullable=True, description="Occupation key 2010.")
|
|
180
|
+
|
|
181
|
+
# Social insurance
|
|
182
|
+
social_insurance_key: Optional[Series[pd.StringDtype]] = pa.Field(alias="Sozialversicherung__SVSchluessel", coerce=True, nullable=True, description="Social insurance key.")
|
|
183
|
+
health_fund_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Sozialversicherung__Krankenkasse__Id", coerce=True, nullable=True, description="Health fund id.")
|
|
184
|
+
health_fund_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Sozialversicherung__Krankenkasse__Name", coerce=True, nullable=True, description="Health fund name.")
|
|
185
|
+
health_fund_type: Optional[Series[pd.StringDtype]] = pa.Field(alias="Sozialversicherung__Krankenkasse__Kassenart", coerce=True, nullable=True, description="Health fund type.")
|
|
186
|
+
mini_job_health_fund_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Sozialversicherung__KrankenkasseMinijobber__Id", coerce=True, nullable=True, description="Mini-job health fund id.")
|
|
187
|
+
mini_job_health_fund_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Sozialversicherung__KrankenkasseMinijobber__Name", coerce=True, nullable=True, description="Mini-job health fund name.")
|
|
188
|
+
mini_job_insurance_type: Optional[Series[pd.StringDtype]] = pa.Field(alias="Sozialversicherung__ArtDerVersicherungMinijobber", coerce=True, nullable=True, description="Mini-job insurance type.")
|
|
189
|
+
insurance_scheme: Optional[Series[pd.StringDtype]] = pa.Field(alias="Sozialversicherung__Krankenversicherung", coerce=True, nullable=True, description="Health insurance scheme.")
|
|
190
|
+
pension_insurance: Optional[Series[pd.StringDtype]] = pa.Field(alias="Sozialversicherung__Rentenversicherung", coerce=True, nullable=True, description="Pension insurance info.")
|
|
191
|
+
employee_health_share: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__ArbeitnehmeranteilKrankenversicherung", coerce=True, nullable=True, description="Employee health contribution.")
|
|
192
|
+
employer_health_share: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__ArbeitgeberanteilKrankenversicherung", coerce=True, nullable=True, description="Employer health contribution.")
|
|
193
|
+
employee_pension_share: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__ArbeitnehmeranteilRentenversicherung", coerce=True, nullable=True, description="Employee pension contribution.")
|
|
194
|
+
employer_pension_share: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__ArbeitgeberanteilRentenversicherung", coerce=True, nullable=True, description="Employer pension contribution.")
|
|
195
|
+
children_count_pv_discount: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Sozialversicherung__AnzahlKinderPVAbschlag", coerce=True, nullable=True, description="Children count for nursing care discount.")
|
|
196
|
+
|
|
197
|
+
# Levy data
|
|
198
|
+
levy_mode: Optional[Series[pd.StringDtype]] = pa.Field(alias="Umlage__AbfuehrungUmlage", coerce=True, nullable=True, description="Levy deduction mode.")
|
|
199
|
+
levy_fund_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Umlage__UmlageKasse__Id", coerce=True, nullable=True, description="Levy fund id.")
|
|
200
|
+
levy_fund_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Umlage__UmlageKasse__Name", coerce=True, nullable=True, description="Levy fund name.")
|
|
201
|
+
insolvency_levy: Optional[Series[bool]] = pa.Field(alias="Umlage__AbfuehrungInsolvenzgeldumlage", coerce=True, nullable=True, description="Insolvency levy flag.")
|
|
202
|
+
insolvency_fund_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Umlage__InsolvenzgeldumlageKasse__Id", coerce=True, nullable=True, description="Insolvency fund id.")
|
|
203
|
+
insolvency_fund_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Umlage__InsolvenzgeldumlageKasse__Name", coerce=True, nullable=True, description="Insolvency fund name.")
|
|
204
|
+
|
|
205
|
+
# Pension data
|
|
206
|
+
pension_type_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Rente__Rentenart__Id", coerce=True, nullable=True, description="Pension type id.")
|
|
207
|
+
pension_type_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Rente__Rentenart__Text", coerce=True, nullable=True, description="Pension type text.")
|
|
208
|
+
waive_pension_exemption: Optional[Series[bool]] = pa.Field(alias="Rente__VerzichtRVFreiheit", coerce=True, nullable=True, description="Waiver of pension exemption flag.")
|
|
209
|
+
waiver_submitted_at: Optional[Series[pd.StringDtype]] = pa.Field(alias="Rente__RVFreiheitVerzichtserklAm", coerce=True, nullable=True, description="Waiver submission date.")
|
|
210
|
+
waiver_valid_from: Optional[Series[pd.StringDtype]] = pa.Field(alias="Rente__RVFreiheitVerzichtserklGueltigAb", coerce=True, nullable=True, description="Waiver valid from date.")
|
|
211
|
+
|
|
212
|
+
class _Annotation:
|
|
213
|
+
primary_key = "combined_key"
|
|
214
|
+
|
|
215
|
+
class Config:
|
|
216
|
+
coerce = True
|
|
217
|
+
strict = "filter"
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class PayrollGet(BrynQPanderaDataFrameModel):
|
|
221
|
+
"""
|
|
222
|
+
Pandera schema for payroll (abrechnungsdaten) run results.
|
|
223
|
+
"""
|
|
224
|
+
|
|
225
|
+
company_id: Series[pd.Int64Dtype] = pa.Field(alias="company_id", coerce=True, nullable=False, description="Company id.")
|
|
226
|
+
employee_number: Series[pd.Int64Dtype] = pa.Field(alias="employee_number", coerce=True, nullable=False, description="Employee number.")
|
|
227
|
+
combined_key: Series[pd.StringDtype] = pa.Field(alias="combined_key", coerce=True, nullable=False, description="Composite key (company/employee/date).")
|
|
228
|
+
source_date: Series[pd.StringDtype] = pa.Field(alias="source_date", coerce=True, nullable=False, description="Payroll reference date.")
|
|
229
|
+
|
|
230
|
+
gross_amount: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Brutto", coerce=True, nullable=True, description="Gross pay.")
|
|
231
|
+
statutory_deductions: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="GesetzlicheAbzuege", coerce=True, nullable=True, description="Statutory deductions.")
|
|
232
|
+
net_amount: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Netto", coerce=True, nullable=True, description="Net pay.")
|
|
233
|
+
additional_allowances: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="ZusaetzlicheBeAbzuege", coerce=True, nullable=True, description="Additional allowances/deductions.")
|
|
234
|
+
non_cash_benefits: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sachbezug", coerce=True, nullable=True, description="Non-cash benefits.")
|
|
235
|
+
payout_amount: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Auszahlung", coerce=True, nullable=True, description="Final payout.")
|
|
236
|
+
|
|
237
|
+
tax_days: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Steuer__Tage", coerce=True, nullable=True, description="Tax-relevant days.")
|
|
238
|
+
tax_running_gross: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__LaufenderBezug__Brutto", coerce=True, nullable=True, description="Running payroll gross.")
|
|
239
|
+
tax_running_income_tax: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__LaufenderBezug__Lohnsteuer", coerce=True, nullable=True, description="Income tax for running payroll.")
|
|
240
|
+
tax_running_solidarity: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__LaufenderBezug__Solizuschlag", coerce=True, nullable=True, description="Solidarity surcharge for running payroll.")
|
|
241
|
+
tax_running_church: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__LaufenderBezug__Kirchensteuer", coerce=True, nullable=True, description="Church tax for running payroll.")
|
|
242
|
+
|
|
243
|
+
tax_misc_gross: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__SonstigerBezug__Brutto", coerce=True, nullable=True, description="Miscellaneous gross pay.")
|
|
244
|
+
tax_misc_income_tax: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__SonstigerBezug__Lohnsteuer", coerce=True, nullable=True, description="Misc income tax.")
|
|
245
|
+
tax_misc_solidarity: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__SonstigerBezug__Solizuschlag", coerce=True, nullable=True, description="Misc solidarity surcharge.")
|
|
246
|
+
tax_misc_church: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__SonstigerBezug__Kirchensteuer", coerce=True, nullable=True, description="Misc church tax.")
|
|
247
|
+
|
|
248
|
+
tax_flat_employee_income_tax: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__Pauschalsteuer__Arbeitnehmer__Lohnsteuer", coerce=True, nullable=True, description="Flat employee income tax.")
|
|
249
|
+
tax_flat_employee_solidarity: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__Pauschalsteuer__Arbeitnehmer__Solizuschlag", coerce=True, nullable=True, description="Flat employee solidarity surcharge.")
|
|
250
|
+
tax_flat_employee_church: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__Pauschalsteuer__Arbeitnehmer__Kirchensteuer", coerce=True, nullable=True, description="Flat employee church tax.")
|
|
251
|
+
tax_flat_employer_income_tax: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__Pauschalsteuer__Arbeitgeber__Lohnsteuer", coerce=True, nullable=True, description="Flat employer income tax.")
|
|
252
|
+
tax_flat_employer_solidarity: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__Pauschalsteuer__Arbeitgeber__Solizuschlag", coerce=True, nullable=True, description="Flat employer solidarity surcharge.")
|
|
253
|
+
tax_flat_employer_church: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Steuer__Pauschalsteuer__Arbeitgeber__Kirchensteuer", coerce=True, nullable=True, description="Flat employer church tax.")
|
|
254
|
+
|
|
255
|
+
social_days: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Sozialversicherung__Tage", coerce=True, nullable=True, description="Social insurance days.")
|
|
256
|
+
social_running_gross: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Brutto", coerce=True, nullable=True, description="Running social insurance gross.")
|
|
257
|
+
|
|
258
|
+
health_gross: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Krankenversicherung__Brutto", coerce=True, nullable=True, description="Health insurance gross.")
|
|
259
|
+
health_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Krankenversicherung__Arbeitnehmer", coerce=True, nullable=True, description="Employee health contribution.")
|
|
260
|
+
health_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Krankenversicherung__Arbeitgeber", coerce=True, nullable=True, description="Employer health contribution.")
|
|
261
|
+
|
|
262
|
+
pension_gross: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Rentenversicherung__Brutto", coerce=True, nullable=True, description="Pension insurance gross.")
|
|
263
|
+
pension_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Rentenversicherung__Arbeitnehmer", coerce=True, nullable=True, description="Employee pension contribution.")
|
|
264
|
+
pension_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Rentenversicherung__Arbeitgeber", coerce=True, nullable=True, description="Employer pension contribution.")
|
|
265
|
+
|
|
266
|
+
unemployment_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Arbeitslosenversicherung__Arbeitnehmer", coerce=True, nullable=True, description="Employee unemployment insurance.")
|
|
267
|
+
unemployment_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Arbeitslosenversicherung__Arbeitgeber", coerce=True, nullable=True, description="Employer unemployment insurance.")
|
|
268
|
+
|
|
269
|
+
care_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Pflegeversicherung__Arbeitnehmer", coerce=True, nullable=True, description="Employee care insurance.")
|
|
270
|
+
care_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__LaufenderBezug__Pflegeversicherung__Arbeitgeber", coerce=True, nullable=True, description="Employer care insurance.")
|
|
271
|
+
|
|
272
|
+
lump_sum_gross: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Brutto", coerce=True, nullable=True, description="One-time bonus gross.")
|
|
273
|
+
lump_sum_health_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Krankenversicherung__Arbeitnehmer", coerce=True, nullable=True, description="One-time health employee share.")
|
|
274
|
+
lump_sum_health_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Krankenversicherung__Arbeitgeber", coerce=True, nullable=True, description="One-time health employer share.")
|
|
275
|
+
lump_sum_pension_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Rentenversicherung__Arbeitnehmer", coerce=True, nullable=True, description="One-time pension employee share.")
|
|
276
|
+
lump_sum_pension_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Rentenversicherung__Arbeitgeber", coerce=True, nullable=True, description="One-time pension employer share.")
|
|
277
|
+
lump_sum_unemployment_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Arbeitslosenversicherung__Arbeitnehmer", coerce=True, nullable=True, description="One-time unemployment employee share.")
|
|
278
|
+
lump_sum_unemployment_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Arbeitslosenversicherung__Arbeitgeber", coerce=True, nullable=True, description="One-time unemployment employer share.")
|
|
279
|
+
lump_sum_care_employee: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Pflegeversicherung__Arbeitnehmer", coerce=True, nullable=True, description="One-time care employee share.")
|
|
280
|
+
lump_sum_care_employer: Optional[Series[pd.Float64Dtype]] = pa.Field(alias="Sozialversicherung__EimaligeZuwendung__Pflegeversicherung__Arbeitgeber", coerce=True, nullable=True, description="One-time care employer share.")
|
|
281
|
+
|
|
282
|
+
class _Annotation:
|
|
283
|
+
primary_key = "combined_key"
|
|
284
|
+
|
|
285
|
+
class Config:
|
|
286
|
+
coerce = True
|
|
287
|
+
strict = "filter"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Schemas for Sage Germany payslip metadata payloads.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
import pandera as pa
|
|
9
|
+
from pandera.typing import Series
|
|
10
|
+
|
|
11
|
+
from brynq_sdk_functions import BrynQPanderaDataFrameModel
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class PayslipsGet(BrynQPanderaDataFrameModel):
|
|
15
|
+
"""Pandera schema for payslip (Verdienstbescheinigung) listings."""
|
|
16
|
+
|
|
17
|
+
document_id: Series[pd.Int64Dtype] = pa.Field(alias="ID", coerce=True, nullable=False, description="Document identifier.")
|
|
18
|
+
company_id: Series[pd.Int64Dtype] = pa.Field(alias="MdNr", coerce=True, nullable=False, description="Company id.")
|
|
19
|
+
employee_number: Series[pd.Int64Dtype] = pa.Field(alias="AnNr", coerce=True, nullable=False, description="Employee number.")
|
|
20
|
+
template_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="TemplateID", coerce=True, nullable=True, description="Template identifier.")
|
|
21
|
+
report_period: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="RptPeriode", coerce=True, nullable=True, description="Reported period.")
|
|
22
|
+
correction_period: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="KoPeriode", coerce=True, nullable=True, description="Correction period.")
|
|
23
|
+
document_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Name", coerce=True, nullable=True, description="Document name.")
|
|
24
|
+
released: Optional[Series[bool]] = pa.Field(alias="Released", coerce=True, nullable=True, description="Release flag.")
|
|
25
|
+
created_on: Optional[Series[pd.StringDtype]] = pa.Field(alias="CreatedOn", coerce=True, nullable=True, description="Creation timestamp.")
|
|
26
|
+
sbc_document_id: Optional[Series[pd.StringDtype]] = pa.Field(alias="SbcDocumentId", coerce=True, nullable=True, description="SBC document identifier.")
|
|
27
|
+
to_be_deleted: Optional[Series[bool]] = pa.Field(alias="ToBeDeleted", coerce=True, nullable=True, description="Deletion flag.")
|
|
28
|
+
|
|
29
|
+
class _Annotation:
|
|
30
|
+
primary_key = "document_id"
|
|
31
|
+
|
|
32
|
+
class Config:
|
|
33
|
+
coerce = True
|
|
34
|
+
strict = "filter"
|