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.
Files changed (31) hide show
  1. brynq_sdk_sage_germany/__init__.py +278 -0
  2. brynq_sdk_sage_germany/absences.py +175 -0
  3. brynq_sdk_sage_germany/allowances.py +100 -0
  4. brynq_sdk_sage_germany/contracts.py +145 -0
  5. brynq_sdk_sage_germany/cost_centers.py +89 -0
  6. brynq_sdk_sage_germany/employees.py +140 -0
  7. brynq_sdk_sage_germany/helpers.py +391 -0
  8. brynq_sdk_sage_germany/organization.py +90 -0
  9. brynq_sdk_sage_germany/payroll.py +167 -0
  10. brynq_sdk_sage_germany/payslips.py +106 -0
  11. brynq_sdk_sage_germany/salaries.py +95 -0
  12. brynq_sdk_sage_germany/schemas/__init__.py +44 -0
  13. brynq_sdk_sage_germany/schemas/absences.py +311 -0
  14. brynq_sdk_sage_germany/schemas/allowances.py +147 -0
  15. brynq_sdk_sage_germany/schemas/cost_centers.py +46 -0
  16. brynq_sdk_sage_germany/schemas/employees.py +487 -0
  17. brynq_sdk_sage_germany/schemas/organization.py +172 -0
  18. brynq_sdk_sage_germany/schemas/organization_assignment.py +61 -0
  19. brynq_sdk_sage_germany/schemas/payroll.py +287 -0
  20. brynq_sdk_sage_germany/schemas/payslips.py +34 -0
  21. brynq_sdk_sage_germany/schemas/salaries.py +101 -0
  22. brynq_sdk_sage_germany/schemas/start_end_dates.py +194 -0
  23. brynq_sdk_sage_germany/schemas/vacation_account.py +117 -0
  24. brynq_sdk_sage_germany/schemas/work_hours.py +94 -0
  25. brynq_sdk_sage_germany/start_end_dates.py +123 -0
  26. brynq_sdk_sage_germany/vacation_account.py +70 -0
  27. brynq_sdk_sage_germany/work_hours.py +97 -0
  28. brynq_sdk_sage_germany-1.0.0.dist-info/METADATA +21 -0
  29. brynq_sdk_sage_germany-1.0.0.dist-info/RECORD +31 -0
  30. brynq_sdk_sage_germany-1.0.0.dist-info/WHEEL +5 -0
  31. 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