Object Baru = Sequence Baru

Pada saat proses development berjalan, sering kali kita membuat object (tabel) baru sebagai bagian dari requirement yang ada. Sebenarnya masalah ini sangat simple dan juga sudah banyak contohnya pada addons default openerp, akan tetapi sering menjadi bahan pertanyaan yang diajukan kepada penulis.

Sebenarnya semua yang ada di OpenERP adalah data dari sebuah record, baik itu view, report, workflow, action, menu dan termasuk didalamnya sequence. Untuk tutorial kali ini, penulis akan mencoba membuat sebuah sequence dari object baru misalnya adalah ‘delivery.note’

Untuk membuat sequence, codenya cukup mudah seperti contoh dibawah ini :


		<record id="seq_type_delivery_note_new" model="ir.sequence.type">
			<field name="name">Delivery Note</field>
			<field name="code">delivery.note</field>
		</record>
		
		<record id="seq_delivery_note_new" model="ir.sequence">
			<field name="name">Delivery Note</field>
			<field name="code">delivery.note</field>
			<field name="prefix">DN/%(y)s/%(month)s/</field>
			<field name="padding">5</field>
		</record>

Ketika kita membuat sebuah sequence OpenERP, maka hal yang dilakukan adalah membuat sequence code dan sequence itu sendiri. Cara membuatnya bisa dari code xml seperti diatas ataupun melalui menu Setting -> Sequences & Identifiers -> Sequences dan Setting -> Sequences & Identifiers -> Sequence Codes. Fungsi dari sequence code adalah penentuan sequence dari object terkait sedangkan sequence berfungsi untuk pendefinisan format yang diinginkan berdasarkan sequence code yang telah dibuat sebelumnya.

Sample code diatas terbagi menjadi dua bagian, yang pertama kita membuat sequence code terlebih dahulu lalu dilanjutkan dengan bagian kedua yaitu mendefiniskan sequence berdasarkan sequence code sebelumnya. Jika dikemudian hari terjadi perubahan format sequence maka kita bisa langsung merubahnya via form sequence (seperti menu diatas) tanpa merubah code xml pada modulnya.

Setelah kita berhasil membuat sequencenya, maka langkah selanjutnya adalah cara penggunaannya. Apakah sequence ini akan digunakan ketika user menekan tombol create (dijadikan nilai default) ataukah ketika user membuat record pada saat pertama kali baik menekan tombol save maupun confirm.

Jika kita menginginkan cara pertama maka cukup mendefinisikan field name pada keyword _defaults seperti contoh dibawah ini :


    _defaults = {
        'name' : lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'delivery.note'),
    }
     

Akan tetapi kelemahan dari cara pertama, jika user tidak jadi untuk menyimpan data yang telah diinput (misal sales order) dan membatalkannya, maka penomoran sequence akan terlongkap. Untuk menyelesaikan masalah diatas maka kita gunakan cara kedua seperti contoh dibawah ini :


    _defaults = {
        'name': '/',
    }
     

    # Override method create()
    def create(self, cr, uid, vals, context=None):
        # Replace '/' dengan sequence object sebenarnya    
        vals['name'] = self.pool.get('ir.sequence').get(cr, uid, 'delivery.note')
        return super(delivery_note, self).create(cr, uid, vals, context=context)
 

Pada contoh code diatas kita hanya mendefinikan ‘/’ sebagai nilai default field name ketika user ingin membuat sebuah transaksi. Hasilnya, walaupun user tidak jadi untuk menyimpannya atau membatalkannya maka sequence tetap belum digunakan/terpakai. Dan ketika transaksi dilanjutkan untuk disimpan atau confirm, maka method create() akan terpanggil dan disinilah kita melakukan overiding terhadap method create()

Alhamdulillah tutorial yang simple kali ini telah penulis sampaikan, saran & kritik yang membangun sangat diharapkan. Semoga bermanfaat …

Advertisements

11 thoughts on “Object Baru = Sequence Baru

    • Bisa juga, caranya dengan mengcopy baris method create() di bawah ini ke method approval atau perubahan state terkait :

      nama = self.pool.get(‘ir.sequence’).get(cr, uid, ‘object.sequence.baru’)

  1. Mas untuk cara ke 2 di saya method create() tidak berjalan.
    ini kodenya :

    __.py
    _defaults = {
    ‘touridbooking’: ‘/’,
    }

    # Override method create()
    def create(self, cr, uid, vals, context=None):
    # Replace ‘/’ dengan sequence object sebenarnya
    vals[‘touridbooking’] = self.pool.get(‘ir.sequence’).get(cr, uid, ‘tour.booking’)
    return super(tour_booking, self).create(cr, uid, vals, context=context)

    xml file

    Tour Booking
    tour.booking

    Tour Booking
    tour.booking
    TB%(y)s%(month)s%(day)s-
    3

    Mohon bantuannya mas..
    terimakasih..

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