# Part of the odoo-at-payroll project. License: LGPL-3. """Meldewesen-Stammdaten (GP7/AP5): ELDA-/FinOnl-Identifikation der Dienstgeberin und der Arbeitsstätten. - ``res.company``: Beitragskontonummer (BKNR — ELDA-Feld, Präfix = KV-Träger) und Lohnsteuernummer (9-stellig: 2 Stellen Finanzamt + 7 Stellen Nummer; L16-I1 STNRA/STNRL, Arbeitsstättenmeldung STNR). - ``res.partner``: österreichische Gemeindekennziffer (AGKZ) für die Arbeitsstättenmeldung nach § 34 Abs 6 ASVG — Odoo hält keine GKZ, das Feld ist mandantenseitig zu pflegen (Warnung des L16-Laufs, wenn es am Dienstort-Partner fehlt). - ``hr.version``: Kennzeichen fallweise Beschäftigung (§ 33 Abs 1a Z 1 ASVG — tagesgenaue vereinfachte Anmeldung vor Arbeitsantritt, DM-ORG BEST MA) und VSNR-Formatprüfung (10-stellig LLLPTTMMJJ; Prüfzifferalgorithmus der SVS ist nicht beschafft → nur Format/ Plausibilität, Rest dokumentiert). - ``hr.departure.reason``: Mapping auf den eSV-Abmeldegrund (AGRD, DM-ORG D.22; Standard ``00`` sonstiger Grund mit Ende des Beschäftigungsverhältnisses).""" from odoo import api, fields, models from odoo.exceptions import ValidationError class ResCompany(models.Model): _inherit = 'res.company' l10n_at_beitragskontonummer = fields.Char( string='AT Beitragskontonummer (BKNR)', help='eSV-Beitragskontonummer des Dienstgebers (10 Stellen;\n' 'die ersten Stellen codieren den KV-Träger). Pflichtfeld\n' 'jeder ELDA-Meldung (mBGM-Paket BKNR, Versichertenmeldung,\n' 'Arbeitsstättenmeldung, fallweise Anmeldung).') l10n_at_lohnsteuernummer = fields.Char( string='AT Lohnsteuernummer', help='9-stellig: 2 Stellen Finanzamtsnummer + 7 Stellen\n' 'Steuernummer (Lohnzettel Finanz I1 STNRA/STNRL;\n' 'Arbeitsstättenmeldung STNR).') class ResPartner(models.Model): _inherit = 'res.partner' l10n_at_gemeindekennziffer = fields.Char( string='AT Gemeindekennziffer (GKZ)', help='5-stellige österreichische Gemeindekennzahl für die\n' 'Arbeitsstättenmeldung nach § 34 Abs 6 ASVG (Feld AGKZ).\n' 'Am Dienstort-Partner des Mitarbeiters pflegen.') class HrVersion(models.Model): _inherit = 'hr.version' l10n_at_fallweise = fields.Boolean( string='AT Fallweise Beschäftigung', groups="hr_payroll.group_hr_payroll_user", tracking=True, help='Fallweise Beschäftigung (§ 33 Abs 1a Z 1 ASVG): je\n' 'Beschäftigungstag ist die vereinfachte Anmeldung vor\n' 'Arbeitsantritt zu übermitteln (ELDA BEST MA, Satzarten\n' '32/33); An-/Abmeldung laufen über die mBGM (G3/G4).') @api.constrains('ssnid') def _l10n_at_vsnr_format(self): """VSNR-Formatprüfung LLLPTTMMJJ (10 Stellen, Ziffern, plausibles Geburtsdatum TTMMJJ an den Stellen 5–10). Der Prüfzifferalgorithmus der SVS ist nicht beschafft → nur Format/Plausibilität (Rest dokumentiert; die Meldungsgeneratoren listen ungültige VSNR listenweise als UserError).""" for version in self: if not version.ssnid: continue roh = version.ssnid.strip() if len(roh) != 10 or not roh.isdigit(): raise ValidationError( 'Versicherungsnummer %r: 10 Ziffern im Format LLLPTTMMJJ ' 'erwartet.' % version.ssnid) try: tag = int(roh[4:6]) monat = int(roh[6:8]) if not 1 <= tag <= 31 or not 1 <= monat <= 12: raise ValueError() except ValueError: raise ValidationError( 'Versicherungsnummer %r enthält kein plausibles ' 'Geburtsdatum (TTMMJJ an den Stellen 5–10).' % version.ssnid) class HrDepartureReason(models.Model): _inherit = 'hr.departure.reason' l10n_at_agrd = fields.Char( string='AT eSV-Abmeldegrund (AGRD)', help='2-stelliger Abmeldegrund-Code der Versichertenmeldung ' '(DM-ORG D.22); Standard 00 „Sonstiger Grund mit Ende des ' 'Beschäftigungsverhältnisses“.')