Buku ini menjelaskan teknis detail pembuatan dan modifikasi Report QWeb
untuk module accounting, sales, purchase, dan inventory Odoo v10.
Buku ini cocok bagi anda yang bergerak di perusahaan yang akan
menggunakan Odoo secara langsung maupun untuk anda yang bergerak di
bidang konsultasi IT dan hendak mengimplementasikan Odoo untuk client.
• Instalasi WKHTMLTOPDF
• Report Invoice
• Text Terbilang
• Ukuran Kertas
• Watermark
• Bootstrap CSS
• Barcode QR Code
Semoga Bermanfaat!
Daftar Isi
1 Pendahuluan ........................................................................................................ 4
2 Template Addons ................................................................................................. 5
3 Instalasi WKHTMLTOPDF dan Permasalahannya ................................................. 6
4 Modifikasi Report Sale Order ............................................................................... 7
4.1 Folder Addon vit_so_sign............................................................................................. 8
4.2 Edit File __openerp__.py ............................................................................................. 8
4.3 Buat File report/so.xml untuk Modifikasi Report SO .................................................... 9
4.4 Buat File model/so.py untuk Menambah Field validate_id di SO ................................ 10
4.5 Buat File view/so.xml untuk Modifikasi Form SO ....................................................... 11
4.6 Install Addon ............................................................................................................ 11
8 Watermark ......................................................................................................... 44
8.1 Folder Addon vit_inv_watermark ................................................................................ 45
8.2 Edit file __openerp__.py ............................................................................................ 45
8.3 Copy File Gambar ke Folder Static ............................................................................ 46
8.4 Buat File report/invoice.xml untuk Modifikasi Report RFQ ......................................... 47
8.5 Install Addon ............................................................................................................ 48
1 Pendahuluan
Ebook ini tingkatnya lanjutan dari ebook fundamental development addons “5
Hari Menguak Misteri Addons Odoo v10”
Jadi di ebook ini, anda harus sudah paham caranya kalau saya bilang:
• install addons
• upgrade addons
• restart Odoo
Kalau belum, beli dulu ebook “5 Hari Menguak Misteri Addons Odoo v10” di
Google Play atau di shop.vitraining.com. Harganya cukup murah kok,
dibanding makan di McDonalds malah lebih mahal J
2 Template Addons
Biar lebih cepat dalam membuat addon baru,
download template addon dari sini:
https://github.com/akhdaniel/published_addons/tr
ee/10.0/10_addons_template
https://wkhtmltopdf.org/downloads.html
Ada banyak versi WKHTMLTOPDF. Pada saat buku ini ditulis, versi yang
terbukti jalan adalah version 0.12.1 karena versi-versi yang lebih tinggi justru
kadang-kadang tidak sempurna dalam mengkonversi HTML seperti ada
gambar yang hilang, CSS yang tidak betul posisinya.
Setelah download dan install di server tempat Odoo running, kita perlu copy
file executable wkhtmltopdf ke suatu folder yang ada di system PATH
(misalnya /usr/local/bin, /opt/local/bin). Ini diperlukan agar Odoo dapat
menemukan program wkhtmltopdf yang diperlukan.
Disini kita akan modifikasi template report SO asli Odoo dengan cara inherit
template XML QWEB. Nama template aslinya:
sale.report_saleorder_document. Info ini bisa ditemukan dari menu:
{
"name": "SO with Signature",
"version": "1.0",
"depends": [
"base",
"sale"
],
"author": "Akhmad D. Sembiring [vitraining.com]",
"website": "www.vitraining.com",
"category": "Sale",
"description": """\
Features
======================================================================
Add new tabel under SO template for signature:
* Created By
* Validated By
* Received by
""",
"data": [
"report/so.xml",
"view/so.xml",
],
"installable": True,
"auto_install": False,
}
Saat diinherit maka kita bisa akses semua elemen XML yang ada di template
aslinya dan juga semua variabel yang tersedia pada template tersebut. Salah
satu variabel yang kita perlu adalah:
doc
Search elemen di template bawaan tepat sebelum tabel tanda tangan akan
ditempatkan (yaitu oe_structure terakhir). Gunakan command xpath:
yang akan mencari elemen div dengan class oe_structure yang terakhir
ditemukan, pake last() command untuk hal ini.
Ini dilakukan karena pada template bawaan terdapat banyak div oe_structure
sehingga kita harus menentukan div mana yang mau ditunjuk yaitu div yang
terakhir.
<table class="table">
<tr>
<td>Created By</td>
<td>Validated By</td>
<td>Received By</td>
</tr>
<tr>
<td style="padding-top:3cm">
<span t-field="doc.user_id"/>
</td>
<td style="padding-top:3cm">
<span t-field="doc.validated_id"/>
</td>
<td style="padding-top:3cm">
.................
</td>
</tr>
</table>
Style padding-top di td dipake supaya baris tanda tangan agak tinggi supaya
bisa mereka kasi tanda tangan dan cap disitu nantinya.
class sale_order(models.Model):
_name = 'sale.order'
_inherit = 'sale.order'
validated_id = fields.Many2one(comodel_name="res.users",
string="Validated By", required=False, )
Disini kita inherit object sale.order dan nambah field baru namanya
validated_id yang merupakan many2one ke object res.users nya Odoo
sehingga kita bisa pilih nanti siapa yang mem-validasi SO ini.
Lanjut.
import so
Isinya adalah proses inherit dari form XML sale order bawaan Odoo yang
namanya sale.view_order_form.
Lalu kita cari field yang namanya user_id dan pada posisi setelahnya kita
tambah field validated_id.
Lalu pada report SO akan terdapat tambahan kolom tanda tangan,…
Done!
Hasil print outnya sbb:
Disini kita pake format ukuran kertas tersendiri yaitu ½ A4 landscape.
{
"name": "Print Invoice Receipt",
"version": "1.0",
"depends": [
"base",
"account"
],
"author": "Akhmad D. Sembiring [vitraining.com]",
"website": "www.vitraining.com",
"category": "Accounting",
"description": """\
Features
======================================================================
""",
"data": [
"report/invoice.xml",
],
"installable": True,
"application": True,
"auto_install": False,
}
/>
<template id="receipt_report_document">
<t t-call="report.external_layout">
<t t-set="doc"
t-value="doc.with_context({'lang':doc.partner_id.lang})" />
<div class="page">
<h1>
RECEIPT
</h1>
<p>
Sudah terima dari <span t-field="doc.partner_id"/>
uang sebesar <span t-field="doc.amount_total"/>
(<i><span t-field="doc.amount_to_text"/></i>)
untuk pelunasan invoice no <span t-field="doc.number"/>.
</p>
<p>
Bandung, <t t-esc="time.strftime('%d %b %Y')"/>
</p>
<p>
Yang menerima,
</p>
<p style="padding-top:2cm">
...............
</p>
</div>
</t>
</template>
<template id="receipt_report">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="vit_inv_receipt.receipt_report_document"
t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
</data>
</openerp>
Tag ini:
<report
id="report_receipt_menu"
string="Receipt"
model="account.invoice"
report_type="qweb-pdf"
file="account.invoice"
name="vit_inv_receipt.receipt_report"
/>
gunanya untuk membuat action report baru dengan label Receipt untuk
object account.invoice sehingga akan muncul tombol Receipt pada waktu kita
buka form invoice…
atau saat select beberapa record invoice pada tree view invoice…
Waktu di-click menu report Receipt maka Odoo akan memproses template
XML yang namanya vit_inv_receipt.receipt_report dan men-generate file PDF
yang siap didownload.
<template id="receipt_report">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="vit_inv_receipt.receipt_report_document"
t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
waktu dipanggil, template ini akan melakukan looping foreach untuk setiap
record Invoice yang mau diprint. Pada framework QWeb Odoo, records
Invoice yang akan diprint tersebut tersimpan di dalam variabel list docs.
Walaupun cuma 1 record, bentuknya tetap list sehingga harus dilooping
dengan foreach.
Pada setiap looping kita punya variabel doc yang merupakan representasi dari
1 record Invoice yang akan diprint.
<template id="receipt_report_document">
<t t-call="report.external_layout">
<t t-set="doc"
t-value="doc.with_context({'lang':doc.partner_id.lang})" />
<div class="page">
<h1>
RECEIPT
</h1>
<p>
Sudah terima dari <span t-field="doc.partner_id"/>
uang sebesar <span t-field="doc.amount_total"/>
(<i><span t-field="doc.amount_to_text"/></i>)
untuk pelunasan invoice no <span t-field="doc.number"/>.
</p>
<p>
Bandung, <t t-esc="time.strftime('%d %b %Y')"/>
</p>
<p>
Yang menerima,
</p>
<p style="padding-top:2cm">
...............
</p>
</div>
</t>
</template>
Lalu kita definisikan property bahasa pada variabel doc agar sesuai dengan
bahasa partner invoice terkait.
Lalu kita buat div class page yang akan berisi elemen yang akan dimunculkan
pada kwitansi, mulai dari judulnya “RECEIPT”, sampai dengan tanda tangan.
Sederhana saja, kita cuma pake elemen <div>, <p>, dan <h1> standard
HTML untuk menampilkan isi dokumen kwitansi.
Selain itu kita tampilkan juga code python time.strftime('%d %b %Y') untuk
menampilkan tanggal hari ini dengan format “02 Jan 2017”
class invoice(models.Model):
_name = 'account.invoice'
_inherit = 'account.invoice'
@api.depends('amount_total','currency_id')
def _amount_to_text(self):
for record in self:
record.amount_to_text =
amount_to_text_en.amount_to_text(
record.amount_total, 'id', record.currency_id.name)
amount_to_text = fields.Char(compute='_amount_to_text',
string="amount text", required=False, )
import invoice
Hasilnya, muncul tombol Receipt di bawah tombol Print pada halaman form
Invoice.
Waktu diklik, muncul report kwitansi seperti yang didefinisikan…
Kita perlu ganti ukuran kertasnya agar jadi ½ A4 dan landscape. Nanti setelah
ini..
</record>
Tag ini:
gunanya untuk membuat record Paper Format di Odoo. Nanti akan muncul
paper format baru dari menu Settings – Technical – Reports – Paper Format.
Disini kita definisikan ukuran kertas A5, orientasi landscape, margin atas
bawah kiri kanan, spasi dengan header dan footer, serta DIP (dot per inch)
yaitu tingkat ketajaman hasil cetakan.
Tag ini:
Tag ini:
gunanya untuk mendefinisikan ulang menu action report di atas dengan men-
set print_report_name untuk membentuk nama file PDF yang dihasilkan
menjadi:
Dilihat di menu:
Saya ada pernah lihat di internet ada yang udah pernah bikin library seperti
itu, kalau tidak salah buatan salah satu master Odoo Indonesia, bang
Muhammad Azis… cari aja namanya di google ntar pasti ketemu blognya J
Disini kita akan membuat report QWeb inherit dari template asli RFQ dengan
menambahkan kolom gambar pada tabel detail RFQ.
{
"name": "Display Image on RFQ",
"version": "1.0",
"depends": [
"base",
"purchase"
],
"author": "Akhmad D. Sembiring [vitraining.com]",
"website": "www.vitraining.com",
"category": "Purchasing",
"description": """\
Features
======================================================================
""",
"data": [
"report/rfq.xml",
],
"application": True,
"installable": True,
"auto_install": False,
}
</tr>
</tbody>
</table>
</xpath>
</template>
</data>
</openerp>
Pada coding di atas, kita meng-inherit template QWeb asli RFQ yang namanya
purchase.report_purchasequotation_document.
Pada template tersebut terdapat tabel yang berisi baris-baris detail produk
seperti area yang disorot di atas.
Dalam contoh addon kali ini kita akan me-replace tabel tersebut secara
keseluruhan dengan cara meng-copy paste definisi tabel aslinya kedalam
template punya kita.
Caranya seperti ini , perhatikan comman position tag <xpath> kali ini yaitu
replace.
Setelah copy-paste kedalam template kita, maka kita bisa edit isi tabel semau
kita, contohnya disini kita tambah <td> yang berisi gambar produk, yang
diambil dari variabel:
order_line.product_id.image
<td>
<img t-att-src="'data:image/jpeg;base64,%s' % order_line.product_id.image"
style="max-height:50px" />
</td>
Atribut t-att-src adalah atribut khusus QWeb untuk memformat atribut src tag
<img> berdasarkan format string python standar:
'data:image/jpeg;base64,%s' % order_line.product_id.image
disini, atribut src dari tag <img> akan terisi dengan data image yang ter-
encode dengan base64 string yang berasal dari variabel
order_line.product_id.image.
Hasilnya, print out RFQ akan berubah yaitu ada tambahan kolom gambar
pada tabel detail produk.
7 Account Move
Addon berikutnya yang mau dibuat adalah mendefinisikan report baru dan
inherit object Account Move untuk bisa mencetak Voucher Journal Entry.
Waktu di-klik muncul report Voucher Journal Entry seperti ini dimana muncul
semua detail data Journal Entry seperti di layar dan juga ada tambahan
kolom tanda tangan di bawahnya.
{
"name": "Print Journal Voucher",
"version": "1.0",
"depends": [
"base",
"account"
],
"author": "Akhmad D. Sembiring [vitraining.com]",
"website": "www.vitraining.com",
"category": "Accounting",
"description": """\
Features
======================================================================
""",
"data": [
"report/account_move.xml",
],
"installable": True,
"application": True,
"auto_install": False,
}
<template id="report_account_move_document">
<div class="page">
<div class="row">
<div class="col-xs-3">Number</div>
<div class="col-xs-3"><span t-field="doc.name"/></div>
<div class="col-xs-3">Journal</div>
<div class="col-xs-3"><span t-field="doc.journal_id"/></div>
</div>
<div class="row">
<div class="col-xs-3">Date</div>
<div class="col-xs-3"><span t-field="doc.date"/></div>
<div class="col-xs-3">Reference</div>
<div class="col-xs-3"><span t-field="doc.ref"/> </div>
</div>
<p><strong>Journal Items</strong></p>
<tr>
<td class="text-right" colspan="3">Total</td>
<td class="text-right"><span t-field="doc.amount"/></td>
<td class="text-right"><span t-field="doc.amount"/></td>
</tr>
</table>
<p>
<span t-field="doc.narration"/>
</p>
<table class="table">
<tr>
<td>Created By</td>
<td>Validated By</td>
<td>Posted By</td>
</tr>
<tr>
<td style="padding-top:2cm">
<span t-field="doc.create_uid"/>
</td>
<td style="padding-top:2cm">
....................
</td>
<td style="padding-top:2cm">
....................
</td>
</tr>
</table>
</div>
</template>
<template id="account_move_report">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="vit_journal_voucher.report_account_move_document"
t-lang="doc.create_uid.lang"/>
</t>
</t>
</template>
</data>
</openerp>
Tag ini:
<report
id="report_account_move_menu"
string="Journal Voucher"
model="account.move"
report_type="qweb-pdf"
file="account.account_move"
name="vit_journal_voucher.account_move_report"
/>
gunanya untuk membuat action report baru dengan label Journal Voucher
untuk object account.move sehingga akan muncul tombol Journal Voucher
pada waktu kita buka form invoice…
atau saat select beberapa record Journal Entry pada tree view …
Waktu di-click menu report Journal Voucher maka Odoo akan memproses
template XML yang namanya vit_journal_voucher.account_move_report dan
men-generate file PDF yang siap didownload.
<template id="account_move_report">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="vit_journal_voucher.report_account_move_document"
t-lang="doc.create_uid.lang"/>
</t>
</t>
</template>
waktu dipanggil, template ini akan melakukan looping foreach untuk setiap
record Account Move yang mau diprint. Pada framework QWeb Odoo, records
Account Move yang akan diprint tersebut tersimpan di dalam variabel list
docs. Walaupun cuma 1 record, bentuknya tetap list sehingga harus dilooping
dengan foreach.
Pada setiap looping kita punya variabel doc yang merupakan representasi dari
1 record Account Move yang akan diprint.
Pada saat mengirim ke template tersebut kita tentukan bahasa yang akan
digunakan pada templat tersebut nantinya, yaitu dari atribut:
t-lang="doc.create_uid.lang"
disini kita ambil field lang (bahasa) dari field creator_id pada doc, artinya
bahasa yang akan digunakan pada template adalah bahasa user yang men-
create dokumen.
<template id="report_account_move_document">
<div class="page">
<div class="row">
<div class="col-xs-3">Number</div>
<div class="col-xs-3"><span t-field="doc.name"/></div>
<div class="col-xs-3">Journal</div>
<div class="col-xs-3"><span t-field="doc.journal_id"/></div>
</div>
<div class="row">
<div class="col-xs-3">Date</div>
<div class="col-xs-3"><span t-field="doc.date"/></div>
<div class="col-xs-3">Reference</div>
<div class="col-xs-3"><span t-field="doc.ref"/> </div>
</div>
<p><strong>Journal Items</strong></p>
<tr>
<td class="text-right" colspan="3">Total</td>
<td class="text-right"><span t-field="doc.amount"/></td>
<td class="text-right"><span t-field="doc.amount"/></td>
</tr>
</table>
<p>
<span t-field="doc.narration"/>
</p>
<table class="table">
<tr>
<td>Created By</td>
<td>Validated By</td>
<td>Posted By</td>
</tr>
<tr>
<td style="padding-top:2cm">
<span t-field="doc.create_uid"/>
</td>
<td style="padding-top:2cm">
....................
</td>
<td style="padding-top:2cm">
....................
</td>
</tr>
</table>
</div>
</template>
Pertama kita buat <div> dengan class page yang akan berisi elemen yang
akan dimunculkan pada Journal Voucher, mulai dari bagian atas dokumen
yang berisi Nomor, Jenis Journal, Tanggal, dan Reference.
<div class="row">
<div class="col-xs-3">Number</div>
<div class="col-xs-3"><span t-field="doc.name"/></div>
<div class="col-xs-3">Journal</div>
<div class="col-xs-3"><span t-field="doc.journal_id"/></div>
</div>
<div class="row">
<div class="col-xs-3">Date</div>
<div class="col-xs-3"><span t-field="doc.date"/></div>
<div class="col-xs-3">Reference</div>
<div class="col-xs-3"><span t-field="doc.ref"/> </div>
</div>
Perlu diketahui, Odoo QWeb menggunakan CSS dari Bootstrap baik untuk
print out maupun web portal, dan sudah by default diaktifkan sehingga kita
tinggal gunakan class CSS Bootstrap yang kita perlukan.
Contoh di atas kita gunakan class CSS col-xs-3 untuk membuat ukuran dari
<div> adalah 3 bagian dari 12 bagian layar yang didefinisikan di Bootstrap,
dimulai dari ukuran layar yang paling kecil (xs = extra small). Untuk layout
QWeb reporting kita gunakan ukuran layar xs ini.
<p><strong>Journal Items</strong></p>
Tag di atas untuk memunculkan judul tabel “Journal Items” dengan font bold.
Lalu dilanjut dengan definisi <table> dan header tabel <tr> yang berisi judul
kolom-kolom tabel nantinya.
Lanjut…
<tr>
<td class="text-right" colspan="3">Total</td>
<td class="text-right"><span t-field="doc.amount"/></td>
<td class="text-right"><span t-field="doc.amount"/></td>
</tr>
</table>
Disitu kita gunakan perintah QWeb t-foreach untuk me-looping tag <tr> yang
berisi data <td>. Looping dilakukan untuk setiap record yang ada pada field
line_ids yang ada pada variabel doc. Hal ini didefinisikan oleh atribut t-
foreach
Untuk setiap looping, kita punya variabel lokal namanya line yang ditentukan
pada atribute t-as. Variabel line merupakan representasi dari Account Move
Line yang terdapat pada Account Move, sehingga kita bisa langsung keluarkan
isi fieldnya, misalnya dengan line.account_id, line.partner_id, dan seterusnya.
Pada kolom Debit dan Credit, <td> kita tambahi atribut class=”text-right”. Ini
adalah class Bootstrap untuk membuat kolom tabel menjadi rata kanan.
Tag berikutnya…
<p>
<span t-field="doc.narration"/>
</p>
Sederhana saja, cuma mengeluarkan isi field narration pada variabel doc di
dalam tag <p>.
<table class="table">
<tr>
<td>Created By</td>
<td>Validated By</td>
<td>Posted By</td>
</tr>
<tr>
<td style="padding-top:2cm">
<span t-field="doc.create_uid"/>
</td>
<td style="padding-top:2cm">
....................
</td>
<td style="padding-top:2cm">
....................
</td>
</tr>
</table>
Tag ini hanya <table> HTML biasa yang menampilkan kolom-kolom tanda
tangan yang salah satunya adalah field create_uid.
Tag ini:
gunanya untuk membuat record Paper Format di Odoo. Nanti akan muncul
paper format baru dari menu Settings – Technical – Reports – Paper Format.
Disini kita definisikan ukuran kertas custom ukuran 150x210 mm, orientasi
portrait, margin atas bawah kiri kanan, spasi dengan header dan footer, serta
DIP (dot per inch) yaitu tingkat ketajaman hasil cetakan.
Untuk mengubah posisi symbl currency, nggak perlu lewat QWeb, tapi cukup
definisi data currency nya saja.
Masuk ke menu:
8 Watermark
Addon berikutnya yang mau dibuat adalah modifikasi print out report Invoice
untuk menampilkan gambar watermark di belakang dokumen ketika statusnya
Draft, Open, dan Paid.
Disini kita akan membuat report QWeb inherit dari template asli Invoice
dengan menambahkan gambar dengan style CSS tertentu sesuai dengan
status invoice tersebut.
Ketika status Invoice sudah Paid:
Ketika status Invoice Open, tidak ada gambar watermark.
{
"name": "Add Watermark Image on Invoice",
"version": "1.0",
"depends": [
"base",
"account"
],
"author": "Akhmad D. Sembiring [vitraining.com]",
"website": "www.vitraining.com",
"category": "Accounting",
"description": """\
Features
======================================================================
""",
"data": [
"report/invoice.xml",
],
"installable": True,
"application": True,
"auto_install": False,
}
Untuk hal ini, kita perlu copy 2 gambar tersebut ke folder khusus di addon
yang namanya “static”. Folder ini disiapkan oleh Odoo untuk menyediakan file
dan folder yang sifatnya statik (tidak berubah-ubah semalanya) seperti file
gambar, Javascript library, dan CSS. Semua file dan folder yang berada di
dalam folder static secara otomatis dapat diakses via browser, contohnya:
http://nama_server/nama_addons/static/namafile.png
http://bit.ly/vitraining-qweb
ambil file:
• draft.png
• copy.png
• http://nama_server/static/src/img/draft.png
• http://nama_server/static/src/img/copy.png
<t t-if="o.state=='paid'">
<div
style="top:0px;position:absolute;opacity:0.25;width:100%;text-align:center;z-
index:1000;">
<img src="/vit_inv_watermark/static/src/img/copy.png"/>
</div>
</t>
</xpath>
</template>
</data>
</openerp>
Pada template di atas, kita meng-inherit template Invoice bawaan Odoo yang
namanya account.report_invoice_document dengan mencari elemen XML yang
namanya “page” dan menyisip sesuatu di dalam elemen tersebut
menggunakan atribut “inside”.
Yang kita sisip adalah file gambar menggunakan tag <img> dengan alamat
file masing-masign gambar yaitu:
• /vit_inv_watermark/static/src/img/draft.png
• /vit_inv_watermark/static/src/img/copy.png
Tag <img> ditempatkan pada tag <div> dengan style khusus yaitu:
Tag ini:
<t t-if="o.state=='draft'">
dan:
<t t-if="o.state=='paid'">
Hasilnya, print out Invoice akan berubah yaitu ada tambahan gambar
watermark DRAFT atau COPY tergantung dari status Invoice saat ini.
• /report/html/<nama_addons>.<xml_report_id>/<record_id>
• /report/pdf/<nama_addons>.<xml_report_id>/<record_id>
Disni:
http://localhost:8069/report/html/account.report_invoice/10
Munculnya…
Jika diakses melalui :
http://localhost:8069/report/pdf/account.report_invoice/10
Maka muncul dokument PDF yang bisa dilihat langsung di layar browser
tanpa download dulu…
Muncul semua view XML Odoo termasuk report, form, tree, search, dan
lainnya…
Untuk mencari view QWeb saja, filter yang jenis QWeb saja. Lalu cari nama
report yang mau kita liat, misalnya “invoice”.
Fokuskan ke view yang tidak ada Inherited View nya, artinya dia adalah murni
bawaan Odoo dan bukan hasil inherit dan view lain. Ada 2 keliatan..
• report_invoice
• report_invoice_document
Baris yang disorot di atas menunjukkan bagaiman template ini memanggil
template lain yaitu account.report_invoice_document.
/report/barcode/?type=Code128& value=1234&width=400&height=70
Disini:
• type jenis barcode yang mau dihasilkan, lihat di bawah ini tabel
jenisnya
• value nilai yang mau dijadikan barcode misalnya kode barang, nomor
dokumen, URL dan sebagainya.
Code11
Code128
EAN13
EAN8
Extended39
Extended93
FIM
I2of5
MSI
POSTNET
QR
Standard39
Standard93
UPCA
USPS_4State
Lanjut. Addon yang mau dibuat adalah print out report Sale Order yang
dilengkapi dengan barcode yang berisi nomor SO.
Penampakannya…
{
"name": "Display Barcode on SO Report",
"version": "1.0",
"depends": [
"base",
"sale"
],
"author": "Akhmad D. Sembiring [vitraining.com]",
"website": "www.vitraining.com",
"category": "Sale",
"description": """\
Features
======================================================================
""",
"data": [
"report/so.xml",
],
"application": True,
"installable": True,
"auto_install": False,
}
Disini kita buat XML template baru yang inherited dari template report SO
bawaan Odoo yang namanya sale.report_saleorder_document.
Lalu kita cari elemen <h2> pada template tersebut dan kita sisipak sesuatu di
dalamnya dengan atribut “inside”.
Yang kita sisipkan kedalam <h2> adalah sebuah <div> yang berisi <img>
yang atribut src-nya adalah URL untuk membentuk gambar barcode dengan
parameter tertentu.
• kita buat ukurannya 3 bagian dari 12 bagian kertas yaitu dengan class
Bootstrap col-xs-3
• lalu kita buat dia merapat ke kanan dengan class Bootstrap pull-right.
o /report/barcode
o type=QR
o value=/report/html/sale.report_sale_order/#{doc.id}
o width=100
o height=100
Kerena kita menggunakan atribut t-attf-src maka isi dari atribut tersebut
boleh berisi syntax string format python, contohnya disini kita pakai #{doc.id}
yang jika dieksekusi akan mengeluarkan isi variabel doc.id dimana doc adalah
representasi dari record SO yang sedang diprint.
Disini kita akan melakukan looping sub report dalam satu halaman report
utama. Contohnya kita akan mencetak 6 label dalam 1 lembar kertas.
Jadi dalam satu lembar kertas kita keluarkan 6 label yang berisi nama dan
alamat partner. Jika diprint di kertas stiker maka kita tinggal kupas dan
tempelkan di amplop atau paket untuk pengiriman dokumen atau barang ke
partner.
Kalau dilihat, setiap label isinya sama semua. Supaya tidak mengulang
definisi coding untuk layout label, kita akan menggunakan t-call untuk
memanggil sub report template label tersebut pada report utama.
{
"name": "Print Invoice Label",
"version": "1.0",
"depends": [
"base",
"account"
],
"category": "Accounting",
"author": "akhmad.daniel@gmail.com [vitraining.com]",
"category": "Accounting",
"website": "www.vitraining.com",
"description": """\
Manage
======================================================================
""",
"data": [
"report/invoice.xml",
],
"application": True,
"installable": True,
"auto_install": False,
}
<template id="label_report_document">
<t t-set="doc" t-value="doc.with_context({'lang':doc.partner_id.lang})" />
<div class="page">
<t t-foreach="range(6)" t-as="i">
<t t-call="vit_inv_label.label"/>
</t>
</div>
</template>
<template id="label_report">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="vit_inv_label.label_report_document"
t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
<template id="label">
<div class="panel panel-default col-xs-6" >
<div class="panel-body">
<span t-field="doc.partner_id"/><br/>
<span t-field="doc.partner_id.street"/>
<span t-field="doc.partner_id.street2"/><br/>
<span t-field="doc.partner_id.city"/><br/>
<span t-field="doc.partner_id.state_id"/>
<span t-field="doc.partner_id.zip"/><br/>
<span t-field="doc.partner_id.country_id"/><br/>
</div>
</div>
</template>
</data>
</openerp>
Tag ini…
<report
id="report_label_menu"
string="Label"
model="account.invoice"
report_type="qweb-pdf"
file="account.invoice"
name="vit_inv_label.label_report"
/>
gunanya untuk membuat action report baru dengan label Label untuk object
account.invoice sehingga akan muncul tombol Label pada waktu kita buka
form Invoice… sepert ini:
atau saat select beberapa record invoice pada tree view invoice… seperti ini:
Waktu di-click menu report Label maka Odoo akan memproses template XML
yang namanya vit_inv_label.label_report dan men-generate file PDF yang siap
didownload.
<template id="label_report">
<t t-call="report.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="vit_inv_label.label_report_document"
t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>
waktu dipanggil, template ini akan melakukan looping foreach untuk setiap
record Invoice yang mau diprint. Pada framework QWeb Odoo, records
Invoice yang akan diprint tersebut tersimpan di dalam variabel list docs.
Walaupun cuma 1 record, bentuknya tetap list sehingga harus dilooping
dengan foreach.
Pada setiap looping kita punya variabel doc yang merupakan representasi dari
1 record Invoice yang akan diprint.
<template id="label_report_document">
<t t-set="doc" t-value="doc.with_context({'lang':doc.partner_id.lang})" />
<div class="page">
<t t-foreach="range(6)" t-as="i">
<t t-call="vit_inv_label.label"/>
</t>
</div>
</template>
Disini kita definisikan property bahasa pada variabel doc agar sesuai dengan
bahasa partner invoice terkait.
Setelah itu kita lalkukan looping foreach sebuah list yang kita bentuk
menggunakan command Python range(6) yang hasilnya adalah list seperti ini:
[0,1,2,3,4,5]
Pada setiap looping, kita panggil lagi template lain menggunakan t-call, yang
namanya adalah vit_inv_label.label. Ini yang kita sebut sebagai sub report.
<template id="label">
<div class="panel panel-default col-xs-6" >
<div class="panel-body">
<span t-field="doc.partner_id"/><br/>
<span t-field="doc.partner_id.street"/>
<span t-field="doc.partner_id.street2"/><br/>
<span t-field="doc.partner_id.city"/><br/>
<span t-field="doc.partner_id.state_id"/>
<span t-field="doc.partner_id.zip"/><br/>
<span t-field="doc.partner_id.country_id"/><br/>
</div>
</div>
</template>
Layout template label kita buat sederhana saja, yaitu cuma tag <span>
dengan isi diambil dari t-field untuk menampilkan isi field alamat partner
seperti street, street2, city, dan seterusnya.
Hasilnya, muncul tombol Label di bawah tombol Print pada halaman form
Invoice.
Waktu diklik, muncul report label seperti yang didefinisikan…
Untuk hal ini kita bisa gunakan atribut t-field-options pada field yang
jenisnya date time, seperti contoh:
<span t-field="object.depart_date"
t-field-options='{"format": "d MMM y HH:mm"}'/>
http://www.unicode.org/reports/tr35/tr35-
dates.html#Date_Format_Patterns
Untuk memformat data numerik tersebut, kita bisa gunakan format standard
Python seperti ini:
<span t-esc="'{:,}'.format(schedule['adult_price'])"/>
10,000,000.0
https://github.com/akhdaniel/vitraining_qweb/tree/10.0
14 Penutup
Semoga buku ini bisa menjadi panduan lengkap anda dalam melakukan
pembuatan dan pemrograman report QWeb di Odoo 10 baik untuk
perusahaan sendiri maupun untuk perusahaan client anda.
Jika ada pertanyaan atau saran boleh kirim email ke saya langsung supaya
buku ini menjadi lebih sempurna.
Jangan lupa untuk gabung ke milis ini agar mudah berdiskusi jika ada
kesulitan.
buku-openerp-vitraining+subscribe@googlegroups.com
http://groups.google.com/d/forum/buku-openerp-vitraining
15 Tentang Penulis
PENDIDIKAN:
PENGALAMAN:
2017 Implementasi Odoo doQar.com mobile advertising, Odoo as the backend
for GPS and OBD-II based mobile advertising system
2016 Implementasi Odoo MRP Defasindo Kreasi Prima, Odoo Purchase,
Sales, Inventory, Accounting, MRP, and HR implementation for garment
industry.
2015 Implementasi Odoo CRM Reliance Grup, Odoo CRM implementatio for
capturing data from various Reliance business unit into one single data
repository server to be used for further marketing strategies.
2015 Implementasi Odoo Lucas Djaya and Marin Liza, Odoo for pharmaceutical
industry, implementing complex MRP, Purchase, and Warehouse for
production planning and inventory control system.
2014 Implementasi Odoo Mutif, Odoo for garment business, purchase,
manufacturing, sales, accouting.
2014 Implementasi Odoo Koperasi Karyawan Freeport Indonesia, Odoo for
garment business, point of sales antar cabang, movement antar gudang,
purchase, sales, accounting.
2013 Mobile Sales, Logistic, and Support, for Surya Manggala Informatika,
aplikasi mobile Android dan Grails server untuk mobile sales, logistic,
and engineer support
2013 Implementasi Odoo Tiket.com, integrasi portal e-commerce tiket.com
dengan Odoo untuk menghasilkan invoice, payment, journal sesuai
dengan tipe barang, pembayaran, discount, dan partner.
2013 Pasific Prestress Indonesia PT, implementasi Odoo untuk modul HRD, data
karyawan, recruitment, payroll, perhitungan lembur sesuai dengan
peraturan Menteri Tenaga Kerja, import data absensi fingerprint.
2012 Asiades, Furniture Distributor Company, Dubai, UAE. Odoo implementation
and customization for furniture distributor company, implementation of
down payment journal where the Company can track Down Payment prior
to invoice creation, and when the invoice is paid, the Down Payment is
taken into account so the payment will be done only by the outstanding
amount.
2012 SAGE Petroleum, Ghana, Africa: Odoo implementation and customization
for petroleum distribution company for Product Discount Journal,
Nominal Discount Entry, Discount per Customer per Product database,
Analytical Account Setup, and Government Subsidized Product Sales
Journal, project management, bill of material product costing based on
raw material total cost
2012 Sunberry LZE and Breezer Petroleum Card System: Odoo implementation
and customization to integrate to Petro Plus Card Management system
for maintaining the loyalty card system, postpaid and prepaid card for
petroleum payment system, project management
2011 Pengembangan aplikasi eBengkel untuk PT Pendopo Multikarya, aplikasi
akuntansi untuk bisnis bengkel online.
2011 Pengembangan aplikasi XLS Report Generator for Deutsche Bank,
bekerjasama dengan PT Skyworx Indonesia
2011 Pengembangan aplikasi Mobile Survey System berbasis Android untuk
aplikasi Loan Originating System, Bank Muamalat, bekerjasama dengan
PT Skyowrx Indonesia
2011 SAGE Operational Management System
Membangun sistem management inventory bahan bakar minyak untuk
SAGE Petroleum Limited, Ghana, Africa.
2011 Fixed Asset Management System Rabobank International Indonesia
Membangun system management fixed asset, procurement, dan
inventory untuk PT Rabobank International Indonesia.
2011 MyPushme.com
Membangun sistem sinkronisasi data contact, email, picture antara
mobile devices berbasis Symbian, Android, iPhone, dan Windows Mobile
dengan MS Outlook, Gmail, Yahoo, POP3/IMAP, untuk Sunberry Limited,
Ghana, Africa.
2010 Kukuloba.com
Membangun sistem portal diskon. Website ini merupakan media dimana
pelaku usaha dapat mengiklankan produk dan jasa secara gratis dengan
cara memberikan diskon yang menarik dan menentukan jumlah minimal
penjualan yang Anda inginkan. Disini kami menggunakan sistem
penawaran harga diskon dalam batas waktu 24 jam. Artinya, harga
diskon hanya akan berlaku jika jumlah minimal penjualan terpenuhi
dalam jangka waktu tersebut. Jika belum terpenuhi maka penawaran
diskon itu otomatis tidak berlaku.
2010 GPS Tracking Indonesia
Membangun sistem pelacak kendaraan berbasis GPS dan GSM untuk
memantau posisi kendaraan secara realtime melalui web dan mobile
device.
2009 Ligarwangi.com
Membangun sistem toko online ligarwangi.com yang dapat menerima
pembayaran melalui transfer bank BCA, Mandiri, dan BNI, serta
pembayaran melalui Credit Card melalui PayPal. Sistem ini dibangun
menggunakan Zen Cart.
2009 IALF Jakarta
PENGALAMAN MENGAJAR :
2008 Kementerian Negara BUMN
Pelatihan aplikasi Portal Executive Information System untuk 139 BUMN
seluruh Indonesia
2006 PT ASDP Indonesia Ferry
Training HTML , PHP, MySQL tahap II untuk calon staf IT PT ASDP
seluruh Indonesia.
PUBLIKASI
2014 OpenERP 7.0 Untuk Bisnis Retail di Indonesia: Strategi Implementasi,
Akhmad Daniel Sembiring, Google Play Store Books.
https://play.google.com/store/books/details?id=lPQrBQAAQBAJ
2014 5 Hari Menguak Misteri Addons Odoo 7.0, Akhmad Daniel Sembiring,
Google Play Store Books.
https://play.google.com/store/books/details?id=uAKABAAAQBAJ
2001 Apache Web Server, Onno W. Purbo & Akhmad Daniel Sembiring, PT Elex
Media, Jakarta
2000 Sistem Operasi Linux Redhat, Onno W. Purbo & Akhmad Daniel
Sembiring, PT Elex Media, Jakarta
2000 Membangun Web E-Commerce, Onno W. Purbo & Akhmad Daniel
Sembiring, PT Elex Media, Jakarta
1998 Java dan JavaScript, Onno W. Purbo & Akhmad Daniel Sembiring, PT Elex
Media, Jakarta
1997 Pemrograman JavaScript, Onno W. Purbo & Akhmad Daniel Sembiring,
Infokomputer
1997 Akses Database - Web dengan CGI, Onno W. Purbo & Akhmad Daniel
Sembiring, Infokomputer