# Part of the odoo-at-payroll project. License: LGPL-3. """BV-Endabrechnungs-Wizard (GP5): Anwartschaftsausweis bei Austritt mit §-14-Abs-2-Verfügbarkeitsprüfung und Fristenausweis (§§ 16 f. BMSVG). Reiner Informations-/Dokumentationsprozess — die Auszahlung der Anwartschaft erfolgt durch die MV-Kasse (§ 15: gutgebrachte Beiträge + Erträge, KEINE Monatsentgelt-Staffel), nicht über die Lohnverrechnung. Verfügungsmatrix (lb-end-03, Stand 2026-08): Verfügungsausschluss bei AN-Kündigung (außer MSchG/VKG-Teilzeit- Kündigung), verschuldeter Entlassung, unberechtigtem vorzeitigem Austritt — und IMMER bei weniger als 36 Beitragsmonaten seit der ersten Beitragszahlung bzw. letztmaligen Verfügung (alle Beitragszeiten zählen, Vor-Arbeitgeber manuell erfassen).""" from datetime import timedelta from dateutil.relativedelta import relativedelta from odoo import _, api, fields, models ABS14_GRUPPEN = ('an_kuendigung', 'verschuldete_entlassung', 'unberechtigter_austritt') class L10nAtBvEndabrechnungWizard(models.TransientModel): _name = 'l10n.at.bv.endabrechnung.wizard' _description = 'BV-Endabrechnung (Abfertigung Neu, §§ 14-17 BMSVG)' employee_id = fields.Many2one( 'hr.employee', string='Dienstnehmer:in', required=True) austrittsdatum = fields.Date( string='Austritt (Ende des Arbeitsverhältnisses)', help='Beginn der 6-Monats-Erklärungsfrist (§ 17 BMSVG): gibt der ' 'Berechtigte binnen sechs Monaten keine ' 'Verwendungserklärung ab, wird weiterveranlagt.') beendigungsart = fields.Selection( [('ag_kuendigung', 'Kündigung durch den Arbeitgeber (unschädlich)'), ('einvernehmlich', 'Einvernehmliche Auflösung (unschädlich)'), ('berechtigter_austritt', 'Berechtigter vorzeitiger Austritt (unschädlich)'), ('unverschuldete_entlassung', 'Unverschuldete/unrechtmäßige Entlassung (unschädlich)'), ('an_kuendigung', 'Kündigung durch den AN (§ 14 Abs 2 BMSVG)'), ('verschuldete_entlassung', 'Verschuldete Entlassung (§ 14 Abs 2 BMSVG)'), ('unberechtigter_austritt', 'Unberechtigter vorzeitiger Austritt (§ 14 Abs 2 BMSVG)'), ('tod', 'Tod (ungekürzt an unterhaltsberechtigte Erben)')], string='Beendigungsart', required=True) monate_extern = fields.Integer( string='Beitragsmonate Vor-Arbeitgeber', help='Beitragsmonate aus Vor-Beschäftigungen laut Auszug der ' 'MV-Kasse (§ 14 Abs 2 BMSVG: alle Beitragszeiten über ' 'Arbeitgeber hinweg summierbar). Vorbelegt aus dem ' 'Mitarbeiter-Stamm.') ertraege = fields.Monetary( string='Erträge laut Kassen-Auszug', currency_field='currency_id', help='Veranlagungserträge laut Auszug der MV-Kasse; die ' 'Anwartschaft = gutgebrachte Beiträge + Erträge (§ 15 ' 'BMSVG).') currency_id = fields.Many2one( 'res.currency', default=lambda self: self.env.company.currency_id) geltendmachung = fields.Date( string='Geltendmachung', default=fields.Date.today, help='Datum der Geltendmachung gegenüber dem Arbeitgeber; die ' 'Fälligkeit der Auszahlung tritt am Ende des ' 'zweitfolgenden Monats ein (§ 16 BMSVG).') kasse_id = fields.Many2one( 'l10n.at.bv.kasse', string='Mitarbeitervorsorgekasse', compute='_compute_ergebnis') monate_lokal = fields.Integer( string='Beitragsmonate (dieser DG)', compute='_compute_ergebnis', help='Beitragsmonate aus validierten Lohnläufen mit BVG-Beitrag.') beitraege_lokal = fields.Monetary( string='Gutgebrachte Beiträge (dieser DG)', currency_field='currency_id', compute='_compute_ergebnis') monate_gesamt = fields.Integer( string='Beitragsmonate gesamt', compute='_compute_ergebnis', help='Beitragsmonate gesamt inkl. Vor-Arbeitgeber — ' '36-Monats-Kriterium des § 14 Abs 2 BMSVG.') anwartschaft = fields.Monetary( string='Anwartschaft (Beiträge + Erträge)', currency_field='currency_id', compute='_compute_ergebnis') verfuegbar = fields.Boolean( string='Verfügbar (§ 14 Abs 2 BMSVG)', compute='_compute_ergebnis') sperrgrund = fields.Text( string='Verfügungsausschluss', compute='_compute_ergebnis') faelligkeit = fields.Date( string='Fälligkeit Auszahlung (§ 16 BMSVG)', compute='_compute_ergebnis') erklaerungsfrist = fields.Date( string='Erklärungsfrist (§ 17 BMSVG)', compute='_compute_ergebnis') @api.onchange('employee_id') def _onchange_employee(self): for wizard in self: if not wizard.employee_id: continue wizard.austrittsdatum = ( wizard.employee_id.version_id.contract_date_end or fields.Date.today()) wizard.monate_extern = \ wizard.employee_id.l10n_at_bv_monate_extern wizard.ertraege = wizard.employee_id.l10n_at_bv_ertraege @api.depends('employee_id', 'beendigungsart', 'monate_extern', 'ertraege', 'geltendmachung', 'austrittsdatum') def _compute_ergebnis(self): for wizard in self: if wizard.employee_id: fort = wizard.employee_id._at_bv_anwartschaft() wizard.kasse_id = wizard.employee_id.l10n_at_bv_kasse_id wizard.monate_lokal = fort['monate'] wizard.beitraege_lokal = fort['beitraege'] else: wizard.kasse_id = False wizard.monate_lokal = 0 wizard.beitraege_lokal = 0.0 wizard.monate_gesamt = wizard.monate_lokal \ + wizard.monate_extern wizard.anwartschaft = wizard.beitraege_lokal + wizard.ertraege grund = False if wizard.beendigungsart in ABS14_GRUPPEN: grund = _('Verfügungsausschluss nach § 14 Abs 2 BMSVG ' 'wegen der Beendigungsart (Kündigung durch ' 'den AN, verschuldete Entlassung oder ' 'unberechtigter vorzeitiger Austritt); die ' 'Anwartschaft bleibt bei der MV-Kasse ' 'weiterveranlagt.') elif wizard.monate_gesamt < 36: grund = _('Verfügungsausschluss nach § 14 Abs 2 BMSVG: ' 'noch keine 36 Beitragsmonate (%(monaten)s von ' '36; alle Beitragszeiten zählen).', monaten=wizard.monate_gesamt) wizard.verfuegbar = not grund wizard.sperrgrund = grund if wizard.geltendmachung: # § 16: Fälligkeit am Ende des zweitfolgenden Monats. zweit = wizard.geltendmachung + relativedelta(months=2) wizard.faelligkeit = (zweit.replace(day=1) + relativedelta(months=1) - timedelta(days=1)) else: wizard.faelligkeit = False wizard.erklaerungsfrist = ( wizard.austrittsdatum + relativedelta(months=6) if wizard.austrittsdatum else False) def action_report(self): self.ensure_one() return self.env.ref( 'l10n_at_hr_payroll_private.action_report_bv_anwartschaft' ).report_action(self.employee_id)