Odoo 10 Qweb PDF 报告中自定义检查页面的分页问题

Page Break Issue On Custom Cheque Page in Odoo 10 Qweb PDF Report

最近几天我在 Qweb 报告中遇到了一些页面中断问题。 我正在尝试打印我的 Qweb 报告以检查格式和分为 3 个不同部分的单个 Qweb 页面

第 1 部分:显示发票清单详细信息
第 2 部分:银行详细信息和我们将以 MICR FONT 13B FONT
支付给 owner/tenant 的金额 第 3 部分:显示发票清单详细信息

第 1 部分和第 3 部分是通用的,在这两个部分中显示相同的发票详细信息,关于第 2 部分的详细信息将根据 我们将支付给 owner/tenant.

的不同金额

预期结果:

我有 23 个发票详细信息附在单张支票中,然后我想将我的发票详细信息分叉到不同的插槽中

sloat 1 : 在第一页显示前 10 个发票详细信息
sloat 2 : 在第二页中显示接下来的 10 个发票详细信息
sloat 3 : 在第三页显示 remaning 3 发票详细信息

如果发票总数超过 10 行,我想将我的发票详细信息分成不同的 sloat 明智页面

我从身边尝试过什么?

尝试 1: 使用计数器变量并通过迭代循环更新计数器并在 10 达到除以 0 时中断它 将此代码应用到 loping

<t t-set="count" t-value="count+1" />
    <t t-if="count%10== 0">
         <div style="page-break-after:auto;"/> 
    </t>
</t>

尝试 2:

<span t-esc="line_index+1"/> 
<t t-if="line_index+1%10 ==0"> 
    <div style="page-break-inside:auto !important;"> 
</t>

我认为你需要提供更多的上下文和信息,也许问题与你所暴露的不同。

您是否尝试过使用自定义 python 报告?

class IncrementReports(models.AbstractModel):
    _name = 'report.your_model.your_report_name'

    @api.model
    def render_html(self, docids, data=None):
        report_obj = self.env['report']
        report = report_obj._get_report_from_name(
            'your_model.your_report_name')
        docs = []
        objects = self.env[report.model].browse(docids)            
        for o in objects:              

            docs.append({...})

        docargs = {
            'doc_ids': docids,
            'doc_model': report.model,
            'docs': objects,
            'custom_docs': docs,
            'datetime': datetime.datetime,
        }
        return report_obj.render('your_model.your_report_name', docargs)

使用自定义报告,您可以创建一个函数来划分 3 个信息块,将其发送到 de docargs 内的不同变量中,并在不检查 XML 报告中的条件的情况下迭代它们。

不知道我说的清楚没有,我的英文不够好

经过多次尝试,我也从头解决了这个问题。

如果有人在你以后的发展中遇到同样的问题
以便他们也能够快速修复它。

在特定模型中创建方法:(cheque.cheque 模型)

def get_invoice_details(self, invoice_ids,cheque):
    vals,container,result,val=[],[],[],1
    invoice_no=''
    for line in invoice_ids:
        desc=''
        if line.is_vendor:
            invoice_no=line.vendor_reference
        else:
            invoice_no=line.number

        pay_amt=line.payment_ids.filtered(lambda m: m.cheque_issued_id.id ==cheque.id).amount or 0.00
        for l in line.invoice_line_ids:
            desc+=str(l.product_id.default_code)+',' or ''
        vals.append({
            'date':str(line.date_invoice),
            'invoice_no':invoice_no,
            'inv_amt':str(line.amount_total),
            'description':desc,
            'pay_amt':float(pay_amt)
        })
        invoice_no=''
    for l in vals:
        if val<=len(vals):
            container.append(l)
        if val % 9 == 0:
            result.append({'section':9,'vals':container})
            container=[]
        val+=1
    if container:
        result.append({'section':4,'vals':container})
    return result

在这个方法中,我将节键及其值设置为字典列表的结果 我们使用相同的部分来完美地分页

调用相同的方法并迭代到Qweb模板中

<t t-foreach="o.get_invoice_details(o.invoice_ids,o)" t-as="line" >
                <div class="page">
                    <div class="col-xs-12">
                                <table style="width:100%">
                                    <thead>
                                        <tr>
                                            <th>Invoice Date</th>
                                            <th>Invoice # </th>
                                            <th>Invoice Amt</th>
                                            <th>Description  </th>
                                            <th style="text-align:right">Payment Amt</th>
                                        </tr>
                                    </thead>
                                    <t t-foreach="line.get('vals')" t-as="inv">
                                    <tbody class="sale_tbody">
                                        <tr>
                                            <td>
                                                <span t-esc="inv.get('date')" />
                                            </td>
                                            <td>                                                
                                                <span t-esc="inv.get('invoice_no')" />
                                            </td>
                                            <td>
                                                <span t-esc="o.decimal_formated_amount(float(inv.get('inv_amt',0.00)))" />
                                            </td>

                                            <td>
                                                <span t-esc="inv.get('description')" />
                                            </td>
                                            <td style="text-align:right">
                                                <span t-esc="o.decimal_formated_amount2(float(inv.get('pay_amt',0.00)))" />                                             

                                       </td>
                                        </tr>               
                                    </tbody>
                                    </t>
                                </table>
                        </div>
                      <span t-if="line.get('section') % 9 == 0" style="page-break-after: always;">
                      </span>
                </div>

按照get_invoice_details()方法的业务逻辑 这是 return 列表形式的数据,然后我们可以使用相同的数据并将其呈现到 XML 模板中。

当条件满足 XML 模板时,Odoo 将自动管理分页符 系统会根据源码自动分页

希望我的回答对您有所帮助:)