OpenERP: Alur

Foto os

Business process atau alur atau tahapan suatu transaksi pada OpenERP juga merupakan kolaborasi source Python beserta XML khusus yang memuat ketentuan alur (workflow). Berikut ini merupakan pengembangan modul hello yang pernah dibahas sebelumnya.

Pada modul hello terdapat sebuah field comment yang akan kita dampingi dengan field state dengan kemungkinan nilainya adalah: new, review, publish, dan unpublish. Awal record comment dibuat otomatis state = new. Saat comment akan dibaca, user klik tombol Review agar state = review. Setelah selesai dibaca user dihadapkan pada dua tombol Publish dan Unpublish. Kedua tombol inilah yang membuat final tahapan sehingga tidak tampak lagi tombol pengubah state.

Berikut ini file hello/hello.py secara lengkap:

from osv import osv, fields
 
 
STATES = [
    ('new', 'New'),
    ('review', 'Review'),
    ('publish', 'Publish'),
    ('unpublish', 'Unpublish'),
    ]
 
class hello_comment(osv.osv):
    _name = 'hello.comment'
    _columns = {
        'comment': fields.char('Comment', size=160),
        'state': fields.selection(STATES, 'Stage', readonly=True),
        }
 
    def hello_new(self, cr, uid, ids):
        self.write(cr, uid, ids, { 'state' : 'new' })
        return True
 
    def hello_review(self, cr, uid, ids):
        self.write(cr, uid, ids, { 'state' : 'review' })
        return True
 
    def hello_publish(self, cr, uid, ids):
        self.write(cr, uid, ids, { 'state' : 'publish' })
        return True
 
    def hello_unpublish(self, cr, uid, ids):
        self.write(cr, uid, ids, { 'state' : 'unpublish' })
        return True
 
hello_comment()

Kemudian tetapkan alurnya melalui file hello/hello_workflow.xml:

<openerp>
    <data>
        <record model="workflow" id="wkf_hello">
            <field name="name">hello.wkf</field>
            <field name="osv">hello.comment</field>
            <field name="on_create">True</field>
        </record>
 
        <!-- Action -->
 
        <record model="workflow.activity" id="act_new">
            <field name="wkf_id" ref="wkf_hello" />
            <field name="flow_start">True</field>
            <field name="name">new</field>
            <field name="kind">function</field>
            <field name="action">hello_new()</field>
        </record>
 
        <record model="workflow.activity" id="act_review">
            <field name="wkf_id" ref="wkf_hello" />
            <field name="name">review</field>
            <field name="kind">function</field>
            <field name="action">hello_review()</field>
        </record>
 
        <record model="workflow.activity" id="act_publish">
            <field name="wkf_id" ref="wkf_hello" />
            <field name="name">publish</field>
            <field name="kind">function</field>
            <field name="action">hello_publish()</field>
            <field name="flow_stop">True</field>
        </record>
 
        <record model="workflow.activity" id="act_unpublish">
            <field name="wkf_id" ref="wkf_hello" />
            <field name="name">unpublish</field>
            <field name="kind">function</field>
            <field name="action">hello_unpublish()</field>
            <field name="flow_stop">True</field>
        </record>      
 
        <!-- Transition -->        
 
        <record model="workflow.transition" id="t1">
            <field name="act_from" ref="act_new" />
            <field name="act_to" ref="act_review" />
            <field name="signal">hello_review</field>
        </record>
 
        <record model="workflow.transition" id="t2">
            <field name="act_from" ref="act_review" />
            <field name="act_to" ref="act_publish" />
            <field name="signal">hello_publish</field>
        </record>
 
        <record model="workflow.transition" id="t3">
            <field name="act_from" ref="act_review" />
            <field name="act_to" ref="act_unpublish" />
            <field name="signal">hello_unpublish</field>
        </record>
    </data>
</openerp>

Kemudian pada XML tampilan, sisipkan di bagian form baris berikut ini:

                    <field name="state"/>
                    <separator string="Workflow Actions" colspan="4"/>
                    <group colspan="4" col="3">
                        <button name="hello_review" string="Review" states="new" />
                        <button name="hello_publish" string="Publish" states="review" />
                        <button name="hello_unpublish" string="Unpublish" states="review" />
                    </group>

Atau secara lengkap file hello/hello_view.xml adalah:

<openerp>
    <data>
        <!-- Search form -->
        <record model="ir.ui.view" id="hello_filter">
            <field name="name">hello.comment.select</field>
            <field name="model">hello.comment</field>
            <field name="type">search</field>
            <field name="arch" type="xml">
                <search string="Search comment">
                    <field name="comment" select="1"/>
                </search>
            </field>
        </record>
 
        <!-- Table / search view -->
        <record model="ir.ui.view" id="hello_view_tree">
            <field name="name">hello.comment.tree</field>
            <field name="model">hello.comment</field>
            <field name="type">tree</field>
            <field name="arch" type="xml">
                <tree>
                    <field name="comment"/>
                    <field name="state"/>
                </tree>
            </field>
        </record>
 
        <!-- Form view for edit / insert record -->
        <record model="ir.ui.view" id="hello_view_form" >
            <field name="name">hello.comment.form</field>
            <field name="model">hello.comment</field>
            <field name="type">form</field>
            <field name="arch" type="xml">
                <form>
                    <field name="comment"/>
                    <!-- Workflow -->
                    <field name="state"/>
                    <separator string="Workflow Actions" colspan="4"/>
                    <group colspan="4" col="3">
                        <button name="hello_review" string="Review" states="new" />
                        <button name="hello_publish" string="Publish" states="review" />
                        <button name="hello_unpublish" string="Unpublish" states="review" />
                    </group>
                </form>
            </field>
        </record>
 
        <!-- Menu action -->
        <record model="ir.actions.act_window" id="action_hello_tree">
            <field name="name">Hello world!</field>
            <field name="res_model">hello.comment</field>
            <field name="view_type">form</field>
        </record>
 
        <!-- Main menu -->
        <menuitem name="Hello" id="menu_hello"/>
 
        <!-- Sub menu -->
        <menuitem name="Your comments" parent="menu_hello"
                  id="menu_action_hello_tree" action="action_hello_tree"
                  groups="base.group_erp_manager"/>
    </data>
</openerp>

Kemudian pada hello/__openerp__.py tambahkan di bagian update_xml file workflow tadi:

'update_xml': [
    ...
    'hello_workflow.xml',
    ....],

Atau secara lengkapnya:

{
    'name' : 'Hello world!',
    'category': 'Hidden',
    'version' : '1.0',
    'author' : 'RAB',
    'depends' : ['base'],
    'update_xml' : [
        'hello_view.xml',
        'hello_workflow.xml',
        'report/menu.xml'],
    'description': 'A simple form to insert, edit, or delete your comments.',
}

Sedangkan file hello/__init__.py tidak mengalami perubahan alias seperti ini:

import hello

Kemudian lakukan prosedur update modul hello, dan cobalah membuat record baru. Setelah disimpan akan menjadi seperti gambar di bawah ini.

Tampak Stage = New. Ini diperoleh berdasarkan XML berikut pada hello/hello_workflow.xml.

        <record model="workflow.activity" id="act_new">
            <field name="wkf_id" ref="wkf_hello" />
            <field name="flow_start">True</field>
            <field name="name">new</field>
            <field name="kind">function</field>
            <field name="action">hello_new()</field>
        </record>

Perhatikan bagian name="flow_start" yang menandakan awal alur, yaitu dengan menjalankan fungsi hello_new() sebagaimana baris berikut ini.

            <field name="action">hello_new()</field>

Kini tampil tombol Review. Penampakan tombol ini berdasarkan XML berikut pada file hello/hello_view.xml.

<button name="hello_review" string="Review" states="new" />

Ini bisa diartikan "Tampilkan tombol Review saat Stage = New".

Selanjutnya klik tombol Review yang menandakan record ini tengah dibaca user.

Proses yang dilakukan berdasakan nama tombol itu, yaitu name="hello_review" di atas. Dari kata "hello_review" ini dikaitkan dengan XML berikut pada hello/hello_workflow.xml.

        <record model="workflow.transition" id="t1">
            <field name="act_from" ref="act_new" />
            <field name="act_to" ref="act_review" />
            <field name="signal">hello_review</field>
        </record>

Dimana tindakan (signal) "hello_review" ini tercapai bila Stage sebelum di-klik adalah New:

            <field name="act_from" ref="act_new" />

dan setelah di-klik yang dilakukan adalah membuat Stage menjadi Review:

            <field name="act_to" ref="act_review" />

"act_review" ini sebagaimana XML berikut pada hello/hello_workflow.xml.

        <record model="workflow.activity" id="act_review">
            <field name="wkf_id" ref="wkf_hello" />
            <field name="name">review</field>
            <field name="kind">function</field>
            <field name="action">hello_review()</field>
        </record>

Tindakan "act_review" ini menjalankan fungsi hello_review().

Kini tampak Stage = Review, dan tampil dua tombol Publish dan Unpublish. Klik salah satu, misalnya tombol Publish.

Kini tidak ada lagi tombol yang tampak sesuai XML berikut pada hello/hello_view.xml.

                    <group colspan="4" col="3">
                        <button name="hello_review" string="Review" states="new" />
                        <button name="hello_publish" string="Publish" states="review" />
                        <button name="hello_unpublish" string="Unpublish" states="review" />
                    </group>

Juga ini merupakan akhir dari alur sebagaimana XML berikut ini pada hello/hello_workflow.xml.

        <record model="workflow.activity" id="act_publish">
            <field name="wkf_id" ref="wkf_hello" />
            <field name="name">publish</field>
            <field name="kind">function</field>
            <field name="action">hello_publish()</field>
            <field name="flow_stop">True</field>
        </record>

Tentu saja ini contoh yang sederhana dimana kita hanya mengganti nilai pada field state. Pada praketknya bisa saja Anda perlu mengubah source pada hello/hello.py berikut ini.

    def hello_review(self, cr, uid, ids):
        self.write(cr, uid, ids, { 'state' : 'review' })
        return True

Misalnya ada proses yang mengirim email ke penulis komentar bahwa komentarnya itu tengah dibaca admin.

Cermatilah. Jangan ragu membacanya berulang-ulang.

Referensi: