Technical Training -Part 8-

Pada technical training kali ini kita akan mempelajari pembuatan workflow pada object training kita. Untuk mereview materi tentang workflow silahkan pelajari pada link ini. Pada kesempatan kali ini kita akan langsung membuat sebuah workflow pada object training yang telah kita buat sebelumnya yaitu ‘training.sesi’.

Pertama kita bikin sebuah field selection bernama ‘state‘ dan berikan nilai defaultnya seperti contoh dibawah ini :



class Sesi(osv.osv):
    _name = 'training.sesi'
    _columns = {
        ...
         
        'state': fields.selection([('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done')], 'Status', readonly=True),

        ...
    }

    _defaults = {
                 ...
                 
                 'state': 'draft',
                 
                 ...
    }
    
Sesi()

Lalu tambahkan 3 method pada object yang sama. Fungsi dari ketiga method ini adalah untuk mengupdate nilai dari field state berdasarkan action dari button click.



class Sesi(osv.osv):
    _name = 'training.sesi'

...

    def sesi_draft(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'state': 'draft'})
        
    def sesi_confirm(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'state': 'confirmed'})
        
    def sesi_done(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'state': 'done'})

...        
    
Sesi()

Kita lanjutkan dengan pembuatan button untuk ketiga method tersebut



		<record model="ir.ui.view" id="sesi_form_view">
		     <field name="name">training.sesi.form</field>
		     <field name="model">training.sesi</field>
		     <field name="arch" type="xml">
		         <form string="Form Sesi" version="7.0">
					<header>
                        <button name="sesi_draft" type="object" states="confirmed,done" string="Reset to Draft" icon="terp-stock_effects-object-colorize"/>
	           			<button name="sesi_confirm" type="object" states="draft" string="Confirm" icon="gtk-apply"/>
                        <button name="sesi_done" type="object" states="confirmed" string="Mark as done" icon="gtk-apply"/>
	           			<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"draft":"red","confirmed":"blue"}'/>
	                </header>                                
					<sheet>
						<group col="4">
							<field name="name" colspan="4"/>
							<field name="instructur_id" />
							<field name="kursus_id"/>
							<field name="tanggal_mulai" />
							<field name="durasi"/>
							<field name="kursi" on_change="onchange_hitung_kuota(kursi, peserta_ids)"/>
							<field name="active"/>
							<field name="kuota_kehadiran_persen" widget="progressbar" colspan="4"/>
							<field name="image"  widget="image" class="oe_avatar oe_left"/>
						</group>
						<separator string="Peserta" colspan="4"/>
						<field name="peserta_ids" colspan="4" nolabel="1" on_change="onchange_hitung_kuota(kursi, peserta_ids)">
							<tree string="Peserta" editable="top">
								<field name="peserta_id"/>
							</tree>
						</field>
					</sheet>
		         </form>
		     </field>
		</record>
		 

Langkah-langkah yang kita lakukan diatas adalah mempersiapkan state (status) yang erat kaitannya dengan sebuah workflow yaitu berfungsi untuk mendefinikan sebuah workflow dalam suatu object.

Sebuah workflow dapat dihubungkan dengan berbagai object yang semuanya itu dapat kita customize. Workflow biasanya digunakan untuk membuat struktur & mengatur ‘lifecycle’ sebuah bisnis atau document suatu object. Diantara fungsinya juga kita dapat gunakan untuk menelusuri proses yang terjadi pada suatu transaksi object sepanjang waktu.

Selain state, hal-hal yang berhubungan dengan workflow adalah transisi dan activity yang kesemuanya itu telah penulis bahas pada link diatas. Sebenarnya jika alur proses document kita sederhana maka cukup gunakan state walaupun tidak ada workflownya seperti contoh diatas. Sedangkan jika alur prosesnya panjang dan complex yang tidak dapat kita definikan hanya dengan state, maka kita harus membuat workflownya.

Disamping menggunakan modul, workflow dapat kita bikin langsung pada interface di OpenERP yang menunya dapat kita akses pada Setting -> (Technical) -> Workflow. Baik kita lanjutkan pembuatan workflow dengan membuat 1 file baru lagi pada modul training yaitu ‘training_openerp_workflow.xml‘ dan jangan lupa untuk mendefiniskannya pada file __openerp__.py. seperti ini :

...

"update_xml":["training_openerp_view.xml", "training_openerp_workflow.xml"],

...

Isi file ‘training_openerp_workflow.xml‘ dengan baris code dibawah ini :



		<!-- ##### Object ##### -->
		 
		<record id="wkf_sesi" model="workflow">
		    <field name="name">sesi.basic</field>
		    <field name="osv">training.sesi</field>
		    <field name="on_create">True</field>
		</record>

		 
		<!-- ##### Activity ##### -->
		 
		<record id="act_sesi_draft" model="workflow.activity">
		    <field name="wkf_id" ref="wkf_sesi"/>
		    <field name="flow_start">True</field>
		    <field name="name">draft</field>
		</record>
		 
		<record id="act_sesi_confirmed" model="workflow.activity">
		    <field name="wkf_id" ref="wkf_sesi"/>
		    <field name="name">confirmed</field>
		    <field name="kind">function</field>
		    <field name="action">sesi_confirm()</field>
		</record>
		        
		<record id="act_sesi_draft" model="workflow.activity">
		    <field name="wkf_id" ref="wkf_sesi"/>
		    <field name="name">draft</field>
		    <field name="kind">function</field>
		    <field name="action">sesi_draft()</field>
		</record>
		 
		<record id="act_sesi_done" model="workflow.activity">
		    <field name="wkf_id" ref="wkf_sesi"/>
		    <field name="name">done</field>
		    <field name="flow_stop">True</field>
		    <field name="kind">function</field>
		    <field name="action">sesi_done()</field>
		</record>
		        

		<!-- ##### Transition ##### -->
		 
		<record id="trans_sesi_draft_confirmed" model="workflow.transition">
		    <field name="act_from" ref="act_sesi_draft"/>
		    <field name="act_to" ref="act_sesi_confirmed"/>
		    <field name="signal">confirm_sesi</field>
		</record>
		 
		<record id="trans_sesi_confirmed_draft" model="workflow.transition">
		    <field name="act_from" ref="act_sesi_confirmed"/>
		    <field name="act_to" ref="act_sesi_draft"/>
		    <field name="signal">draft_sesi</field>
		</record>
		        
		<record id="trans_sesi_confirmed_done" model="workflow.transition">
		    <field name="act_from" ref="act_sesi_confirmed"/>
		    <field name="act_to" ref="act_sesi_done"/>
		    <field name="signal">done_sesi</field>
		</record> 


Lalu update button code yang telah kita bikin dengan perubahan seperti ini :


 
		<record model="ir.ui.view" id="sesi_form_view">
		     <field name="name">training.sesi.form</field>
		     <field name="model">training.sesi</field>
		     <field name="arch" type="xml">
		         <form string="Form Sesi" version="7.0">
					<header>
                        <button name="draft_sesi" states="confirmed" string="Reset to Draft" icon="terp-stock_effects-object-colorize"/>
	           			<button name="confirm_sesi" states="draft" string="Confirm" icon="gtk-apply"/>
                        <button name="done_sesi" states="confirmed" string="Mark as done" icon="gtk-apply"/>
	           			<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done" statusbar_colors='{"draft":"red","confirmed":"blue"}'/>
	                </header>                                
					<sheet>
						<group col="4">
							<field name="name" colspan="4"/>
							<field name="instructur_id" />
							<field name="kursus_id"/>
							<field name="tanggal_mulai" />
							<field name="durasi"/>
							<field name="kursi" on_change="onchange_hitung_kuota(kursi, peserta_ids)"/>
							<field name="active"/>
							<field name="kuota_kehadiran_persen" widget="progressbar" colspan="4"/>
							<field name="image"  widget="image" class="oe_avatar oe_left"/>
						</group>
						<separator string="Peserta" colspan="4"/>
						<field name="peserta_ids" colspan="4" nolabel="1" on_change="onchange_hitung_kuota(kursi, peserta_ids)">
							<tree string="Peserta" editable="top">
								<field name="peserta_id"/>
							</tree>
						</field>
					</sheet>
		         </form>
		     </field>
		</record>
		 

Jika kita perhatikan, maka ada sedikit perubahan yaitu type dari button yang semula adalah object sekarang kita hapus, artinya parameter type akan kembali ke nilai default yaitu action. Jika kita isi object maka kita harus membuat sebuah method yang memiliki nama persis dengan parameter name pada button, sedangkan type action akan menggunakan parameter name sebagai action baik untuk report maupun workflow.

Parameter name pada button pada code diatas misal adalah confirm_sesi, maka button akan memanggil action nama tersebut pada transition workflow yang parameter signalnya bernilai confirm_sesi. Ketika transition ‘dieksekusi’ maka akan mengupdate perubahan activity workflow dari parameter act_from yaitu activity act_sesi_confirmed menuju parameter act_to yaitu activity act_act_sesi_done.

Untuk melihat workflow yang kita buat, maka silahkan ‘activate the developer mode’. Lalu bikinlah record baru pada training sesi dan silahkan pilih ‘Print Workflow’ pada widget selection pojok kiri atas form.

Alhamdulillah kita selesai mempelajari fitur pada OpenERP yaitu workflow. Saran dan kritik yang membangun sangat penulis harapkan. Semoga bermanfaat dan selamat mencoba …

Advertisements

2 thoughts on “Technical Training -Part 8-

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