Files
enterprise-addons/l10n_ch_hr_payroll/models/l10n_ch_individual_account.py
T

146 lines
9.3 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import datetime
from collections import defaultdict
from odoo import api, fields, models, _
from odoo.fields import Datetime
class L10nChIndividualAccount(models.Model):
_name = 'l10n.ch.individual.account'
_inherit = ['hr.payroll.declaration.mixin']
_description = 'Swiss Payroll: Individual Account'
def _country_restriction(self):
return 'CH'
name = fields.Char(
string="Description", required=True, compute='_compute_name', readonly=False, store=True)
@api.depends('year')
def _compute_name(self):
for sheet in self:
sheet.name = _('Individual Accounts - Year %s', sheet.year)
def action_generate_declarations(self):
for sheet in self:
all_payslips = self.env['hr.payslip'].search([
('date_to', '<=', datetime.date(int(sheet.year), 12, 31)),
('date_from', '>=', datetime.date(int(sheet.year), 1, 1)),
('state', 'in', ['validated', 'paid']),
('company_id', '=', sheet.company_id.id),
])
all_employees = all_payslips.employee_id
sheet.write({
'line_ids': [(5, 0, 0)] + [
(0, 0, {
'employee_id': False,
'res_model': 'l10n.ch.individual.account',
'res_id': sheet.id})] + [
(0, 0, {
'employee_id': employee.id,
'res_model': 'l10n.ch.individual.account',
'res_id': sheet.id,
}) for employee in all_employees
]
})
return super().action_generate_declarations()
def _get_rendering_data(self, employees):
self.ensure_one()
payslips = self.env['hr.payslip'].search([
('employee_id', 'in', employees.ids),
('state', 'in', ['validated', 'paid']),
('date_from', '>=', Datetime.now().replace(month=1, day=1, year=int(self.year))),
('date_from', '<=', Datetime.now().replace(month=12, day=31, year=int(self.year))),
('struct_id.code', '=', 'CHMONTHLYELM'),
])
employees = list(payslips.employee_id) + [self.env['hr.employee']]
lines = payslips.line_ids.filtered(lambda l: l.salary_rule_id.l10n_ch_code)
is_lines = payslips.l10n_ch_is_log_line_ids
rules = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(float))))
rules_company = defaultdict(lambda: defaultdict(lambda: defaultdict(float)))
for line in lines:
employee_id = line.slip_id.employee_id
if line.salary_rule_id.l10n_ch_code == "9041":
rules[employee_id]["9041"][f'LAAC Salary - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["9041"][f'LAAC Salary - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
elif line.salary_rule_id.l10n_ch_code == "9043":
rules[employee_id]["9041"][f'LAAC Salary - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["9041"][f'LAAC Salary - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
elif line.salary_rule_id.l10n_ch_code == "5041":
rules[employee_id]["5041"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["5041"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
elif line.salary_rule_id.l10n_ch_code == "5043":
rules[employee_id]["5041"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["5041"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_additional_accident_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
elif line.salary_rule_id.l10n_ch_code == "5045":
rules[employee_id]["5045"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["5045"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
elif line.salary_rule_id.l10n_ch_code == "5047":
rules[employee_id]["5045"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["5045"][f'{line.name[:-2]} - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
elif line.salary_rule_id.l10n_ch_code == "9051":
rules[employee_id]["9051"][f'IJM Salary - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["9051"][f'IJM Salary - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[0].solution_code}'][line.slip_id.date_from.month - 1] += line.total
elif line.salary_rule_id.l10n_ch_code == "9053":
rules[employee_id]["9051"][f'IJM Salary - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
rules_company["9051"][f'IJM Salary - Code {line.slip_id.l10n_ch_sickness_insurance_line_ids[1].solution_code}'][line.slip_id.date_from.month - 1] += line.total
else:
if line.salary_rule_id.l10n_ch_code not in ["9070", "9072", "9071", "9073", "9075", "5061", "5062", "5060"]:
rules[employee_id][line.salary_rule_id.l10n_ch_code][line.name][line.slip_id.date_from.month - 1] += line.total
rules_company[line.salary_rule_id.l10n_ch_code][line.name][line.slip_id.date_from.month - 1] += line.total
for line in is_lines:
employee_id = line.payslip_id.employee_id
if line.code == "ISSALARY":
rules[employee_id]["9070"][f'Source-Tax Salary - {line.source_tax_canton}-{line.is_code}'][line.payslip_id.date_from.month - 1] += line.amount
rules_company["9070"][f'Source-Tax Salary - {line.source_tax_canton}-{line.is_code}'][line.payslip_id.date_from.month - 1] += line.amount
if line.code == "ISDTSALARY":
rules[employee_id]["9073"][f'Source-Tax Rate Determinant Salary - {line.source_tax_canton}'][line.payslip_id.date_from.month - 1] += line.amount
rules_company["9073"][f'Source-Tax Rate Determinant Salary - {line.source_tax_canton}'][line.payslip_id.date_from.month - 1] += line.amount
if line.code == "IS":
rules[employee_id]["5060"][f'Source-Tax Amount - {line.source_tax_canton}-{line.is_code}'][line.payslip_id.date_from.month - 1] += -line.amount
rules_company["5060"][f'Source-Tax Amount - {line.source_tax_canton}-{line.is_code}'][line.payslip_id.date_from.month - 1] += -line.amount
result = {
employee: {
'year': self.year,
'company': employee.company_id or self.company_id,
'contract_type': employee.version_id.contract_type_id.name or '',
'job_title': employee.version_id.job_id.name or '',
'entry_date': employee.version_id.date_start or '',
'withdrawal_date': employee.version_id.date_end or '',
'work_adress': employee.version_id.l10n_ch_location_unit_id.partner_id or '',
'activity_rate': employee.version_id.l10n_ch_current_occupation_rate or 0,
'rules': sorted(
[
{
'code': code,
'name': name,
'monthly_values': [round(months.get(month, 0.0), 2) for month in range(12)] + [round(sum(months.get(month, 0.0) for month in range(12)), 2)]
}
for code, names in (rules[employee].items() if employee else rules_company.items())
for name, months in names.items()
],
key=lambda rule: rule['code']
),
} for employee in employees
}
return result
def _get_pdf_report(self):
return self.env.ref('l10n_ch_hr_payroll.action_report_individual_account')
def _get_pdf_filename(self, employee):
self.ensure_one()
if employee:
return _('%(employee)s-ch-individual-account-%(year)s', employee=employee.name, year=self.year)
return _('%(company)s-ch-global-account-%(year)s', company=self.company_id.name, year=self.year)