Query

Anda diminta membuat daftar pegawai berdasarkan usia tertentu, misalkan yang berumur kurang dari 25 tahun. Secara PostgreSQL ini dapat ditempuh dengan query SELECT * FROM hr_employee WHERE now() - birthday . Bagaimana melakukan query langsung seperti ini di OpenERP ?

Sebelum menyentuh tahapan pembuatan source code, tetapkan terlebih dahulu input parameter, yaitu:

  1. Operator: lebih kecil dari, lebih besar dari, dan sama dengan.
  2. Usia: bernilai antara 25 - 55 tahun.

Karena berbicara pegawai, berarti kita gunakan modul hr. Sedangkan modul tambahan yang akan dibuat bernama hr_custom. Mulailah dengan membuat direktorinya:

$ cd /usr/lib/pymodules/python2.7/openerp
$ sudo mkdir -p addons/hr_custom/wizard
$ sudo mkdir addons/hr_custom/report

Kemudian buat struktur wizard-nya melalui file addons/hr_custom/wizard/usia.py:

from osv import osv, fields

OPERATOR = [
('>', 'lebih besar dari'),
(' ('=', 'sama dengan'),
]

TAHUN = [ (x, '%d tahun' % x) for x in range(25, 56) ]

class usia(osv.osv_memory):
_name = 'hr_custom.wizard.usia'
_columns = {
'operator': fields.selection(OPERATOR, 'Operator', required=True),
'tahun': fields.selection(TAHUN, 'Usia', required=True),
}

def default_get(self, cr, user, fields_list=None, context=None):
return {'operator': ' 'tahun': 25}

def print_report(self, cr, uid, ids, context={}):
res = self.read(cr, uid, ids, ['operator', 'tahun'], context=context)
res = res[0]
sql = "SELECT e.id FROM hr_employee e, resource_resource r WHERE " + \
"e.id = r.id AND now() - e.birthday %s '%d year' ORDER BY r.name"
sql = sql % (res['operator'], res['tahun'])
cr.execute(sql)
ids = [x['id'] for x in cr.dictfetchall()]
datas = {'ids': ids,
'form': res}
return {'datas': datas,
'report_name': 'hr_custom.usia',
'type': 'ir.actions.report.xml'}

usia()

Pastikan direktorinya merupakan modul dengan membuat file addons/hr_custom/wizard/__init__.py:

import usia

Lekatkan wizard ini pada menu melalui file addons/hr_custom/wizard/usia.xml:




hr_custom.wizard.usia.form
hr_custom.wizard.usia
form






string="Print"/>


name="Daftar Pegawai Berdasarkan Usia"
res_model="hr_custom.wizard.usia"
view_mode="form"
target="new"
key2="client_print_multi"/>

parent="hr.menu_hr_reporting"
name="Berdasarkan Usia"
action="window_wizard_usia"/>


Lalu daftarkan di sistem OpenERP melalui file addons/hr_custom/__openerp__.py:

{
'name' : 'Kepegawaian',
'category': 'Human Resources',
'version' : '1.0',
'author' : 'OpenSIPKD',
'depends' : ['hr'],
'init_xml' : [
'wizard/usia.xml',
],
'application': True,
'description': 'Laporan Kepegawaian',
}

Selanjutnya buat tampilan PDF-nya melalui addons/hr_custom/report/usia.rml:



author="Martin Simon" allowSplitting="20">


Pegawai Berusia [[ data['form']['operator'] ]] [[ data['form']['tahun'] ]] Tahun
No. Nama NIP Tempat Lahir Tgl Lahir


[[ repeatIn(objects, 'pegawai') ]] [[ pegawai.number ]] [[ pegawai.name ]] [[ pegawai.code ]] [[ pegawai.birthplace ]] [[ formatLang(pegawai.birthday, date=True) ]]




Aktifkan RML parser di addons/hr_custom/report/usia.py:

from report.report_sxw import report_sxw

report_sxw('report.hr_custom.usia', 'hr.employee',
'addons/hr_custom/report/usia.rml')

Pastikan direktorinya merupakan modul melalui addons/hr_custom/report/__init__.py:

import usia

Pastikan juga kedua direktori tersebut dipanggil oleh modul induk melalui file addons/hr_custom/__init__.py:

import wizard
import report

Nomor Urut
Pada kesempatan ini juga ditampilkan contoh memberikan nomor urut pada file RML, yaitu baris:


yang diletakkan di dalam loop. Kemudian di luar loop lakukan reset seperti ini:


Tanpa seqReset, nomor urut pada PDF berikutnya akan berlanjut, tidak diawali dengan 1. Makna L1 di atas sepertinya semacam identitas sequence sehingga perlu unik di setiap loop.

Header di Setiap Halaman
Banyaknya jumlah pegawai membuat sebuah PDF terdiri dari beberapa halaman. Sayangnya ini tidak diikuti dengan pengulangan judul kolom. Oleh karena itu Anda perlu menggunakan tag tambahan
dan
seperti pseudo code berikut ini:


Sehingga menjadi seperti ini:

No. Nama NIP Tempat Lahir Tgl Lahir

No. Nama NIP Tempat Lahir Tgl Lahir


[[ repeatIn(objects, 'pegawai') ]] [[ pegawai.number ]] [[ pegawai.name ]] [[ pegawai.code ]] [[ pegawai.birthplace ]] [[ formatLang(pegawai.birthday, date=True) ]]



Referensi: