[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:
Solan Delvenne (sode)
2022-10-28 14:20:53 +02:00
parent 95024f8bcb
commit 08deba16b3
@@ -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()