Artikel
Laporan Custom Odoo: QWeb, Spreadsheet, dan SQL View Dibandingkan
Metode pelaporan Odoo mana yang cocok untuk kebutuhan Anda? Perbandingan praktis QWeb PDF, dashboard Spreadsheet, dan SQL view, lengkap dengan panduan memilih.
- mid
- odoo
Kalau pertanyaannya adalah alat apa yang sebaiknya dipakai untuk laporan custom di Odoo, jawaban singkatnya begini. Pakai QWeb bila hasilnya berupa dokumen cetak atau yang dikirim lewat email, misalnya invoice, surat jalan, atau statement. Pakai dashboard Spreadsheet bila orang butuh angka live yang bisa difilter dan ditelusuri. Pakai model SQL view bila angkanya membutuhkan join atau agregasi yang tidak disediakan model standar Odoo. Banyak proyek nyata memakai ketiganya sekaligus.
Sebagian besar masalah pelaporan muncul karena salah memilih alat. QWeb PDF yang dipaksa menjadi dashboard akan lambat dan kaku. SQL view yang dipakai untuk membuat dokumen pelanggan yang rapi jelas alat yang salah.
Tiga pendekatan dalam satu tabel
| QWeb PDF | Dashboard Spreadsheet | Model SQL view | |
|---|---|---|---|
| Paling cocok untuk | Dokumen: invoice, penawaran, label, sertifikat | KPI live, pivot, grafik untuk manajer | Analisis lintas model, agregasi custom |
| Dibuat oleh | Developer (XML/QWeb) | Power user atau analis, tanpa kode | Developer (Python + SQL) |
| Output | PDF atau HTML, satu record atau batch | Dashboard interaktif di browser | View list, pivot, dan graph baru |
| Risiko utama | Layout rapuh, lambat untuk batch besar | Kejutan soal hak akses dan paket | Perawatan di setiap upgrade |
Laporan QWeb PDF
Mesin pelaporan Odoo dibangun di atas template QWeb, yaitu HTML dengan alur kontrol, yang dirender menjadi PDF oleh wkhtmltopdf. Menurut dokumentasi developer Odoo, sebuah laporan membutuhkan report action dan template, serta bisa menentukan paper format. Template menerima record yang dipilih sebagai docs, dan konten dibungkus dengan web.external_layout standar untuk mendapatkan header dan footer perusahaan.
Template minimal terlihat seperti ini:
<template id="report_delivery_note_custom">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="web.external_layout">
<div class="page">
<h2 t-field="doc.name"/>
</div>
</t>
</t>
</t>
</template>
Cocok untuk
- Dokumen bermerek yang dilihat pelanggan dan auditor.
- Layout yang harus mengikuti format hukum atau format yang diminta pelanggan.
- Output multi-bahasa. Dokumentasi Odoo menjelaskan cara merender dokumen dalam bahasa tertentu, misalnya bahasa partner.
- Barcode dan QR code pada label, lewat controller barcode bawaan.
Kelemahan
- Bukan alat analisis. Anda mendapat dokumen statis, bukan sesuatu yang bisa dipecah-pecah.
- Layout presisi itu rewel. wkhtmltopdf adalah mesin render yang lebih lama, sehingga CSS modern seperti flexbox dan grid tidak selalu berperilaku sesuai harapan.
- Laporan yang butuh data di luar record terpilih memerlukan model laporan custom, artinya Python.
- Batch besar (ribuan halaman) lambat. Buat di background, bukan di layar.
Perkiraan upaya: perubahan layout kecil pada dokumen standar adalah pekerjaan ringan. Dokumen custom penuh dengan data baru butuh beberapa hari. Anggap keduanya sebagai estimasi dan konfirmasikan dengan ruang lingkup Anda sendiri.
Dashboard Spreadsheet
Dashboard Odoo dibangun di atas mesin spreadsheet-nya. Dokumentasi resmi dashboard menyebutkan bahwa spreadsheet adalah fondasinya: sebuah spreadsheet diubah menjadi dashboard, dengan data source yang terhubung ke database Anda, sehingga data terbaru diambil setiap kali dashboard dibuka atau di-refresh. Filter global (periode, salesperson, pelanggan) berlaku di seluruh halaman, dan klik pada angka atau titik grafik membuka record di baliknya.
Cocok untuk
- Manajer yang ingin melihat penjualan, stok, atau keuangan tanpa menunggu developer.
- Iterasi cepat. Analis bisa mengubah pivot dalam hitungan menit.
- Drill-down dari angka ke record di baliknya, yang membangun kepercayaan pada angka tersebut.
Kelemahan
- Hak akses tetap berlaku. Dokumentasi menyatakan bahwa data difilter berdasarkan hak akses model dan record rule setiap pengguna, jadi penonton bisa melihat lebih sedikit dari yang dilihat pembuatnya. Uji dashboard dengan pengguna non-admin sungguhan sebelum diluncurkan.
- Dashboard standar dipasang ulang saat upgrade versi. Dokumentasi menyarankan untuk menduplikasi sebelum dikustomisasi, atau perubahan Anda bisa tertimpa.
- Periksa paket Anda. Pastikan app Dashboards termasuk dalam edisi dan paket Odoo Anda sebelum merancang di atasnya.
- Anda dibatasi pada data source dan measure yang bisa di-query oleh mesinnya. Join kompleks atau kalkulasi custom sering mendorong Anda ke opsi ketiga.
Model SQL view
Ketika model bawaan Odoo tidak bisa menjawab pertanyaan Anda, pendekatan developer adalah model yang didukung oleh view PostgreSQL. Panduan Odoo tentang laporan kustom menjelaskan polanya: deklarasikan model dengan _auto = False agar tabel biasa tidak dibuat, tandai field sebagai read-only, hapus view lama dengan tools.drop_view_if_exists, lalu buat view di init(). Dokumentasi menyarankan memecah query menjadi method seperti _select dan _from agar mudah dibaca.
class SaleMarginReport(models.Model):
_name = "x.sale.margin.report"
_auto = False
_description = "Sales margin by product and month"
product_id = fields.Many2one("product.product", readonly=True)
margin = fields.Float(readonly=True)
def init(self):
tools.drop_view_if_exists(self.env.cr, self._table)
self.env.cr.execute("CREATE OR REPLACE VIEW %s AS (...)" % self._table)
Hasilnya berperilaku seperti model Odoo lainnya. Ia mendapat view list, pivot, dan graph, filter, grouping, dan export, serta bisa menjadi data source untuk dashboard Spreadsheet.
Cocok untuk
- View margin, aging, utilisasi, atau valuasi stok yang menggabungkan beberapa model.
- Volume data besar, karena database yang melakukan agregasi.
- Satu definisi metrik yang disepakati dan dipakai ulang oleh semua dashboard.
Kelemahan
- Ini adalah kode. Seseorang harus memilikinya, mengujinya, dan memperbaruinya di setiap upgrade besar Odoo ketika tabel di baliknya berubah.
- Dokumentasi Odoo menjelaskan dua cara mengisi view: meng-override
init(), yang disajikan sebagai opsi standar, atau menetapkan_table_query. View yang bergantung pada konteks, seperti konversi multi-company atau multi-currency, mudah salah ditangani, jadi ujilah dengan teliti. - SQL mentah melewati sebagian perilaku ORM. Periksa apakah record rule dan pembatasan multi-company tetap berlaku bagi pengguna Anda.
Cara memilih
- Apakah outputnya dokumen yang dicetak, ditandatangani, atau diemail? QWeb.
- Apakah orang perlu menjelajahi angka dan memfilternya? Mulai dengan dashboard Spreadsheet di atas model standar.
- Apakah pertanyaannya butuh data yang tidak bisa di-join atau diagregasi model standar? Buat SQL view, lalu letakkan dashboard di atasnya.
- Apakah ini pertanyaan sekali pakai? Ekspor pivot view ke spreadsheet. Tidak semuanya perlu dibangun.
Pola yang sehat dan umum: SQL view untuk definisi metrik, dashboard untuk tampilan harian, dan QWeb hanya untuk paket bulanan yang dikirim ke dewan direksi atau bank.
Kesalahan yang sering kami lihat
- Membuat laporan QWeb untuk menjawab “apa yang terjadi kuartal lalu?”, lalu menambah filter satu permintaan demi satu permintaan.
- Mengkustomisasi dashboard standar langsung di tempat dan kehilangan perubahan saat upgrade berikutnya.
- Melewatkan uji dengan non-admin, lalu menemukan bahwa tim sales melihat grafik kosong.
- Menulis SQL view tanpa pemilik dan tanpa uji upgrade.
Langkah berikutnya
Jika Anda sedang menimbang opsi-opsi ini untuk setup Odoo Anda, kami senang membahasnya bersama. Percakapan tanpa biaya dengan Teknologia Solutions dapat membantu memetakan laporan mana yang cocok di alat mana, serta perkiraan biaya membangun dan merawatnya. Tanpa kewajiban, dan jika jawabannya adalah “pakai laporan standar”, kami akan mengatakannya.
Sumber: Dokumentasi developer Odoo, laporan QWeb; Dokumentasi Odoo, Dashboards; Dokumentasi developer Odoo, Create customized reports. Fitur, edisi, dan harga berubah antar versi Odoo. Verifikasi dengan dokumentasi Odoo terbaru dan paket Anda sendiri sebelum memutuskan.