OpenERP 6: Calculated Field

Foto os

Anda memiliki tabel riwayat kepangkatan pegawai dan membutuhkan laporan daftar pegawai beserta pangkat terakhirnya. Sebaiknya siapkan sebuah field pangkat yang melekat pada pegawai. Field ini tidak bisa diubah oleh user karena otomatis terisi berdasarkan tabel riwayat tadi. Di OpenERP field seperti ini bertipe function, atau saya lebih suka menyebutnya calculated field.

Anggaplah modul dinamai hr_custom, jadi buatlah direktorinya:

# mkdir addons/hr_custom

Lalu buatlah file addons/hr_custom/hr_custom.py yang berisi:

from osv import fields, osv
 
class pangkat(osv.osv):
    _name = 'pangkat'
    _description = 'Pangkat'
    _columns = {
        'name': fields.char('Uraian', size=128, required=True),
        }
    _sql_constraints = [('pangkat_uniq', 'unique(name)', 'Nama harus unik')]
    _order = 'name'
pangkat()
 
class pangkat_line(osv.osv):
    _name = 'pangkat.line'
    _description = 'Riwayat Pangkat'
    _columns = {
        'employee_id': fields.many2one('hr.employee', 'Pegawai', required=True),
        'pangkat_id': fields.many2one('pangkat', 'Pangkat', required=True),
        'tgl': fields.date('Tanggal', required=True),
        }
    _order = 'tgl DESC'
pangkat_line()
 
class hr_custom(osv.osv):
    _inherit = 'hr.employee'
 
    def _calculate_all(self, cr, uid, ids, field_name, arg, context=None):
        res = {}
        for employee in self.browse(cr, uid, ids, context=context):
            res[employee.id] = {
                'pangkat_id': None,
            }
            for line in employee.pangkat_line[:1]:
                res[employee.id]['pangkat_id'] = line.pangkat_id.id
        return res
 
    _columns = {
        'pangkat_line': fields.one2many('pangkat.line', 'employee_id', 'Riwayat Pangkat'),
        'pangkat_id': fields.function(_calculate_all, string='Pangkat',
                        type='many2one', obj='pangkat', multi='terbaru',
                        store={'hr.employee': (lambda self, cr, uid, ids, c={}: ids, ['pangkat_line'], 10)}),
        }
 
    def pangkat_terbaru(self, cr, uid, employee_id, context):
        obj = self.pool.get('pangkat_line')
        ids = obj and obj.search(cr, uid, [('employee_id', '=', employee_id)], limit=1)
        if ids:
            lines = obj.browse(cr, uid, ids, context=context)
            return lines[0].pangkat_id.id
 
hr_custom()

Lalu buatlah agar direktori ini dianggap sebagai modul dengan membuat file addons/hr_custom/__init__.py:

import hr_custom

Atur tampilannya di addons/hr_custom/view.xml:

<openerp>
    <data>
        <record id="view_employee_form1" model="ir.ui.view">
            <field name="name">hr.employee.form1</field>
            <field name="model">hr.employee</field>
            <field name="inherit_id" ref="hr.view_employee_form"/>
            <field name="arch" type="xml">
                <field name="name" position="after">
                    <field name="pangkat_id"/>
                </field>
                <page string="Personal Information" position="after">
                    <page string="Riwayat Pangkat">
                        <field mode="tree,form" name="pangkat_line" nolabel="1">
                            <tree>
                                <field name="pangkat_id"/>
                                <field name="tgl"/>
                            </tree>
                            <form>
                                <field name="pangkat_id"/>
                                <field name="tgl"/>
                            </form>
                        </field>
                    </page>
                </page>
            </field>
        </record>
    </data>
</openerp>

Isi data pangkat di addons/hr_custom/pangkat.csv:

id,name
komisaris,Komisaris
direktur,Direktur
manager-it,Manager IT
manager-keuangan,Manager Keuangan
manager-pemasaran,Manager Pemasaran
staff,Staff

Lengkapi dengan membuat OpenERP profile di addons/hr_custom/__openerp__.py:

{
    'name' : 'Pegawai',
    'depends' : ['hr'],
    'update_xml': ['view.xml', 'pangkat.csv'],
}

Restart daemonnya:

# service openerp restart

Tambahkan modul ini seperti biasa. Cobalah menambah data karyawan beserta riwayat pangkatnya. Perhatikan tanggalnya dimana ia akan mengandalkan tanggal terbesar untuk mendapatkan pangkat saat ini.

Selamat mencoba.

Referensi: