# Part of the odoo-at-payroll project. License: LGPL-3. """Monatsdienstliste und Monatsjournal (GP7/AP6): QWeb-Datenlieferanten auf dem Lohnlauf (hr.payslip.run) — voraberechnete Aggregation über `hr.payslip.line` (read_group-Muster des Contribution Register), damit die Templates reine Darstellung bleiben. - **Monatsdienstliste**: je AN eine Zeile mit den mBGM-Kontrollgrößen (Versicherungstage/Beitragsgrundlagen je Beitragsmonat, DN- und DG-Beiträge, DG-Anteile) — Abstimmung Abrechnung ↔ SV-Meldung. - **Monatsjournal**: je Lohnart die Summe über den Lauf (Brutto, Abzüge, DG-Anteile, Netto) mit Kontrollsummen gegen die GP6-Buchung.""" from odoo import models class L10nAtPayrollMonatsReports(models.AbstractModel): _name = 'report.l10n_at_hr_payroll.report_monatsdienstliste' _description = 'Monatsdienstliste (GP7/AP6)' def _get_report_values(self, docids, data=None): runs = self.env['hr.payslip.run'].browse(docids) zeilen = [] for run in runs: for slip in run.slip_ids.filtered( lambda p: p.state not in ('draft', 'cancel')): version = slip.version_id basen = slip._l10n_at_sv_basis_laufen_monate() sv_dn = sum( slip._l10n_at_svdn(k) for k in ('kv', 'pv', 'av', 'ak', 'wf')) sv_dg = slip._l10n_at_svdg_gesamt() sz_dn = slip._l10n_at_svdn_sz() sz_basis = slip._l10n_at_svdn_basis_sz() zeilen.append({ 'slip': slip, 'versicherungsnummer': version.ssnid if version else '', 'personalgruppe': getattr( version, 'l10n_at_personalgruppe', '') if version else '', 'geringfuegig': slip.l10n_at_geringfuegig, 'basis_laufen': sum( b for _m, b in basen), 'sz_basis': sz_basis, 'sv_dn': sv_dn, 'sv_dg': sv_dg, 'sv_dn_sz': sz_dn, 'lohnsteuer': sum( slip.line_ids.filtered( lambda l: l.code in ('LST_LFD', 'LST_SZ') ).mapped('total')), 'netto': sum( slip.line_ids.filtered( lambda l: l.code == 'NET').mapped('total')), 'brutto': sum( slip.line_ids.filtered( lambda l: l.salary_rule_id.l10n_at_bemessung != 'neutral').mapped('total')), }) return {'docs': runs, 'zeilen': zeilen} class L10nAtPayrollMonatsjournal(models.AbstractModel): _name = 'report.l10n_at_hr_payroll.report_monatsjournal' _description = 'Monatsjournal (GP7/AP6)' def _get_report_values(self, docids, data=None): runs = self.env['hr.payslip.run'].browse(docids) zeilen = [] for run in runs: gruppen = {} for slip in run.slip_ids.filtered( lambda p: p.state not in ('draft', 'cancel')): for line in slip.line_ids: regel = line.salary_rule_id if not line.total or regel.l10n_at_bemessung \ == 'neutral': continue schluessel = (regel.code, regel.name, regel.l10n_at_bemessung) eintrag = gruppen.setdefault(schluessel, 0.0) gruppen[schluessel] = eintrag + line.total zeilen.append({ 'run': run, 'arten': [ {'code': code, 'name': name, 'bemessung': bemessung, 'summe': summe} for (code, name, bemessung), summe in sorted(gruppen.items())], }) return {'docs': runs, 'journal': zeilen}