Report PDF 10 Baris Per Halaman
Assalamualaikum Warahmatullahi Wabarakatuh.

Pada materi kali ini saya akan membagikan cara membuat report 10 baris per halaman. Versi Odoo yang saya gunakan disini adalah versi 16.

Pertama kita buat fungsi untuk memanggil nilai dari line yang kita inginkan menjadi per 10 baris:- Disini saya menggunakan object Purchase Order dan Purchase Order Line sebagai baris yang ingin saya ambil.
- Setelah itu definisikan field-field apa saja yang ingin kita ambil dan tampil ke dalam report.
- Setelah semua nilai sudah ditentukan variablenya, masukan ke dalam oder_line menggunakan append.

def purchase_pagination(self):
order_lines, vals, result, val = [],[],[],1
for rec in self.order_line:
sequence_number = rec.sequence_number
if self.po_type == 'lokal':
if rec.product_id.buy_name:
product_id = rec.product_id.buy_name
else:
product_id = rec.product_id.name
else:
product_id = rec.product_id.buy_name
nbcode = rec.product_id.default_code
description = rec.product_id.description
type = rec.product_id.buy_type
brand = rec.product_id.brand_id.name
qty_packaging = rec.qty_packaging
product_uom_qty = rec.product_uom_qty
product_uom = rec.product_uom.name
if rec.price_unit > 0:
price_unit = rec.price_unit
else:
price_unit = 0
price_subtotal = rec.price_subtotal
order_lines.append({
'sequence_number': sequence_number,
'product_id': product_id,
'description': description,
'product_uom_qty': product_uom_qty,
'product_uom': product_uom,
'price_unit': price_unit,
'price_subtotal': price_subtotal,
'nbcode': nbcode,
'type': type,
'brand': brand,
'qty_packaging': qty_packaging,
})

Setelah membuat nilai Order Linenyaa. sekarang kita buat perulangan untuk mendapatkan nilai 10 baris.

- Karena val disini saya definisikan 1. jadi jika val lebih kecil dari panjang order line maka nilai line akan di masukan ke variable vals.
- Jika hasil bagi val 10 == 0 makan kita masukan ke variable result dan definisikan section sebagai 10 untuk di xml nanti.
- Untuk section 4 saya definisikan untuk penamaan saja. intinya section hanya untuk memanggil nilai 10.

for line in order_lines:
if val <= len(order_lines):
vals.append(line)
if val % 10 == 0:
result.append({'section': 10, 'vals': vals})
vals=[]
val+=1
if vals:
result.append({'section': 4, 'vals': vals})
return result

Kedua kita implementasikan fungsi yang sudah kita buat sebelumnya sesuai dengan object tersebut ke dalam xml:
- Sebelum memanggil tablenya kita buat perulangan dengan memangil fungsi tersebut.
- Lalu isikan tbhead sesuai yang diinginkan.

<div class="border_page">
<div>
<div style="margin-top:20px">
<t t-foreach="o.purchase_pagination()" t-as="line">
<table width="100%" style="font-size: 13px; font-family: 'Arial', serif;">
<thead style="border: 2px solid black">
<tr>
<td style="text-align: center;vertical-align:middle;border-right: 2px solid black" height="40px">
<span>NO</span>
</td>
<td style="text-align: center;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<span>NAMA PRODUK</span>
</td>
<td style="text-align: center;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<span>QTY</span>
</td>
<td style="text-align: center;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<span>Satuan</span>
</td>
<td style="text-align: center;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black" width="130px">
<span>HARGA SATUAN</span>
</td>
<td style="text-align: center;vertical-align:middle;border-left: 2px solid black;" width="150px">
<span>JUMLAH</span>
</td>
</tr>
</thead>

- Setelah thead sudah terisi, kita buat perulangan lagi menggunakan nilai perulangan yang sudah kita set diatas yaitu line. dari line tersebut kita ambil nilai vals sesuai yang sudah kita implementasikan di python.
- Lalu buat dan isikan tbbody sesuai dengan parameter yang ada di order_line python.


<t t-foreach="line.get('vals')" t-as="val">
<tbody>
<tr style="border-bottom: 0px transparent;height:30px;">
<td style="text-align: center;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<t t-if="val.get('sequence_number')">
<span t-esc="val['sequence_number']" />
</t>
</td>
<td style="vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<span style="padding-left:8px">
<t t-if="val.get('product_id')">
<span t-esc="val['product_id']" />
</t>
</span>
</td>
<td style="text-align: right;padding-right: 8px;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<t t-if="val.get('product_uom_qty')">
<span t-esc="int(val['product_uom_qty'])" />
</t>
</td>
<td style="text-align: right;padding-right: 8px;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<t t-if="val.get('product_uom')">
<span t-esc="val['product_uom']" />
</t>
</td>
<td style="text-align: right;padding-right: 8px;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<t t-if="val.get('price_unit')">
<t t-esc="'{:,}'.format(int(val['price_unit']))"/>
</t>
</td>
<td style="text-align: right;padding-right: 8px;vertical-align:middle;border-left: 2px solid black;border-right: 2px solid black">
<t t-if="val.get('price_subtotal')">
<t t-esc="'{:,}'.format(int(val['price_subtotal']))"/>
</t>
</td>
</tr>
</tbody>
</t>
</table>

- Setelah tbbody sudah terisi, kita buat perulangan lagi menggunakan nilai perulangan dengan mengambil nilai line.get(‘section’) yang sudah kita set di python.
- Lalu implementasikan pagebreaknya agar menjadi terpotong saat baris 11 ke atas.

<t t-if="line.get('section')">
<t t-if="line['section'] % 10 == 0">
<table width="100%" style="border: 0px transparent">
<tr style="border-top: 2px solid black;">
<td>
&#160;
</td>
</tr>
</table>
<p style="page-break-before: always;"></p>
</t>
</t>
</t>

Hasil:



Bila ada tutur kata yang salah, saya mohon maaf. Atas perhatiannya, saya ucapkan Terima Kasih.







[REST API] Membuat Contact secara acak menggunakan Rest Api di Odoo 16