Проблема разрыва страницы на пользовательской странице проверки в Odoo 10 Qweb PDF Report - PullRequest
1 голос
/ 05 июля 2019

В последние несколько дней я сталкивался с некоторым разрывом страниц в отчете Qweb.Я пытаюсь распечатать свой отчет Qweb для формата проверки и одну страницу Qweb, разделенную на 3 различных раздела

Раздел 1. Отображение сведений в списке счетовРаздел 2: Банковские реквизиты и сумма, которую мы заплатим нашему владельцу / арендатору в MICR FONT 13B FONTРаздел 3: Отображение деталей списка счетов

разделы 1 и 3 являются общими, и отображение одинаковых деталей счетов в обоих разделах и в разделе 2 будет меняться в зависимости от разной суммы, которую мы заплатим владельцу / арендатору.

Ожидаемый результат:

У меня есть 23 детали счета-фактуры, которые прикреплены к одной проверке, затем я хочу раздвоить детали своего счета-фактуры в другой слот

ячейка 1: Показать первые 10 деталей счета на первой странице ячейка 2: Показать следующие 10 деталей счета на второй странице ячейка 3: Показать оставшиеся 3 детали счета на третьей странице

Я хочу разделить детали своего счета на другую страницу, если общее количество счетов превышает 10 строк

Что я пробовал со своей стороны?

Попытка 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>

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Я также исправил проблему с конца после того, как попробовал еще много попыток.

Если кто-то столкнется с той же проблемой в вашем будущем развитии
так что они также могут быстро это исправить.

Создать метод в конкретной модели: (модель 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 () который возвращает данные в виде списка, а затем мы можем использовать их и преобразовать в шаблон XML.

Odoo будет автоматически управлять разрывом страницы, когда условие будет соответствовать шаблону XML Система автоматически раздвоит страницу в соответствии с исходным кодом

Надеюсь, мой ответ может оказаться полезным для вас:)

0 голосов
/ 09 июля 2019

Я думаю, вам нужно предоставить немного больше контекста и информации, возможно, проблема не в том, что вы раскрываете.

Вы пытались использовать пользовательский отчет 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-х блоков информации, отправляя ее в различные переменные внутри документа и перебирая их без проверки условия в отчете XML.

Я не знаю, ясно ли я, мой английский недостаточно хорош.

...