forked from Mapan/odoo17e
85 lines
3.5 KiB
Python
85 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import models, fields, api, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class HrPayrollEmployeeDeclaration(models.Model):
|
|
_inherit = 'hr.payroll.employee.declaration'
|
|
|
|
pdf_to_post = fields.Boolean()
|
|
state = fields.Selection(
|
|
selection_add=[
|
|
('pdf_to_post', 'Queued PDF posting'),
|
|
('pdf_posted', 'Posted PDF')
|
|
], ondelete={'pdf_to_post': 'set pdf_generated', 'pdf_posted': 'set pdf_generated'})
|
|
document_id = fields.Many2one('documents.document')
|
|
|
|
@api.depends('pdf_to_post', 'document_id')
|
|
def _compute_state(self):
|
|
super()._compute_state()
|
|
for declaration in self:
|
|
if declaration.pdf_to_post:
|
|
declaration.state = 'pdf_to_post'
|
|
elif declaration.document_id:
|
|
declaration.state = 'pdf_posted'
|
|
|
|
def _get_posted_documents(self):
|
|
document_data = self.env['documents.document']._read_group([
|
|
('name', 'in', [line.pdf_filename for line in self]), ('active', '=', True)],
|
|
groupby=['name'], aggregates=['__count'])
|
|
mapped_data = dict(document_data)
|
|
return [posted_filename for posted_filename in mapped_data if mapped_data[posted_filename] > 0]
|
|
|
|
def _post_pdf(self):
|
|
create_vals = []
|
|
posted_documents = self._get_posted_documents()
|
|
lines_to_post = self.env['hr.payroll.employee.declaration']
|
|
for line in self:
|
|
template = self.env[line.res_model]._get_posted_mail_template()
|
|
if line.pdf_filename not in posted_documents and line.pdf_file:
|
|
lines_to_post += line
|
|
create_vals.append({
|
|
'owner_id': self.env[line.res_model]._get_posted_document_owner(line.employee_id).id,
|
|
'datas': line.pdf_file,
|
|
'name': line.pdf_filename,
|
|
'folder_id': line.company_id.documents_payroll_folder_id.id,
|
|
'res_model': 'hr.payslip', # Security Restriction to payroll managers
|
|
})
|
|
if template:
|
|
template.send_mail(line.employee_id.id, email_layout_xmlid='mail.mail_notification_light')
|
|
|
|
posted_documents = self.env['documents.document'].create(create_vals)
|
|
for line_to_post, posted_document in zip(lines_to_post, posted_documents):
|
|
line_to_post.document_id = posted_document
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
declarations = super().create(vals_list)
|
|
if any(declaration.pdf_to_post for declaration in declarations):
|
|
self.env.ref('hr_payroll.ir_cron_generate_payslip_pdfs')._trigger()
|
|
return declarations
|
|
|
|
def write(self, vals):
|
|
res = super().write(vals)
|
|
if vals.get('pdf_to_post'):
|
|
self.env.ref('hr_payroll.ir_cron_generate_payslip_pdfs')._trigger()
|
|
return res
|
|
|
|
def action_post_in_documents(self):
|
|
for company in self.company_id:
|
|
if not company._payroll_documents_enabled():
|
|
raise UserError(_('Document posting is not properly set in configuration'))
|
|
self.write({'pdf_to_post': True})
|
|
self.env.ref('hr_payroll.ir_cron_generate_payslip_pdfs')._trigger()
|
|
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'type': 'success',
|
|
'message': _("PDFs are gonna be posted in Documents shortly"),
|
|
}
|
|
}
|