odoo18/addons_extensions/hr_payroll/controllers/main.py

56 lines
2.3 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import io
import re
from odoo.http import request, route, Controller, content_disposition
from odoo.tools.pdf import PdfFileReader, PdfFileWriter
from odoo.tools.safe_eval import safe_eval
class HrPayroll(Controller):
@route(["/print/payslips"], type='http', auth='user')
def get_payroll_report_print(self, list_ids='', **post):
if not request.env.user.has_group('hr_payroll.group_hr_payroll_user') or not list_ids or re.search("[^0-9|,]", list_ids):
return request.not_found()
ids = [int(s) for s in list_ids.split(',')]
payslips = request.env['hr.payslip'].browse(ids)
pdf_writer = PdfFileWriter()
payslip_reports = payslips._get_pdf_reports()
for report, slips in payslip_reports.items():
for payslip in slips:
pdf_content, _ = request.env['ir.actions.report'].\
with_context(lang=payslip.employee_id.lang or payslip.env.lang).\
sudo().\
_render_qweb_pdf(report, payslip.id, data={'company_id': payslip.company_id})
reader = PdfFileReader(io.BytesIO(pdf_content), strict=False, overwriteWarnings=False)
for page in range(reader.getNumPages()):
pdf_writer.addPage(reader.getPage(page))
_buffer = io.BytesIO()
pdf_writer.write(_buffer)
merged_pdf = _buffer.getvalue()
_buffer.close()
if len(payslip_reports) == 1 and len(payslips) == 1 and payslips.struct_id.report_id.print_report_name:
report_name = safe_eval(payslips.struct_id.report_id.print_report_name, {'object': payslips})
else:
report_name = ' - '.join(r.name for r in list(payslip_reports.keys()))
employees = payslips.employee_id.mapped('name')
if len(employees) == 1:
report_name = '%s - %s' % (report_name, employees[0])
pdfhttpheaders = [
('Content-Type', 'application/pdf'),
('Content-Length', len(merged_pdf)),
('Content-Disposition', content_disposition(report_name + '.pdf'))
]
return request.make_response(merged_pdf, headers=pdfhttpheaders)