Memberikan Nilai Default Untuk Field One2Many dari Event Create dan Onchange

Bismillah,

Assalamu'alaikum Warohmatullah Wabarokatuh,


Pada Kesempatan kali ini saya akan membahas salah satu tips dari teknik customize odoo 12, yaitu cara bagaimana memberikan nilai default untuk field One2Many dari Event Create atau Onchange.

Sebelumnya kita ketahui, bahwa nilai default dari sebuah field bisa diberikan dengan menambahkan atribut default pada field tersebut, 

misalkan : 


fields.Integer(String="Nilai", Default=100)


Artinya, bahwa ketika pada saat event create atau membuat record baru, maka field Nilai akan terisi otomatis value-nya menjadi 100.

Nah, bagaimana dengan field One2many? Karena One2many berhubungan dengan object yang lain dan berupa table (line), sehingga tidak bisa kita isikan nilai default-nya di attribute field, tetapi kita buatkan method onchange untuk men-trigger nilai default-nya.


Kita langsung studi kasus, 

Disini saya akan membuat purchase order line terisi secara otomatis (berdasarkan data vendors yang ada di masing - masing product) ketika dipilih vendor-nya pada saat create Purchase Order

Berikut ini langkah - langkahnya :

1. Pastikan data vendors di masing - masing product yang akan dimunculkan secara otomatis di purchase order line sudah terisi atau dilengkapi

Odoo text and image block










2. inherit object purchase.order dan buatkan method onchange terhadap field partner_id (vendor) agar menjadi trigger pengisian otomatis.

Karena PO belum disave, maka perlu ada peng-update-an id dari header purchase.order.line yaitu order_id dengan cara meng-update-kan order_id di dalam method create agar record purchase.order.line tersimpan secara sempurna ke database dengan id header (order_id) yang seharusnya.


class PurchaseOrder(models.Model):

    _inherit = 'purchase.order'


    @api.onchange('partner_id')

    def change_partner(self):

        obj_psi = self.env['product.supplierinfo']

        obj_order_line = self.env['purchase.order.line']

        if self.partner_id:

            psi = obj_psi.search([('name','=',self.partner_id.id)])

            

            for p in psi:

                print (p.product_uom.name, p.product_tmpl_id.name)

                self.order_line += obj_order_line.create({

                                                        'order_id': self.id or 1,

                                                        'product_id': p.product_id.id or p.product_tmpl_id.id,

                                                        'name': p.product_id.name or p.product_tmpl_id.name,

                                                        'date_planned': date.today(),

                                                        'product_qty': 1,

                                                        'product_uom': p.product_uom.id,

                                                        'price_unit': p.price,

                                                        })


    @api.model

    def create(self, vals):

        res = super(PurchaseOrder, self).create(vals)


        obj_order_line = self.env['purchase.order.line']

        if 'order_line' in vals:

            for line_id in vals['order_line']:

                obj_order_line.browse(line_id[1]).write({'order_id':res.id})


        return res


3. Buat Purchase Order baru, kemudian pilih vendor-nya, maka PO Line akan terisi otomatis walaupun belum klik Save.


Odoo text and image block









Terima kasih, semoga bermanfaat.

Kahfi

Wassalamu'alaikum Warohmatullah Wabarokatuh.