Mencatat Perubahan Data pada Odoo

Dalam menu Sales odoo, jika anda membuka menu Quotation atau Order, di bagian paling bawah sendiri akan ada sebuah blok. Jika anda membuat perubahan pada form sales order, misal mengganti customer, mengubah harga dll, perubahan akan tercatat di blok tersebut. Seperti pada gambar dibawah.

Tampilan history perubahan data di menu sales odoo

Bagian ini biasanya disebut Chatter (saya belum tahu ini nama resminya apa, tapi di forum odoo biasa disebut seperti itu). Pada tutorial ini saya akan membahas bagaimana menambahkan chatter ke dalam suatu form untuk mencatat perubahan data, sehingga kita bisa tahu siapa melakukan perubahan apa dan kapan perubahan itu dilakukan.

Agar bisa mencatat perubahan data, model yang kita buat harus melakukan inherit ke beberapa model. Selain itu kita juga harus menandai secara manual field mana yang jika datanya berubah maka akan dicatat perubahannya, karena secara default odoo tidak melakukannya. Perhatikan kode dibawah ini.

# -*- coding: utf-8 -*-
from odoo import api, fields, models, exceptions, _

class MyService(models.Model):    
    _name = 'my.service'

    # sebaiknya _description anda isi
    # isi dengan nama yang pantas, agar saat dibaca di chatter juga enak
    _description = 'Service'

    # bagian ini wajib, jika anda menginginkan fungsi chatter
    _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin']

    # perhatikan pada bagian track_visibility
    name = fields.Char('Nomor Service', track_visibility='onchange')
    pelanggan = fields.Many2one('res.partner','Pelanggan', track_visibility='onchange')
    tanggal = fields.Date('Tanggal')
    service_detail = fields.One2many('my.service.detail', 'service_id')


class MyServiceDetail(models.Model):    
    _name = 'my.service.detail'

    # sebaiknya _description anda isi
    # isi dengan nama yang pantas, agar saat dibaca di chatter juga enak
    _description = 'Service Detail'

    # bagian ini wajib, jika anda menginginkan fungsi chatter
    _inherit = ['portal.mixin', 'mail.thread', 'mail.activity.mixin']

    # perhatikan pada bagian track_visibility
    product = fields.Many2one('product.product', 'Product', track_visibility='onchange')
    keluhan = fields.Char('Keluhan', track_visibility='onchange')
    garansi = fields.Boolean('Garansi')
    service_id = fields.Many2one('my.service')




Model yang kita buat harus inherit ke tiga model ini => portal.mixin, mail.thread dan mail.activity.mixin agar bisa menggunakan fungsi chatter.

Dan gunakan parameter track_visibility pada field yang ingin anda catat perubahan datanya. Ada dua pilihan yang bisa anda gunakan yaitu onchange dan always.

Update !!!

Sejak odoo versi 13, field parameter track_visibility sudah tidak bisa lagi digunakan. Sebagai gantinya odoo membuat sebuah field parameter baru, yaitu tracking. Dengan pilihan nilai berupa True atau False. Jika nilainya True maka jika data pada field tersebut berubah, odoo akan mencatat perubahan tersebut. Sehingga kode di atas pada odoo versi 13 dan yang lebih baru dapat ditulis seperti ini.

name = fields.Char('Nomor Service', tracking=True)

Sedangkan _description tidak wajib anda isi. Tapi alangkah baiknya jika diisi.

Selanjutnya agar perubahan data dapat terlihat di form, kita harus menampilkan beberapa field dari model portal.mixin, mail.thread dan mail.activity.mixin seperti pada kode dibawah ini.

<!-- form utama -->
<record id="service_form" model="ir.ui.view">
    <field name="name">Service Form</field>
    <field name="model">my.service</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form>                    
            <sheet>
                <group>
                    <group>
                        <field name="name" />
                    </group>
                    <group>
                        <field name="pelanggan" />
                        <field name="tanggal" />
                    </group>
                </group>
                <notebook>
                    <page string="Detail">
                        <field name="service_detail">
                            <tree editable="bottom">
                                <field name="product" />
                                <field name="keluhan" />
                                <field name="garansi" />
                            </tree>
                        </field>
                    </page>
                </notebook>
            </sheet>
            <!-- bagian diatas adalah view normal Odoo -->
            <!-- bagian dibawah ini adalah kode untuk menampilkan chatter -->
            <div class="oe_chatter">
                <field name="message_follower_ids" widget="mail_followers"/>
                <field name="activity_ids" widget="mail_activity"/>
                <field name="message_ids" widget="mail_thread"/>
            </div>
        </form>
    </field>
</record>

<!-- form service detail, jika user klik data di tab Detail form ini akan dibuka -->

<record id="service_detail_form" model="ir.ui.view">
    <field name="name">Service Detail Form</field>
    <field name="model">my.service.detail</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form>                    
            <sheet>
                <group>
                    <group>
                        <field name="product" />
                    </group>
                    <group>
                        <field name="keluhan" />
                        <field name="garansi" />
                    </group>
                </group>                        
            </sheet>
            <!-- bagian diatas adalah view normal Odoo -->
            <!-- bagian dibawah ini adalah kode untuk menampilkan chatter -->
            <!-- 
                karena form ini dipanggil dalam bentuk modal, jangan gunakan class oe_chatter.
                jika menggunakan class tersebut chatter tidak tampil di modal.   
            -->
            <div class="oe_chatter">
                <field name="message_follower_ids" widget="mail_followers"/>
                <field name="activity_ids" widget="mail_activity"/>
                <field name="message_ids" widget="mail_thread"/>
            </div>
        </form>
    </field>
</record>

Untuk menampilkan fungsi chatter, anda cukup menambahkan div dengan class oe_chatter dan beberapa field bawaan dari model portal.mixin, mail.thread dan mail.activity.mixin.

Jika form atau model anda dibuka dalam bentuk modal, seperti form service detail di atas jangan gunakan class oe_chatter. Cukup field-nya. Karena jika anda menggunakan-nya, chatter tidak akan tampil.

Berikut ini adalah tampilan form service detail yang dibuka dalam bentuk modal. Terlihat chatter tidak tampil walaupun kita sudah menambahkan beberapa field dari model portal.mixin, mail.thread dan mail.activity.mixin di view service_detail_form.

Tampilan form dalam modal tanpa chatter

Sedangkan jika kita hilangkan class oe_chatter seperti pada kode di bawah ini.

<!-- form service detail, jika user klik data di tab Detail form ini akan dibuka -->

<record id="service_detail_form" model="ir.ui.view">
    <field name="name">Service Detail Form</field>
    <field name="model">my.service.detail</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form>                    
            <sheet>
                <group>
                    <group>
                        <field name="product" />
                    </group>
                    <group>
                        <field name="keluhan" />
                        <field name="garansi" />
                    </group>
                </group>                        
            </sheet>
            <!-- bagian diatas adalah view normal Odoo -->
            <!-- bagian dibawah ini adalah kode untuk menampilkan chatter -->
            <!-- 
                karena form ini dipanggil dalam bentuk modal, jangan gunakan class oe_chatter.
                jika menggunakan class tersebut chatter tidak tampil di modal.   
            -->

            <!-- class oe_chatter dihilangkan -->
            <div>
                <field name="message_follower_ids" widget="mail_followers"/>
                <field name="activity_ids" widget="mail_activity"/>
                <field name="message_ids" widget="mail_thread"/>
            </div>
        </form>
    </field>
</record>

Chatter akan tampil seperti pada gambar di bawah ini.

Tampilan form dalam modal dengan chatter

Perbedaan antara menggunakan class oe_chatter dan tidak adalah jika anda menggunakan class oe_chatter anda bisa menambah catatan / log secara manual, tetapi chatter tidak tampil jika dibuka lewat modal. Sedangkan jika tidak menggunakan class oe_chatter fungsi chatter tetap tampil jika dibuka lewat modal tapi tidak bisa menambah catatan / log secara manual.

Tampilan chatter odoo dengan log note

Gambar di atas adalah tampilan sebuah form dengan class oe_chatter, sehingga tombol Log Note dll tampil. Anda dapat meng-klik tombol Log Note untuk menambah pesan secara manual.

Sedangkan jika kita menghilangkan class oe_chatter tombol Log Note dll akan hilang seperti pada gambar di bawah ini.

Tampilan chatter odoo tanpa log note

Download Source Code

Update !!!

Saya telah membuat sebuah addon agar chatter di modal tetap tampil tanpa menghilangkan class oe_chatter, sehingga tombol Log Note tetap ada walaupun form dibuka dalam bentuk modal, silakan klik link dengan judul Menampilkan Chatter di Modal pada Odoo dibawah.

Tulisan Serupa

Leave a Reply