[IMP] snailmail: Generate a cover page if the "Cover Page" option is turned on
Pingen's v2 API does not offer an endpoint to generate a Cover Page automatically with an API call anymore, thus the need to generate it and append it to the invoice from the client-side beforehand. X-original-commit: 13f934cebc35511f8ba587b9d07a658bf7c1e640 Part-of: odoo/odoo#103806
This commit is contained in:
@@ -2,6 +2,14 @@
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
import re
|
||||
import base64
|
||||
import io
|
||||
|
||||
from PyPDF2 import PdfFileReader, PdfFileMerger
|
||||
from reportlab.platypus import Frame, Paragraph, KeepInFrame
|
||||
from reportlab.lib.units import mm
|
||||
from reportlab.lib.pagesizes import A4
|
||||
from reportlab.lib.styles import getSampleStyleSheet
|
||||
from reportlab.pdfgen.canvas import Canvas
|
||||
|
||||
from odoo import fields, models, api, _
|
||||
from odoo.addons.iap.tools import iap_tools
|
||||
@@ -139,6 +147,8 @@ class SnailmailLetter(models.Model):
|
||||
report_name = 'Document'
|
||||
filename = "%s.%s" % (report_name, "pdf")
|
||||
pdf_bin, _ = self.env['ir.actions.report'].with_context(snailmail_layout=not self.cover)._render_qweb_pdf(report, self.res_id)
|
||||
if self.cover:
|
||||
pdf_bin = self._append_cover_page(pdf_bin)
|
||||
attachment = self.env['ir.attachment'].create({
|
||||
'name': filename,
|
||||
'datas': base64.b64encode(pdf_bin),
|
||||
@@ -428,3 +438,33 @@ class SnailmailLetter(models.Model):
|
||||
record.ensure_one()
|
||||
required_keys = ['street', 'city', 'zip', 'country_id']
|
||||
return all(record[key] for key in required_keys)
|
||||
|
||||
def _append_cover_page(self, invoice_bin: bytes):
|
||||
address = self.partner_id.contact_address.replace('\n', '<br/>')
|
||||
address_x = 118 * mm
|
||||
address_y = 60 * mm
|
||||
frame_width = 85.5 * mm
|
||||
frame_height = 25.5 * mm
|
||||
|
||||
cover_buf = io.BytesIO()
|
||||
canvas = Canvas(cover_buf, pagesize=A4)
|
||||
styles = getSampleStyleSheet()
|
||||
|
||||
frame = Frame(address_x, A4[1] - address_y - frame_height, frame_width, frame_height)
|
||||
story = [Paragraph(address, styles['Normal'])]
|
||||
address_inframe = KeepInFrame(0, 0, story)
|
||||
frame.addFromList([address_inframe], canvas)
|
||||
canvas.save()
|
||||
cover_buf.seek(0)
|
||||
|
||||
invoice = PdfFileReader(io.BytesIO(invoice_bin))
|
||||
cover_bin = io.BytesIO(cover_buf.getvalue())
|
||||
cover_file = PdfFileReader(cover_bin)
|
||||
merger = PdfFileMerger()
|
||||
|
||||
merger.append(cover_file, import_bookmarks=False)
|
||||
merger.append(invoice, import_bookmarks=False)
|
||||
|
||||
out_buff = io.BytesIO()
|
||||
merger.write(out_buff)
|
||||
return out_buff.getvalue()
|
||||
|
||||
Reference in New Issue
Block a user