Pembuatan Workflow OpenERP

Workflow adalah aliran proses dari suatu state ke state selanjutnya di OpenERP. Digunakan agar status pada transaksi dapat dimonitor dan sesuai dengan alur proses yang telah ditentukan. Pada Tutorial kali ini, saya akan menerapkan workflow pada object diary yang merupakan kelanjutan dari tutorial sebelumnya.

Workflow yang akan kita buat, yaitu :

Draft

|
|

Confirm

|
/ \
/ \

Cancel Done

3 hal yang menjadi bagian inti dari sebuah workflow adalah :

1. Object Workflow

Hal pertama yang harus kita lakukan dalam membuat sebuah workflow adalah pembuatan object workflow dari object yang bersangkutan (sale order, purchase order, dll). Pada object ini nantinya kita akan lakukan perubahan-perubahan state sesuai alur proses yang kita inginkan.

2. Activity

Activity adalah sebuah status alur proses yang dimikili oleh sebuah workflow, sebuah workflow pasti memiliki banyak activity (state). Activity ini biasa kita kenal dan kita definisikan pada field state.

3. Transition

Seperti namanya, transition merupakan proses transisi dari sebuah activity kepada activity selanjutnya.

Mari kita mulai pembuatan workflow yang kita tambahkan pada sebuah modul stg_diary sebelumnya.

Pertama, kita harus merancang alur proses workflow yang kita inginkan, seperti yang saya gambarkan diatas.

Kedua, kita harus menambahkan state/activity tersebut kedalam object diary (diary.py), yaitu dengan menambahkan pembuatan sebuah field state :

'state': fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('cancel', 'Cancel'), ('done', 'Done')], 'State', readonly=True, select=True),

Ketiga, kita harus membuat file xml baru, yaitu diary_workflow.xml, lalu kita sisipkan di __openerp__.py :

"init_xml":["diary_view.xml","diary_workflow.xml"],

Lalu kita isi diary_workflow.xml, tersebut dengan code dibawah ini :


        <!-- Object -->
       
        <record id="wkf_diary" model="workflow">
            <field name="name">diary.basic</field>
            <field name="osv">diary</field>
            <field name="on_create">True</field>
        </record>
       
        <!-- Activity -->
       
        <record id="act_diary_draft" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="flow_start">True</field>
            <field name="name">draft</field>
        </record>
               
        <record id="act_diary_approve" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="name">approve</field>
            <field name="kind">function</field>
            <field name="action">write({'state':'approved'})</field>
        </record>
       
        <record id="act_diary_cancel" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="name">cancel</field>
            <field name="flow_stop">True</field>
            <field name="kind">stopall</field>
            <field name="action">write({'state':'cancel'})</field>
        </record>
       
        <record id="act_diary_done" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="name">done</field>
            <field name="flow_stop">True</field>
            <field name="kind">function</field>
            <field name="action">write({'state':'done'})</field>
        </record>
               
        <!-- Transition -->

        <record id="trans_diary_draft_approve" model="workflow.transition">
            <field name="act_from" ref="act_diary_draft"/>
            <field name="act_to" ref="act_diary_approve"/>
            <field name="signal">diary_confirm</field>
        </record>
       
        <record id="trans_diary_approve_cancel" model="workflow.transition">
            <field name="act_from" ref="act_diary_approve"/>
            <field name="act_to" ref="act_diary_cancel"/>
            <field name="signal">diary_cancel</field>
        </record>
               
        <record id="trans_diary_approve_done" model="workflow.transition">
            <field name="act_from" ref="act_diary_approve"/>
            <field name="act_to" ref="act_diary_done"/>
            <field name="signal">diary_validate</field>
        </record> 

Seperti penjelasan saya diatas, kita harus membuat 3 unsur penyusun dalam membuat sebuah workflow, yaitu object, activity, transition.


        <!-- Object -->
       
        <record id="wkf_diary" model="workflow">
            <field name="name">diary.basic</field>
            <field name="osv">diary</field>
            <field name="on_create">True</field>
        </record>

Perintah diatas berfungsi untuk menciptakan suatu object workflow baru yang bernama ‘diary.basic’ berdasarkan tabel/object ‘diary’


       <!-- Activity -->
       
        <record id="act_diary_draft" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="flow_start">True</field>
            <field name="name">draft</field>
        </record>
               
        <record id="act_diary_approve" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="name">approve</field>
            <field name="kind">function</field>
            <field name="action">write({'state':'confirmed'})</field>
        </record>
       
        <record id="act_diary_cancel" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="name">cancel</field>
            <field name="flow_stop">True</field>
            <field name="kind">stopall</field>
            <field name="action">write({'state':'cancel'})</field>
        </record>
       
        <record id="act_diary_done" model="workflow.activity">
            <field name="wkf_id" ref="wkf_diary"/>
            <field name="name">done</field>
            <field name="flow_stop">True</field>
            <field name="kind">function</field>
            <field name="action">write({'state':'done'})</field>
        </record>

Setelah kita membuat workflow diary, selanjutnya kita membuat activity-activity yang akan membentuk workflow tersebut, seperti alur proses diatas, saya telah membuat 4 activity, diantaranya adalah Draft, Confirm, Cancel, Done. Beberapa field yang harus kita isi dalam membuat activity, yaitu :

name –> Untuk mengisi nama state activity
flow_start –> Digunakan khusus untuk activity awal
flow_stop –> Digunakan khusus untuk activity akhir
kind –> Biasanya digunakan berbarengan dengan field action (diisi jika field action diisi)
action –> Digunakan untuk mengupdate field state atau mengiisinya dengan sebuah nama method


        <!-- Transition -->

        <record id="trans_diary_draft_approve" model="workflow.transition">
            <field name="act_from" ref="act_diary_draft"/>
            <field name="act_to" ref="act_diary_approve"/>
            <field name="signal">diary_confirm</field>
        </record>
       
        <record id="trans_diary_approve_cancel" model="workflow.transition">
            <field name="act_from" ref="act_diary_approve"/>
            <field name="act_to" ref="act_diary_cancel"/>
            <field name="signal">diary_cancel</field>
        </record>
               
        <record id="trans_diary_approve_done" model="workflow.transition">
            <field name="act_from" ref="act_diary_approve"/>
            <field name="act_to" ref="act_diary_done"/>
            <field name="signal">diary_validate</field>
        </record>

Unsur penyusun terakhir dari sebuah workflow adalah transition. Transition ini berfungsi sebagai action/signal dari sebuah button. Transition inilah yang akan memindahkan dari suatu activity/state ke activity state selanjutnya. Field-field yang berhubungan untuk membuat transition diantaranya :

act_from –> Diisi dengan nama id activity sebelum transition
act_to –> Diisi dengan nama id activity sesudah transition
signal –> Diisi dengan nama signal/action yang akan disisipkan pada button

Setelah kita berhasil membuat sebuah workflow dari object diary, maka untuk menjalankan flownya kita harus membuat sebuah button yang berfungsi untuk melakukan action/event/signal sehingga workflow berjalan sesuai yang diinginkan. Button ini juga yang nantinya akan memindahkan suatu state ke state lainnya berdasarkan transitionnya.


<button name="diary_confirm" states="draft" string="Confirm" icon="gtk-apply"/>
<button name="diary_cancel" states="confirmed" string="Cancel" icon="gtk-cancel"/>
<button name="diary_validate" states="confirmed" string="Validate" icon="gtk-jump-to"/> 

Sekian tutorial kali ini, jika ada yang membingungkan atau pertanyaan lainnya, silahkan untuk disampaikan dan jangan lupa untuk dipraktekan modul yang terlampir …

Advertisements

One thought on “Pembuatan Workflow OpenERP

  1. Pingback: Technical Training -Part 8- | 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