Computed Field pada Pengembangan Aplikasi Odoo 17

Jan 28, 2025 | Odoo 17 Development

Dalam melakukan pemrograman kita akan menjumpai field-field yang tidak dimasukkan oleh pengguna tetapi dihitung dari field-field yang lain. Begitu juga pada pengembangan aplikasi berbasis Odoo 17 ini kita menggunakan computed field untuk field-field yang dihitung berdasarkan nilai dari field-field lain.

Computed field pada pengembangan aplikasi Odoo 17 adalah seperti pada langkah-langkah berikut ini

  1. Menjalankan SSH Filesystem

  2. Model asrama.room

    from odoo import fields, models, api, _
    from odoo.exceptions import ValidationError
    
    class AsramaRoom(models.Model):
        _name = 'asrama.room'
        _description = 'Informasi Kamar Asrama'
        _rec_name = 'room_no'
    
        name = fields.Char('Nama kamar',required=True)
        room_no = fields.Char('No kamar',required=True)
        floor_no = fields.Integer('No Lantai',default=1, help='No Lantai')
        currency_id = fields.Many2one('res.currency',string='Mata uang')
        rent_amount = fields.Monetary('Harga sewa',help='Masukkan harga sewa')
    
        hostel_id = fields.Many2one('asrama.hostel','Hostel', help='Nama hostel')    
    
        student_per_room = fields.Integer('Jml pelajar per kamar',required=True,
            help='Jml yang dialokasikan per kamar')
    
        @api.depends('student_per_room','student_ids')
        def _compute_check_availability(self):
            """Mengecek ketersediaan"""
            for rec in self:
                rec.availability = rec.student_per_room - len (rec.student_ids.ids)
        
        availability = fields.Float(compute='_compute_check_availability',store=True,
            string='Ketersediaan',help='Ketersediaan kamar pada asrama')
    
        student_ids = fields.One2many('asrama.student','room_id','Daftar pelajar',
            help='Pelajar-pelajar dalam room ini')
    
        asrama_amenities_ids = fields.Many2many('asrama.amenities',
            'asrama_amenities_rel','room_id','amenity_id',
            string='Amenities', domain="[('active','=',True)]",
            help='Pilih fasilitas room' 
        )
    
        _sql_constraints = [('room_no_unique','unique(room_no)','Nomor room harus unik!')]
    
        @api.constrains('rent_amount')
        def _check_rent_amount(self):
            """Constraint pada nilai negatif"""
            if self.rent_amount < 0:
                raise ValidationError(_('Nilai rental tidak boleh negatif'))
    
  3. View asrama.room

    <?xml version='1.0' encoding='utf-8'?>
    <odoo>
        <!-- asrama.room tree view -->
        <record id="asrama_room_view_tree" model="ir.ui.view">
            <field name="name">asrama.room.view.tree</field>
            <field name="model">asrama.room</field>
            <field name="arch" type="xml">
                <tree string='Room'>
                    <field name="name"/>
                    <field name="room_no" />
                    <field name="floor_no" />
                </tree>
            </field>
        </record>
    
        <!-- asrama.room form view -->
        <record id="asrama_room_view_form" model="ir.ui.view">
            <field name="name">asrama.room.view.form</field>
            <field name="model">asrama.room</field>
            <field name="arch" type="xml">
                <form string="Room">
                    <sheet>
                        <group>
                            <group description='Kamar'>
                                <field name="name" />
                                <field name="room_no" />
                                <field name="hostel_id" required="1"/>
                                <field name="floor_no" />
                            </group>
                            <group description='Harga'>
                                <field name="student_per_room"/>
                                <field name="availability"/>
                                <field name="rent_amount" />
                                <field name="currency_id" />
                            </group>
                        </group>
                        <notebook>
                            <page name="room_studennt" string="Para Pelajar">
                                <field name="student_ids"/>
                            </page>
                            <page name="asrama_amenities" string="Room Amenities">
                                <group>
                                    <field name="asrama_amenities_ids" widget="many2many_tags"/>
                                </group>
                            </page>
                        </notebook>
                    </sheet>
                </form>
            </field>
        </record>
    
        <!-- asrama.room action window -->
        <record id="asrama_room_action" model="ir.actions.act_window">
            <field name="name">Room</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">asrama.room</field>
            <field name="view_mode">tree,form</field>
            <field name="domain">[]</field>
            <field name="context">{}</field>
            <field name="help" type="html">
                <p class="oe_view_nocontent_create">
                    Tambah kamar
                </p>
            </field>
        </record>
    
        <!-- This Menu Item must have a parent and an action -->
        <menuitem id="asrama_room_menu" name="Room Asrama" parent="hostel_main_menu" action="asrama_room_action" sequence="2"/>
    
    </odoo>
    
  4. Menjalankan odoo-bin dengan mengupgrade modul

  5. Tabel asrama_room

  6. Tampilan

Kunjungi www.proweb.co.id/implementasi-odoo/ untuk menambah wawasan implementasi Odoo ERP.