63 lines
2.2 KiB
Python
63 lines
2.2 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
from io import BytesIO
|
|
|
|
from pypdf import PdfReader, PdfWriter
|
|
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.report import Report
|
|
from trytond.transaction import Transaction
|
|
|
|
|
|
class Invoice(metaclass=PoolMeta):
|
|
__name__ = 'account.invoice'
|
|
|
|
@classmethod
|
|
def _execute(cls, records, header, data, action):
|
|
pool = Pool()
|
|
Watermark = pool.get('account.invoice.watermark', type='report')
|
|
format_, data = super()._execute(records, header, data, action)
|
|
if format_ == 'pdf':
|
|
invoice, = records
|
|
report_id = cls.get_report_id(invoice)
|
|
if report_id is not None:
|
|
if invoice.party.lang:
|
|
language = invoice.party.lang.code
|
|
else:
|
|
language = Transaction().language
|
|
with Transaction().set_context(language=language):
|
|
_, watermark, _, _ = Watermark.execute([invoice.id], {
|
|
'action_id': report_id,
|
|
})
|
|
data = cls.merge(data, watermark)
|
|
return format_, data
|
|
|
|
@classmethod
|
|
def get_report_id(cls, invoice):
|
|
pool = Pool()
|
|
ModelData = pool.get('ir.model.data')
|
|
if invoice.state == 'paid':
|
|
return ModelData.get_id(
|
|
'account_invoice_watermark', 'report_invoice_watermark_paid')
|
|
elif invoice.state == 'draft':
|
|
return ModelData.get_id(
|
|
'account_invoice_watermark', 'report_invoice_watermark_draft')
|
|
|
|
@classmethod
|
|
def merge(cls, invoice, watermark):
|
|
output = PdfWriter()
|
|
invoice = PdfReader(BytesIO(invoice))
|
|
watermark = PdfReader(BytesIO(watermark))
|
|
watermark = watermark.pages[0]
|
|
for i in range(len(invoice.pages)):
|
|
page = invoice.pages[i]
|
|
page.merge_page(watermark)
|
|
output.add_page(page)
|
|
data = BytesIO()
|
|
output.write(data)
|
|
return data.getvalue()
|
|
|
|
|
|
class InvoiceWatermark(Report):
|
|
__name__ = 'account.invoice.watermark'
|