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,487 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Schemas for Sage Germany employee payloads.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Optional
|
|
7
|
+
|
|
8
|
+
import pandas as pd
|
|
9
|
+
import pandera as pa
|
|
10
|
+
from pydantic import BaseModel, Field, ConfigDict
|
|
11
|
+
from pandera.typing import Series
|
|
12
|
+
|
|
13
|
+
from brynq_sdk_functions import BrynQPanderaDataFrameModel
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SageIdText(BaseModel):
|
|
17
|
+
"""
|
|
18
|
+
Generic Id/Text container used throughout Sage payloads.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
# Optional fields
|
|
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 SageCountry(BaseModel):
|
|
29
|
+
"""
|
|
30
|
+
Country representation used inside address/identity structures.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
# Optional fields
|
|
34
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Country identifier.", example=276)
|
|
35
|
+
nationality: Optional[str] = Field(default=None, alias="Nationality", description="Nationality label.", example="deutsch")
|
|
36
|
+
name: Optional[str] = Field(default=None, alias="Name", description="Country name.", example="Deutschland")
|
|
37
|
+
iso_code: Optional[str] = Field(default=None, alias="IsoCode", description="ISO code.", example="DE")
|
|
38
|
+
combined_key: Optional[str] = Field(default=None, alias="CombinedKey", description="Combined key string.", example="DE-276")
|
|
39
|
+
is_eu_member: Optional[bool] = Field(default=None, alias="EULand", description="EU membership flag.", example=True)
|
|
40
|
+
|
|
41
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class EmployeeKey(BaseModel):
|
|
45
|
+
"""
|
|
46
|
+
Snapshot key metadata for a single employee object.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
# Required fields
|
|
50
|
+
date: datetime = Field(alias="Date", description="Snapshot date.", example="2025-01-01T00:00:00Z")
|
|
51
|
+
company_id: int = Field(alias="MdNr", description="Company id (Mandant).", example=1)
|
|
52
|
+
employee_number: int = Field(alias="AnNr", description="Employee number.", example=210)
|
|
53
|
+
combined_key: str = Field(alias="CombinedKey", description="Combined key string.", example="1_210")
|
|
54
|
+
is_empty: bool = Field(alias="IsEmpty", description="Marks an empty key payload.", example=False)
|
|
55
|
+
|
|
56
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class EmployeePersonTitle(BaseModel):
|
|
60
|
+
"""
|
|
61
|
+
Title payload for person metadata.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
# Optional fields
|
|
65
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Title identifier.", example=1)
|
|
66
|
+
title: Optional[str] = Field(default=None, alias="Title", description="Title text.", example="Dr.")
|
|
67
|
+
|
|
68
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class EmployeePerson(BaseModel):
|
|
72
|
+
"""
|
|
73
|
+
Person block containing the required identity properties.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
# Required fields
|
|
77
|
+
first_name: str = Field(alias="Vorname", description="Employee first name.", example="Yakup")
|
|
78
|
+
last_name: str = Field(alias="Nachname", description="Employee last name.", example="Keskin")
|
|
79
|
+
birth_date: datetime = Field(alias="Geburtsdatum", description="Birth date in ISO-8601 format.", example="1990-01-15T00:00:00Z")
|
|
80
|
+
|
|
81
|
+
# Optional fields
|
|
82
|
+
title: Optional[EmployeePersonTitle] = Field(default=None, alias="Titel", description="Optional title information.", example={"Title": "Dr."}, json_schema_extra={"prefix": "person_title_"})
|
|
83
|
+
birth_name: Optional[str] = Field(default=None, alias="Geburtsname", description="Birth name if different.", example="Keskinkor")
|
|
84
|
+
gender: Optional[str] = Field(default=None, alias="Geschlecht", description="Gender value accepted by Sage.", example="Male")
|
|
85
|
+
family_status: Optional[SageIdText] = Field(default=None, alias="Familienstand", description="Family status reference.", example={"Id": 1, "Text": "verheiratet"}, json_schema_extra={"prefix": "person_family_status_"})
|
|
86
|
+
prefix_words: Optional[SageIdText] = Field(default=None, alias="Vorsatzworte", description="Name prefix reference.", example={"Text": "von"}, json_schema_extra={"prefix": "person_prefix_words_"})
|
|
87
|
+
suffix_words: Optional[SageIdText] = Field(default=None, alias="Namenszusatz", description="Name suffix reference.", example={"Text": "III"}, json_schema_extra={"prefix": "person_suffix_words_"})
|
|
88
|
+
|
|
89
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class EmployeeAddress(BaseModel):
|
|
93
|
+
"""
|
|
94
|
+
Postal address payload for the employee.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
# Optional fields
|
|
98
|
+
street: Optional[str] = Field(default=None, alias="Strasse", description="Street line 1.", example="Bremer Straße 24")
|
|
99
|
+
address_addition: Optional[str] = Field(default=None, alias="Adresszusatz", description="Additional address line.", example="c/o HQ")
|
|
100
|
+
postal_code: Optional[str] = Field(default=None, alias="Postleitzahl", description="Zip/postal code.", example="44536")
|
|
101
|
+
foreign_postal_code: Optional[str] = Field(default=None, alias="PostleitzahlAusland", description="Foreign postal code.", example="")
|
|
102
|
+
city: Optional[str] = Field(default=None, alias="Ort", description="City of residence.", example="Lünen")
|
|
103
|
+
foreign_city: Optional[str] = Field(default=None, alias="OrtAusland", description="Foreign city value.", example="")
|
|
104
|
+
country: Optional[SageCountry] = Field(
|
|
105
|
+
default=None,
|
|
106
|
+
alias="Land",
|
|
107
|
+
description="Nested country metadata.",
|
|
108
|
+
example={"Name": "Deutschland", "IsoCode": "DE"},
|
|
109
|
+
json_schema_extra={"prefix": "address_country_"},
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class EmployeeContact(BaseModel):
|
|
116
|
+
"""
|
|
117
|
+
Contact details for the employee.
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
# Optional fields
|
|
121
|
+
phone: Optional[str] = Field(default=None, alias="Telefon", description="Personal phone number.", example="+49-30-123456")
|
|
122
|
+
mobile: Optional[str] = Field(default=None, alias="Mobil", description="Personal mobile number.", example="+49-171-555555")
|
|
123
|
+
email: Optional[str] = Field(default=None, alias="EMail", description="Personal email address.", example="user@example.com")
|
|
124
|
+
|
|
125
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class EmployeeBusinessContact(BaseModel):
|
|
129
|
+
"""
|
|
130
|
+
Work contact details (KontaktDienstlich block).
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
# Optional fields
|
|
134
|
+
phone: Optional[str] = Field(default=None, alias="Telefon", description="Business phone number.", example="+49-30-999999")
|
|
135
|
+
mobile: Optional[str] = Field(default=None, alias="Mobil", description="Business mobile number.", example="+49-171-999999")
|
|
136
|
+
email: Optional[str] = Field(default=None, alias="EMail", description="Business email address.", example="user@company.com")
|
|
137
|
+
|
|
138
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class EmployeeIdentity(BaseModel):
|
|
142
|
+
"""
|
|
143
|
+
National identity metadata.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
# Optional fields
|
|
147
|
+
tax_id: Optional[str] = Field(default=None, alias="SteuerID", description="German tax identification number.", example="97196340258")
|
|
148
|
+
insurance_number_known: Optional[bool] = Field(default=None, alias="VersicherungsnummerBekannt", description="Whether the social insurance number is known.", example=True)
|
|
149
|
+
insurance_number: Optional[str] = Field(default=None, alias="Versicherungsnummer", description="Social insurance number.", example="19281058G990")
|
|
150
|
+
insurance_card_present: Optional[bool] = Field(default=None, alias="VersicherungsAusweisLiegtVor", description="Whether an insurance card is present.", example=True)
|
|
151
|
+
nationality: Optional[SageCountry] = Field(default=None, alias="Nationalitaet", description="Nationality reference object.", example={"Name": "Deutschland"}, json_schema_extra={"prefix": "identity_nationality_"})
|
|
152
|
+
birth_country: Optional[SageCountry] = Field(default=None, alias="GeburtsLand", description="Birth country reference.", example={"IsoCode": "DE"}, json_schema_extra={"prefix": "identity_birth_country_"})
|
|
153
|
+
birth_city: Optional[str] = Field(default=None, alias="GeburtsOrt", description="Birth city.", example="Berlin")
|
|
154
|
+
residence_permit_until: Optional[datetime] = Field(default=None, alias="Aufenthaltserlaubnis", description="Residence permit expiration date.", example="2030-12-31T00:00:00Z")
|
|
155
|
+
passport_valid_until: Optional[datetime] = Field(default=None, alias="Passgueltigkeit", description="Passport validity date.", example="2030-12-31T00:00:00Z")
|
|
156
|
+
work_permit_until: Optional[datetime] = Field(default=None, alias="Arbeitserlaubnis", description="Work permit expiration date.", example="2030-12-31T00:00:00Z")
|
|
157
|
+
eu_insurance_number: Optional[str] = Field(default=None, alias="EUVersicherungsnummer", description="EU insurance number.", example="EU-987654321")
|
|
158
|
+
first_employment: Optional[bool] = Field(default=None, alias="ErstmaligeAufnahmeBesch", description="Indicates if this is the first employment.", example=False)
|
|
159
|
+
|
|
160
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class BankAccountReference(BaseModel):
|
|
164
|
+
"""
|
|
165
|
+
Reference to an existing company bank account.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
# Optional fields
|
|
169
|
+
id: Optional[int] = Field(default=None, alias="Id", description="Bank account identifier.", example=201)
|
|
170
|
+
company_id: Optional[int] = Field(default=None, alias="MdNr", description="Company identifier for the bank account.", example=1)
|
|
171
|
+
account_number: Optional[str] = Field(default=None, alias="AccountNr", description="Bank account number.", example="1234567890")
|
|
172
|
+
bank_code: Optional[int] = Field(default=None, alias="BankCode", description="Bank code (BLZ).", example=44070050)
|
|
173
|
+
bank_name: Optional[str] = Field(default=None, alias="BankName", description="Name of the bank.", example="Deutsche Bank")
|
|
174
|
+
|
|
175
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
class EmployeeBankDetails(BaseModel):
|
|
179
|
+
"""
|
|
180
|
+
Bank information used for payouts.
|
|
181
|
+
"""
|
|
182
|
+
|
|
183
|
+
# Optional fields
|
|
184
|
+
key_type: Optional[SageIdText] = Field(default=None, alias="Schluesselart", description="Bank key type reference.", example={"Id": 0, "Text": "Standardüberweisung"}, json_schema_extra={"prefix": "bank_key_type_"})
|
|
185
|
+
purpose: Optional[str] = Field(default=None, alias="Verwendungszweck", description="Transaction purpose text.", example="Lohn- und Gehalt")
|
|
186
|
+
iban: Optional[str] = Field(default=None, alias="IBAN", description="IBAN number.", example="DE89440700500897858865")
|
|
187
|
+
bic: Optional[str] = Field(default=None, alias="BIC", description="BIC/SWIFT code.", example="DEUTDEDE440")
|
|
188
|
+
bank_reference: Optional[SageIdText] = Field(default=None, alias="Bank", description="Bank reference object.", example={"Id": 205, "Text": "Deutsche Bank Dortmund"}, json_schema_extra={"prefix": "bank_reference_"})
|
|
189
|
+
account_number: Optional[str] = Field(default=None, alias="Kontonummer", description="Domestic account number.", example="0897858865")
|
|
190
|
+
bank_code: Optional[int] = Field(default=None, alias="Bankleitzahl", description="Bank code (BLZ).", example=44070050)
|
|
191
|
+
recipient: Optional[str] = Field(default=None, alias="Empfaenger", description="Recipient name.", example="Gehalt, Manuela")
|
|
192
|
+
validation_amount: Optional[float] = Field(default=None, alias="PruefBetrag", description="Validation amount used by Sage.", example=0.0)
|
|
193
|
+
settlement_account: Optional[BankAccountReference] = Field(default=None, alias="VerrechnungUeber", description="Settlement account reference.", example={"Id": 201, "MdNr": 1}, json_schema_extra={"prefix": "bank_settlement_"})
|
|
194
|
+
payment_type: Optional[str] = Field(default=None, alias="Zahlungsart", description="Payment method type.", example="Inland")
|
|
195
|
+
|
|
196
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class DisabilityEmployeeKey(BaseModel):
|
|
200
|
+
"""
|
|
201
|
+
Employee key inside disability structure.
|
|
202
|
+
"""
|
|
203
|
+
|
|
204
|
+
# Optional fields
|
|
205
|
+
company_id: Optional[int] = Field(default=None, alias="MdNr", description="Company identifier.", example=1)
|
|
206
|
+
employee_number: Optional[int] = Field(default=None, alias="AnNr", description="Employee number.", example=9999)
|
|
207
|
+
combined_key: Optional[str] = Field(default=None, alias="CombinedKey", description="Composite key for the employee.", example="1-9999")
|
|
208
|
+
|
|
209
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class EmployeeDisabilityData(BaseModel):
|
|
213
|
+
"""
|
|
214
|
+
Schwerbehindertendaten block.
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
# Optional fields
|
|
218
|
+
employee_key: Optional[DisabilityEmployeeKey] = Field(
|
|
219
|
+
default=None,
|
|
220
|
+
alias="EmployeeKey",
|
|
221
|
+
description="Employee key reference for disability record.",
|
|
222
|
+
example={"MdNr": 1, "AnNr": 9999},
|
|
223
|
+
json_schema_extra={"prefix": "disability_employee_key_"},
|
|
224
|
+
)
|
|
225
|
+
identifier: Optional[int] = Field(default=None, alias="Id", description="Disability record identifier.", example=1)
|
|
226
|
+
marker: Optional[SageIdText] = Field(
|
|
227
|
+
default=None,
|
|
228
|
+
alias="Kennzeichnung",
|
|
229
|
+
description="Disability marker classification.",
|
|
230
|
+
example={"Id": 1, "Text": "Schwerbehinderung"},
|
|
231
|
+
json_schema_extra={"prefix": "disability_marker_"},
|
|
232
|
+
)
|
|
233
|
+
degree: Optional[SageIdText] = Field(
|
|
234
|
+
default=None,
|
|
235
|
+
alias="GradDerBehinderung",
|
|
236
|
+
description="Degree of disability (GdB).",
|
|
237
|
+
example={"Id": 50, "Text": "50%"},
|
|
238
|
+
json_schema_extra={"prefix": "disability_degree_"},
|
|
239
|
+
)
|
|
240
|
+
valid_from: Optional[datetime] = Field(default=None, alias="GueltigAb", description="Start date of disability recognition.", example="2020-01-01T00:00:00Z")
|
|
241
|
+
valid_to: Optional[datetime] = Field(default=None, alias="GueltigBis", description="End date of disability recognition.", example="2025-12-31T00:00:00Z")
|
|
242
|
+
unlimited: Optional[bool] = Field(default=None, alias="Unbefristet", description="Indicates if disability recognition is unlimited.", example=False)
|
|
243
|
+
special_leave: Optional[int] = Field(default=None, alias="AbweichenderSonderurlaub", description="Special leave days granted for disability.", example=5)
|
|
244
|
+
responsible_office: Optional[SageIdText] = Field(
|
|
245
|
+
default=None,
|
|
246
|
+
alias="ZustaendigesAmt",
|
|
247
|
+
description="Responsible authority office for disability matters.",
|
|
248
|
+
example={"Id": 1, "Text": "Versorgungsamt Berlin"},
|
|
249
|
+
json_schema_extra={"prefix": "disability_responsible_office_"},
|
|
250
|
+
)
|
|
251
|
+
location: Optional[str] = Field(default=None, alias="Standort", description="Location reference for disability record.", example="Berlin")
|
|
252
|
+
file_reference: Optional[str] = Field(default=None, alias="Aktenzeichen", description="File reference number for disability case.", example="AZ-2020-12345")
|
|
253
|
+
obligation_positions: Optional[float] = Field(default=None, alias="Pflichtplaetze", description="Obligation positions count.", example=1.0)
|
|
254
|
+
disability_start: Optional[datetime] = Field(default=None, alias="BeginnBehinderung", description="Start date of the disability condition.", example="2019-06-15T00:00:00Z")
|
|
255
|
+
|
|
256
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
class EmployeeCreateForm(BaseModel):
|
|
260
|
+
"""
|
|
261
|
+
Minimal payload for EmployeeNew Neuanlage endpoint.
|
|
262
|
+
"""
|
|
263
|
+
|
|
264
|
+
# Required fields
|
|
265
|
+
company_id: int = Field(
|
|
266
|
+
alias="Key.MdNr",
|
|
267
|
+
description="Company (Mandant) identifier.",
|
|
268
|
+
example=1,
|
|
269
|
+
)
|
|
270
|
+
employee_number: int = Field(
|
|
271
|
+
alias="Key.AnNr",
|
|
272
|
+
description="Employee number (AnNr) to assign.",
|
|
273
|
+
example=210,
|
|
274
|
+
)
|
|
275
|
+
first_name: str = Field(
|
|
276
|
+
alias="Vorname",
|
|
277
|
+
description="Employee first name.",
|
|
278
|
+
example="Sinan",
|
|
279
|
+
)
|
|
280
|
+
last_name: str = Field(
|
|
281
|
+
alias="Nachname",
|
|
282
|
+
description="Employee last name.",
|
|
283
|
+
example="Resicowicz",
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
# Optional fields
|
|
287
|
+
combined_key: Optional[str] = Field(
|
|
288
|
+
default=None,
|
|
289
|
+
alias="Key.CombinedKey",
|
|
290
|
+
description="Optional combined key string for the employee.",
|
|
291
|
+
example="1_210",
|
|
292
|
+
)
|
|
293
|
+
birth_date: Optional[datetime] = Field(
|
|
294
|
+
default=None,
|
|
295
|
+
alias="Geburtsdatum",
|
|
296
|
+
description="Birth date in ISO-8601 format.",
|
|
297
|
+
example="1974-01-02T00:00:00",
|
|
298
|
+
)
|
|
299
|
+
entry_date: Optional[datetime] = Field(
|
|
300
|
+
default=None,
|
|
301
|
+
alias="Eintritt",
|
|
302
|
+
description="Employment start date in ISO-8601 format.",
|
|
303
|
+
example="2025-01-02T00:00:00",
|
|
304
|
+
)
|
|
305
|
+
gender: Optional[str] = Field(
|
|
306
|
+
default=None,
|
|
307
|
+
alias="Geschlecht",
|
|
308
|
+
description="Gender value expected by Sage (e.g., Male, Female).",
|
|
309
|
+
example="Male",
|
|
310
|
+
)
|
|
311
|
+
template_id: Optional[int] = Field(
|
|
312
|
+
default=None,
|
|
313
|
+
alias="TemplateId",
|
|
314
|
+
description="Optional template identifier used by Sage.",
|
|
315
|
+
example=5,
|
|
316
|
+
)
|
|
317
|
+
|
|
318
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
319
|
+
|
|
320
|
+
class EmployeeUpdateRequest(BaseModel):
|
|
321
|
+
"""
|
|
322
|
+
Pydantic schema describing the POST payload for employee updates.
|
|
323
|
+
"""
|
|
324
|
+
|
|
325
|
+
# Required fields
|
|
326
|
+
person: EmployeePerson = Field(
|
|
327
|
+
alias="Person",
|
|
328
|
+
description="Person block containing identification details.",
|
|
329
|
+
example={"Vorname": "Max", "Nachname": "Mustermann"},
|
|
330
|
+
json_schema_extra={"prefix": "person_"},
|
|
331
|
+
)
|
|
332
|
+
key: EmployeeKey = Field(
|
|
333
|
+
alias="Key",
|
|
334
|
+
description="Snapshot key metadata identifying the employee record.",
|
|
335
|
+
example={"MdNr": 1, "AnNr": 1001},
|
|
336
|
+
json_schema_extra={"prefix": "key_"},
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
# Optional fields
|
|
340
|
+
|
|
341
|
+
address: Optional[EmployeeAddress] = Field(
|
|
342
|
+
default=None,
|
|
343
|
+
alias="Adresse",
|
|
344
|
+
description="Employee address information.",
|
|
345
|
+
example={"Strasse": "Sample Street 1"},
|
|
346
|
+
json_schema_extra={"prefix": "address_"},
|
|
347
|
+
)
|
|
348
|
+
contact: Optional[EmployeeContact] = Field(
|
|
349
|
+
default=None,
|
|
350
|
+
alias="Kontakt",
|
|
351
|
+
description="Personal contact details.",
|
|
352
|
+
example={"EMail": "user@example.com"},
|
|
353
|
+
json_schema_extra={"prefix": "contact_"},
|
|
354
|
+
)
|
|
355
|
+
business_contact: Optional[EmployeeBusinessContact] = Field(
|
|
356
|
+
default=None,
|
|
357
|
+
alias="KontaktDienstlich",
|
|
358
|
+
description="Business contact details.",
|
|
359
|
+
example={"EMail": "user@company.com"},
|
|
360
|
+
json_schema_extra={"prefix": "contact_business_"},
|
|
361
|
+
)
|
|
362
|
+
identity: Optional[EmployeeIdentity] = Field(
|
|
363
|
+
default=None,
|
|
364
|
+
alias="Identitaet",
|
|
365
|
+
description="Identity information such as tax and insurance data.",
|
|
366
|
+
json_schema_extra={"prefix": "identity_"},
|
|
367
|
+
)
|
|
368
|
+
bank_details: Optional[EmployeeBankDetails] = Field(
|
|
369
|
+
default=None,
|
|
370
|
+
alias="Bankverbindung",
|
|
371
|
+
description="Bank payout configuration.",
|
|
372
|
+
json_schema_extra={"prefix": "bank_"},
|
|
373
|
+
)
|
|
374
|
+
disability_data: Optional[EmployeeDisabilityData] = Field(
|
|
375
|
+
default=None,
|
|
376
|
+
alias="Schwerbehindertendaten",
|
|
377
|
+
description="Disability data block.",
|
|
378
|
+
json_schema_extra={"prefix": "disability_"},
|
|
379
|
+
)
|
|
380
|
+
is_sage_hr_integration: Optional[bool] = Field(
|
|
381
|
+
default=None,
|
|
382
|
+
alias="IsSageHrIntegration",
|
|
383
|
+
description="Indicates if the record originates from Sage HR integration.",
|
|
384
|
+
example=False,
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
model_config = ConfigDict(populate_by_name=True)
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
class EmployeesGet(BrynQPanderaDataFrameModel):
|
|
391
|
+
"""
|
|
392
|
+
Pandera schema for flattened employee records coming from Sage Germany.
|
|
393
|
+
"""
|
|
394
|
+
|
|
395
|
+
is_sage_hr_integration: Series[bool] = pa.Field(alias="IsSageHrIntegration", coerce=True, nullable=True, description="Indicates whether record was created via Sage HR integration.")
|
|
396
|
+
record_timestamp: Series[pd.StringDtype] = pa.Field(alias="Key__Date", coerce=True, nullable=False, description="Snapshot timestamp as string.")
|
|
397
|
+
company_id: Series[pd.Int64Dtype] = pa.Field(alias="Key__MdNr", coerce=True, nullable=False, description="Company (Mandant) id.")
|
|
398
|
+
employee_number: Series[pd.Int64Dtype] = pa.Field(alias="Key__AnNr", coerce=True, nullable=False, description="Employee number.")
|
|
399
|
+
employee_reference_key: Series[pd.StringDtype] = pa.Field(alias="Key__CombinedKey", coerce=True, nullable=False, description="Combined identifier for the snapshot.")
|
|
400
|
+
key_is_empty: Optional[Series[bool]] = pa.Field(alias="Key__IsEmpty", coerce=True, nullable=True, description="Indicates whether the key payload is empty.")
|
|
401
|
+
|
|
402
|
+
person_title: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Titel", coerce=True, nullable=True, description="Title object payload.")
|
|
403
|
+
person_title_id: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Titel__Id", coerce=True, nullable=True, description="Title identifier.")
|
|
404
|
+
person_title_title: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Titel__Title", coerce=True, nullable=True, description="Title text field.")
|
|
405
|
+
first_name: Series[pd.StringDtype] = pa.Field(alias="Person__Vorname", coerce=True, nullable=False, description="First name.")
|
|
406
|
+
last_name: Series[pd.StringDtype] = pa.Field(alias="Person__Nachname", coerce=True, nullable=False, description="Last name.")
|
|
407
|
+
birth_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Geburtsname", coerce=True, nullable=True, description="Birth name.")
|
|
408
|
+
gender: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Geschlecht", coerce=True, nullable=True, description="Gender.")
|
|
409
|
+
birth_date: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Geburtsdatum", coerce=True, nullable=True, description="Birth date.")
|
|
410
|
+
family_status_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Person__Familienstand__Id", coerce=True, nullable=True, description="Family status identifier.")
|
|
411
|
+
family_status_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Familienstand__Text", coerce=True, nullable=True, description="Family status text.")
|
|
412
|
+
family_status_id_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Familienstand__IdMitText", coerce=True, nullable=True, description="Family status id-text.")
|
|
413
|
+
name_special: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Namensbesonderheiten", coerce=True, nullable=True, description="Special name notes.")
|
|
414
|
+
prefix: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Vorsatzworte", coerce=True, nullable=True, description="Prefix words.")
|
|
415
|
+
suffix: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__Namenszusatz", coerce=True, nullable=True, description="Suffix words.")
|
|
416
|
+
birth_prefix: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__GebVorsatzworte", coerce=True, nullable=True, description="Birth prefix words.")
|
|
417
|
+
birth_suffix: Optional[Series[pd.StringDtype]] = pa.Field(alias="Person__GebNamenszusatz", coerce=True, nullable=True, description="Birth suffix words.")
|
|
418
|
+
|
|
419
|
+
street: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Strasse", coerce=True, nullable=True, description="Street address.")
|
|
420
|
+
street_addition: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Adresszusatz", coerce=True, nullable=True, description="Address addition.")
|
|
421
|
+
postal_code: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Postleitzahl", coerce=True, nullable=True, description="Postal code.")
|
|
422
|
+
postal_code_foreign: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__PostleitzahlAusland", coerce=True, nullable=True, description="Foreign postal code.")
|
|
423
|
+
city: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Ort", coerce=True, nullable=True, description="City.")
|
|
424
|
+
city_foreign: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__OrtAusland", coerce=True, nullable=True, description="Foreign city.")
|
|
425
|
+
country_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Adresse__Land__Id", coerce=True, nullable=True, description="Country identifier.")
|
|
426
|
+
country_nationality: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Land__Nationality", coerce=True, nullable=True, description="Country nationality label.")
|
|
427
|
+
country_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Land__Name", coerce=True, nullable=True, description="Country name.")
|
|
428
|
+
country_iso: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Land__IsoCode", coerce=True, nullable=True, description="Country ISO code.")
|
|
429
|
+
country_combined_key: Optional[Series[pd.StringDtype]] = pa.Field(alias="Adresse__Land__CombinedKey", coerce=True, nullable=True, description="Country combined key.")
|
|
430
|
+
country_is_eu: Optional[Series[bool]] = pa.Field(alias="Adresse__Land__EULand", coerce=True, nullable=True, description="EU membership flag.")
|
|
431
|
+
|
|
432
|
+
phone: Optional[Series[pd.StringDtype]] = pa.Field(alias="Kontakt__Telefon", coerce=True, nullable=True, description="Phone number.")
|
|
433
|
+
mobile: Optional[Series[pd.StringDtype]] = pa.Field(alias="Kontakt__Mobil", coerce=True, nullable=True, description="Mobile number.")
|
|
434
|
+
contact_email: Optional[Series[pd.StringDtype]] = pa.Field(alias="Kontakt__EMail", coerce=True, nullable=True, description="Email address.")
|
|
435
|
+
work_phone: Optional[Series[pd.StringDtype]] = pa.Field(alias="KontaktDienstlich__Telefon", coerce=True, nullable=True, description="Work phone.")
|
|
436
|
+
work_mobile: Optional[Series[pd.StringDtype]] = pa.Field(alias="KontaktDienstlich__Mobil", coerce=True, nullable=True, description="Work mobile.")
|
|
437
|
+
work_email: Optional[Series[pd.StringDtype]] = pa.Field(alias="KontaktDienstlich__EMail", coerce=True, nullable=True, description="Work email.")
|
|
438
|
+
contact_business_raw: Optional[Series[pd.StringDtype]] = pa.Field(alias="KontaktDienstlich", coerce=True, nullable=True, description="Raw business contact payload.")
|
|
439
|
+
|
|
440
|
+
tax_id: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__SteuerID", coerce=True, nullable=True, description="Tax identification number.")
|
|
441
|
+
insurance_known: Optional[Series[bool]] = pa.Field(alias="Identitaet__VersicherungsnummerBekannt", coerce=True, nullable=True, description="Insurance number known flag.")
|
|
442
|
+
insurance_number: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Versicherungsnummer", coerce=True, nullable=True, description="Insurance number.")
|
|
443
|
+
insurance_card_present: Optional[Series[bool]] = pa.Field(alias="Identitaet__VersicherungsAusweisLiegtVor", coerce=True, nullable=True, description="Insurance card present flag.")
|
|
444
|
+
nationality_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Identitaet__Nationalitaet__Id", coerce=True, nullable=True, description="Nationality identifier.")
|
|
445
|
+
nationality_label: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Nationalitaet__Nationality", coerce=True, nullable=True, description="Nationality label.")
|
|
446
|
+
nationality_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Nationalitaet__Name", coerce=True, nullable=True, description="Nationality name.")
|
|
447
|
+
nationality_iso: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Nationalitaet__IsoCode", coerce=True, nullable=True, description="Nationality ISO.")
|
|
448
|
+
nationality_combined_key: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Nationalitaet__CombinedKey", coerce=True, nullable=True, description="Nationality combined key.")
|
|
449
|
+
nationality_is_eu: Optional[Series[bool]] = pa.Field(alias="Identitaet__Nationalitaet__EULand", coerce=True, nullable=True, description="Nationality EU flag.")
|
|
450
|
+
nationality_raw: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Nationalitaet", coerce=True, nullable=True, description="Original nationality payload.")
|
|
451
|
+
birth_country_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Identitaet__GeburtsLand__Id", coerce=True, nullable=True, description="Birth country id.")
|
|
452
|
+
birth_country_nationality: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__GeburtsLand__Nationality", coerce=True, nullable=True, description="Birth country nationality.")
|
|
453
|
+
birth_country_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__GeburtsLand__Name", coerce=True, nullable=True, description="Birth country name.")
|
|
454
|
+
birth_country_iso: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__GeburtsLand__IsoCode", coerce=True, nullable=True, description="Birth country ISO.")
|
|
455
|
+
birth_country_combined_key: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__GeburtsLand__CombinedKey", coerce=True, nullable=True, description="Birth country combined key.")
|
|
456
|
+
birth_country_is_eu: Optional[Series[bool]] = pa.Field(alias="Identitaet__GeburtsLand__EULand", coerce=True, nullable=True, description="Birth country EU flag.")
|
|
457
|
+
birth_country_raw: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__GeburtsLand", coerce=True, nullable=True, description="Original birth country payload.")
|
|
458
|
+
birth_city: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__GeburtsOrt", coerce=True, nullable=True, description="Birth city.")
|
|
459
|
+
residence_permit: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Aufenthaltserlaubnis", coerce=True, nullable=True, description="Residence permit date string.")
|
|
460
|
+
passport_valid_until: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Passgueltigkeit", coerce=True, nullable=True, description="Passport validity date string.")
|
|
461
|
+
work_permit: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__Arbeitserlaubnis", coerce=True, nullable=True, description="Work permit date string.")
|
|
462
|
+
eu_insurance_number: Optional[Series[pd.StringDtype]] = pa.Field(alias="Identitaet__EUVersicherungsnummer", coerce=True, nullable=True, description="EU insurance number.")
|
|
463
|
+
first_employment: Optional[Series[bool]] = pa.Field(alias="Identitaet__ErstmaligeAufnahmeBesch", coerce=True, nullable=True, description="First employment flag.")
|
|
464
|
+
|
|
465
|
+
bank_key_type_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Bankverbindung__Schluesselart__Id", coerce=True, nullable=True, description="Bank key type id.")
|
|
466
|
+
bank_key_type_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Schluesselart__Text", coerce=True, nullable=True, description="Bank key type text.")
|
|
467
|
+
bank_key_type_id_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Schluesselart__IdMitText", coerce=True, nullable=True, description="Bank key type id-text.")
|
|
468
|
+
payment_purpose: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Verwendungszweck", coerce=True, nullable=True, description="Payment purpose.")
|
|
469
|
+
iban: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__IBAN", coerce=True, nullable=True, description="IBAN.")
|
|
470
|
+
bic: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__BIC", coerce=True, nullable=True, description="BIC.")
|
|
471
|
+
bank_reference_object: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Bank", coerce=True, nullable=True, description="Raw bank reference payload.")
|
|
472
|
+
bank_reference_id: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Bank__Id", coerce=True, nullable=True, description="Bank reference id.")
|
|
473
|
+
bank_reference_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Bank__Text", coerce=True, nullable=True, description="Bank reference text.")
|
|
474
|
+
bank_reference_id_text: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Bank__IdMitText", coerce=True, nullable=True, description="Bank reference id-text.")
|
|
475
|
+
bank_account_number: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Kontonummer", coerce=True, nullable=True, description="Account number.")
|
|
476
|
+
bank_code: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Bankleitzahl", coerce=True, nullable=True, description="Bank code.")
|
|
477
|
+
bank_recipient: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Empfaenger", coerce=True, nullable=True, description="Payment recipient.")
|
|
478
|
+
bank_validation_amount: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__PruefBetrag", coerce=True, nullable=True, description="Validation amount.")
|
|
479
|
+
settlement_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Bankverbindung__VerrechnungUeber__Id", coerce=True, nullable=True, description="Settlement record id.")
|
|
480
|
+
settlement_company_id: Optional[Series[pd.Int64Dtype]] = pa.Field(alias="Bankverbindung__VerrechnungUeber__MdNr", coerce=True, nullable=True, description="Settlement company identifier.")
|
|
481
|
+
settlement_account: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__VerrechnungUeber__AccountNr", coerce=True, nullable=True, description="Settlement account number.")
|
|
482
|
+
settlement_bank_code: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__VerrechnungUeber__BankCode", coerce=True, nullable=True, description="Settlement bank code.")
|
|
483
|
+
settlement_bank_name: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__VerrechnungUeber__BankName", coerce=True, nullable=True, description="Settlement bank name.")
|
|
484
|
+
payment_type: Optional[Series[pd.StringDtype]] = pa.Field(alias="Bankverbindung__Zahlungsart", coerce=True, nullable=True, description="Payment type.")
|
|
485
|
+
class Config:
|
|
486
|
+
coerce = True
|
|
487
|
+
strict = False
|