Compute dan Inverse pada Kustomisasi Odoo 17

Feb 1, 2025 | Odoo 17 Development

Kita mungkin menginginkan timbal balik dalam compute pada pengembangan aplikasi dengan Odoo 17. Di sini kita menggunakan compute dan inverse.

Compute dan inverse pada kustomisasi Odoo 17 adalah seperti pada langkah-langkah berikut ini

  1. Start SSH file system
  2. Model asrama.student

    from datetime import datetime, timedelta
    from odoo import fields, models, api
    
    class AsramaStudent(models.Model):
        _name = 'asrama.student'
        _description = 'Informasi Asrama Student'
    
        nama = fields.Char('Nama pelajar')
        gender = fields.Selection(
            [('male','Male'),('female','Female'),('other','Other')],
            string='Jenis kelamin',
            help='Jenis kelamin pelajar',
        )
        active = fields.Boolean('Active',default=True,help='Activate/Deactive record')
    
        room_id = fields.Many2one('asrama.room','Room',help='Pilih room')
        
        status = fields.Selection(
            [('draft','Draft'),('reservation','Reservation'),('pending','Pending'),('paid','Done'),('discharge','Discharge'),('cancel','Cancel')],
            string='Status',copy=False,default='draft',
            help='Status asrama student'
        )
    
        @api.depends('admission_date','discharge_date')
        
        def _compute_check_duration(self):
            """Mengecek durasi"""
            for rec in self:
                if rec.discharge_date and rec.admission_date:
                    rec.duration = (rec.discharge_date - rec.admission_date).days
    
        def _inverse_duration(self):
            for stu in self:
                if stu.discharge_date and stu.admission_date:
                    duration = (stu.discharge_date - stu.admission_date).days
                    if duration != stu.duration:
                        stu.discharge_date = (stu.admission_date + timedelta(days=stu.duration)).strftime('%Y-%m-%d')
                        
        admission_date = fields.Date('Tanggal masuk',help='Tangga di mana pelajar masuk asrama',
            default=fields.Datetime.today())
    
        discharge_date = fields.Date('Tanggal keluar',help='Tanggal di mana pelajar keluar asrama')
    
        duration = fields.Integer('Durasi', compute='_compute_check_duration',inverse='_inverse_duration',
            help='Durasi lamanya tinggal')
    
  3. View asrama student

    <?xml version="1.0" encoding="utf-8"?>
    <odoo>
        <!-- asrama.student form view -->
        <record id="asrama_student_view_form" model="ir.ui.view">
            <field name="name">asrama.student.view.form</field>
            <field name="model">asrama.student</field>
            <field name="arch" type="xml">
                <form string="">
                    <sheet>
                        <group>
                                <group>
                                    <field name="name"/>
                                    <field name="gender"/>
                                    <field name="active"/>
                                </group>
                                <group>
                                    <field name="room_id"/>
                                    <field name="hostel_id"/>
                                    <field name="status"/>
                                    <field name="admission_date"/>
                                    <field name="discharge_date"/>
                                    <field name="duration"/>
                                </group>                    
                        </group>
                    </sheet>
                </form>
            </field>
        </record>
    
       <record model="ir.actions.act_window" id="action_asrama_student">
                <field name="name">Students</field>
                <field name="type">ir.actions.act_window</field>
                <field name="res_model">asrama.student</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">
                        Create Student.
                    </p>
                 </field>
        </record>
    
        
            <!-- This Menu Item must have a parent and an action -->
        <menuitem id="asrama_student_menu" name="Pelajar-pelajar" parent="hostel_main_menu" action="action_asrama_student" sequence="3"/>
    
    </odoo>
    
  4. Manifest

    {
        'name': 'Manajemen Asrama',
        "data":[
            "security/hostel_security.xml",
            "security/ir.model.access.csv",
            "views/hostel.xml",
            "views/asrama_room.xml",
            "views/asrama_student.xml",
            "data/data.xml",
        ],
    }
    
  5. Start Odoo dengan upgrade module
  6. Tabel asrama_student
  7. Field duration diisi secara otomatis


  8. Tanggal terisi secara otomatis
    Save & Close:


    Reload:


    Pilih line:


    Terlihat isi benar:

  9. Tampilan langsung ke Student

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