Reporting in OpenERP (WEBKIT)

Pada kesempatan sebelumnya kita telah membahas tentang pembuatan report menggunakan RML pada OpenERP, pada kesempatan kali ini saya ingin membahas pembuatan report menggunakan webkit, kelebihannya webkit menggunakan syntax html sehingga kita bisa leluasa dengan mengikutsertakan CSS. Modul yang saya gunakan pada tutorial kali ini adalah lanjutan dari modul tutorial “Pembuatan Wizard OpenERP”.

Sebelum kita mulai, ada beberapa hal yang perlu dikonfigurasi, yaitu :

1. Install library wkhtmltopdf, (silahkan googling :D)
2. Install modul base_headers_webkit & report_webkit
3. Khusus v6.1, set path webkit, explore db openerp (pake pgadmin, dll), lalu tambahkan 1 record ditabel ir_config_parameter dengan field key = webkit_path & field value = /usr/binwkhtmltopdf

OK, jika telah selesai maka kita siap untuk membuat report dengan webkit.

Hal pertama yang kita lanjutkan adalah membuat file xml wizard_report.xml yang kita isi dengan code :

        <report id="report_sale_bulan"  string="Sale Monthly Report"
            model="sale.order" name="sale.bulan"
            file="stg_wizard/report/report_sale_webkit.mako"
            report_type="webkit" auto="False" menu="False"/>

Yang membedakan dengan report RML adalah value dari parameter report_type, yaitu webkit. Jangan lupa kita tambahkan file wizard_report.xml ini pada file __openerp__.py

Lalu kita isi method dari event button yang ada pada interface wizard, dengan code :

        datas = {'ids': context.get('active_ids', [])}
        datas['model'] = 'coba.wizard'
        datas['form'] = self.read(cr, uid, ids)[0]
        report = 'sale.bulan'
                       
        month = datas['form']['month']
        year = datas['form']['year']
        num_days = calendar.monthrange(year, month)[1]
       
        date_from = datetime.date(year, month, 1)
        date_to = datetime.date(year, month, num_days)
       
        datas['form']['date_from'] = str(date_from)
        datas['form']['date_to'] = str(date_to)
               
        return {
            'type': 'ir.actions.report.xml',
            'report_name': report,
            'report_type': 'webkit',
            'datas': datas,
        }

Pada method diatas, kita membuat sebuah dictionary dengan beberapa key yaitu, ids, model, & form. Ketiga parameter itu wajib kita buat untuk setiap pembuatan report pada OpenERP. Isi dari masing-masing key, diantaranya :

ids = id dari record yang sedang active
model = nama tabel/object dari wizard yang bersangkutan
form = nilai/value dari interface yang diinput oleh user

Key form memiliki value berbentuk dictionary, karna interface wizard tersebut memiliki banyak field/kolom isiian. Diantaranya adalah month, year, & customer. Karna pada transaksi sales order tidak ada parameter bulan, yang ada hanya tanggal, maka kita harus menambahkan value tanggal yang menggambarkan bulan dari pilihan user. Yaitu dengan syntax :

        month = datas['form']['month']
        year = datas['form']['year']
        num_days = calendar.monthrange(year, month)[1]
       
        date_from = datetime.date(year, month, 1)
        date_to = datetime.date(year, month, num_days)
       
        datas['form']['date_from'] = str(date_from)
        datas['form']['date_to'] = str(date_to)

Kemudian kita buat folder report beserta file-file yang ada didalamnya. DIantaranya file __init__.py, report_sale.py, & file inti dari report yaitu report_sale_webkit.mako.

Untuk file __init__.py kita isi dengan mengimport file report_sale.py, lalu kita isi file report_sale.py dengan syntax :

class ReportStatus(report_sxw.rml_parse):
    def __init__(self, cr, uid, name, context=None):
        super(ReportStatus, self).__init__(cr, uid, name, context=context)
        self.localcontext.update({
            'time': time,
            'bulan': self.bulan,
            'get_result': self.get_result,
        })
      
    def bulan(self, form):
        bulan = [0, 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember']
        period = bulan[form['form']['month']] + ' ' + str(form['form']['year'])
        return  period
             
    def get_result(self, form):           
        sale_id = self.pool.get('sale.order').search(self.cr, self.uid, [('partner_id','=',form['form']['partner_id'][0]), ('date_order','>=', form['form']['date_from']), ('date_order','<=', form['form']['date_to'])])
        data = self.pool.get('sale.order').browse(self.cr, self.uid, sale_id)                                    
        return data
   
report_sxw.report_sxw('report.sale.bulan', 'sale.order', 'addons/stg_wizard/report/report_sale_webkit.mako', parser = ReportStatus)

Pada syntax diatas, kita melemparkan 2 method yaitu bulan() & get_result(). Method bulan() digunakan untk informasi period dari data yang ditampilkan, sedangkan method get_result() kita gunakan untuk memfilter data sesuai dengan yang telah ditentukan oleh user.

Yang terakhir adalah file report_sale_webkit.mako, sepertinya temen-teman sudah mahir & jago html, jadi mungkin tidak perlu saya jelaskan ya 😀 ….


<html>
<head>
<style>
.table
	{
	font-size:10px;
	}
	
#header2 th
	{
	border-bottom:1px solid #000;
	}
.total1 td
	{
	border-top:1px dashed #000;
	}
.total2 td
	{
	border-top:2px solid #000;
	}
.subhead td
	{
	border-bottom:1px solid #D1D1D1;
	}
	
.sign td
	{
	font-size:8px;
	border:1px solid #000;
	}
	
table, td, th
	{
	border-collapse:collapse;
	}
	
</style>
</head>
<body>
	<table width="100%">
		<tr>
			<th style='min-width:80%; font-size:12pt' colspan="9" align="center">Monthly Report Sales Orders</th>
		</tr>
		<tr>
			<th align="center">${bulan(data)}</th>
		</tr>
	</table>
	
	<table class='table' width="100%" cellspacing="0" cellpadding="3px">
		<tr>
			<td colspan="12" style="border-bottom:5px double #000;"></td>
		</tr>
		<tr id="header2">
			<th align="left">Product Code</th>
			<th align="left">Product Name</th>
			<th align="left">Quantity</th>
			<th align="right">Unit Price</th>
			<th align="right">Subtotal</th>
		</tr>
			%for s in get_result(data) :
			<tr>
				<td style='font-weight:bold;'>${s.name}</td>
			</tr>
				%for o in s.order_line:
				<tr class="subhead">
					<td align="left">${o.product_id.default_code}</td>
					<td align="left">${o.product_id.name_template}</td>
					<td align="right">${o.product_uom_qty} ${o.product_uom.name}</td>
					<td align="right">${o.price_unit}</td>
					<td align="right">${o.price_subtotal}</td>
				</tr>
				%endfor
			%endfor
	</table>
	
	<br/>
	<br/>
	
	<table class="sign" align="right" border-collapse="collapse" width="30%">
		<tr>
			<td align="center">Prepared</td>
			<td align="center">Checked</td>
			<td align="center">Received</td>
		</tr>
		<tr>
			<td height="50px" align="center">&nbsp;</td>
			<td height="50px" align="center">&nbsp;</td>
			<td height="50px" align="center">&nbsp;</td>
		</tr>
		<tr>
			<td align="center">User</td>
			<td align="center">Supervisor</td>
			<td align="center">Manager</td>
		</tr>
	</table>
	
</body>
</html>

Advertisements

One thought on “Reporting in OpenERP (WEBKIT)

  1. Pingback: Technical Training -Part 11- | Tutorial OpenERP

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s