1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/documents_hr_payroll/models/hr_payroll_employee_declaration.py
2024-12-10 09:04:09 +07:00

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"),
}
}