[Odoo 18] Automation di Odoo: Scheduled Action (Cron Job)

Pendahuluan

Automation merupakan salah satu fitur yang penting untuk efisiensi operasional sehingga menjalankan proses secara otomatis tanpa campur tangan pengguna saat terjadinya aksi. Di Odoo, fitur ini dikenal dengan istilah Scheduled Action atau Cron Job. Automation dapat menjadwalkan proses rutin seperti mengirim email, menghitung ulang data, atau membersihkan data lama, semua dijalankan secara otomatis di latar belakang.

A. Scheduled Action Odoo

Scheduled Action dapat menjalankan fungsi Python secara otomatis pada waktu-waktu tertentu. Setiap Scheduled Action didefinisikan sebagai record dari model ir.cron, Scheduled Action membutuhkan beberapa data agar dapat berjalan secara otomatis, seperti:

  • Fungsi python yang akan dipanggil

  • Model yang akan digunakan

  • Seberapa sering scheduled action dijalankan (interval waktu)

  • Kondisi pemanggilan (aktif atau tidak)

Contoh penggunaannya antara lain:

  • Mengirim reminder email secara otomatis setiap hari

  • Menutup invoice yang belum dibayar setelah 30 hari

  • Menarik data API eksternal secara periodik

B. Kelebihan Automation di Odoo

  • Efisiensi Waktu: Tugas berulang dilakukan otomatis atau tanpa campur tangan pengguna saat terjadinya aksi.
  • Reliabel: Berjalan stabil di background, terutama untuk batch process atau maintenance.

  • Konfigurasinya fleksibel: Bisa dijadwalkan per jam, hari, minggu, dll.

  • Bisa di monitor: Status dan log eksekusi bisa dilihat dari UI Odoo.

C. Kekurangan Automation di Odoo

  • Resiko performa: Jika fungsi tidak dioptimasi atau dijalankan terlalu sering, bisa menurunkan performa server, sehingga server terasa lebih lambat.
  • Ketergantungan konfigurasi: Salah setting (misal interval terlalu cepat) bisa menyebabkan spam atau loop.

D. Cara Membuat Scheduled Action di Odoo 18

1. Buat Fungsi Python yang Akan Dipanggil

Membuat fungsi yang akan eksekusi oleh Scheduled Action di dalam file Python dan di dalam model yang di inginkan. Contoh fungsi nya sebagai berikut:

from odoo import models, fields
from datetime import datetime

class CustomModel(models.Model):
  _name = 'custom.model'

  name = fields.Char()
  last_checked = fields.Datetime()

  def check_schedule_action(self):
      self.env['custom.model'].search([]).write({
          'last_checked': datetime.now()
      })

2. Definisikan Scheduled Action di XML

Membuat data Scheduled Action di dalam file XML. Contoh data nya sebagai berikut:

<odoo>
  <record id="ir_cron_check_custom_model" model="ir.cron">
      <field name="name">Check Custom Model Time</field>
      <field name="model_id" ref="model_custom_model"/>
      <field name="state">code</field>
      <field name="code">model.check_schedule_action()</field>
      <field name="interval_type">minutes</field>
      <field name="interval_number">5</field>
      <field name="numbercall">-1</field>
      <field name="active" eval="True"/>
  </record>
</odoo>

Penjelasan field penting:

E. Contoh Penggunaan Scheduled Action

Salah satu fitur Scheduled Action di Odoo 18 adalah membuat pengingat event di kalender. Fungsi tersebut berada di model calendar.alarm_manager di modul Calendar sehingga fungsi tersebut harus diletakkan di dalam model tersebut dan menggunakan model tersebut di XML. Contoh code nya seperti berikut:

Contoh file python: 

@api.model
   def _send_reminder(self):
       # Executed via cron
       events_by_alarm = self._get_events_by_alarm_to_notify('email')
       if not events_by_alarm:
           return

       event_ids = list(set(event_id for event_ids in events_by_alarm.values() for event_id in event_ids))
       events = self.env['calendar.event'].browse(event_ids)
       attendees = events.attendee_ids.filtered(lambda a: a.state != 'declined')
       alarms = self.env['calendar.alarm'].browse(events_by_alarm.keys())
       for alarm in alarms:
           alarm_attendees = attendees.filtered(lambda attendee: attendee.event_id.id in events_by_alarm[alarm.id])
           alarm_attendees.with_context(
               mail_notify_force_send=True,
               calendar_template_ignore_recurrence=True,
               mail_notify_author=True
           )._send_mail_to_attendees(
               alarm.mail_template_id,
               force_send=True
           )

Contoh file XML: 

<?xml version="1.0?">
<odoo>
   <data noupdate="1">
       <!-- Scheduler for Event Alarm-->
       <record forcecreate="True" id="ir_cron_scheduler_alarm" model="ir.cron">
           <field name="name">Calendar: Event Reminder</field>
           <field name="model_id" ref="model_calendar_alarm_manager"/>
           <field name="state">code</field>
           <field name="code">model._send_reminder()</field>
           <field eval="True" name="active" />
           <field name="user_id" ref="base.user_root" />
           <field name="interval_number">1</field>
           <field name="interval_type">days</field>
           <field name="numbercall">-1</field>
           <field eval="False" name="doall" />
       </record>
   </data>
</odoo>

Hasil dari kode tersebut akan tampil seperti gambar dibawah atau dapat kita lihat di UI Odoo pada menu Settings > Technical > Scheduled Actions

Ketika schedule action tersebut dijalankan maka, kita akan mendapatkan notifikasi berupa popup di sebelah kanan layar yang menampilkan informasi dari agenda yang telah dibuat di dalam modul kalender. Berikut hasil dari penerapan schedule action pada reminder calendar.

Jika kita memperhatikan log yang berjalan maka, kita akan menemukan informasi bahwa schedule action tersebut berjalan dengan sukses. Berikut cuplikan log saat schedule action Event Reminder dijalankan secara manual.


​Ingin pahami Odoo lebih dalam atau butuh bantuan teknis? Arkana siap membantu!

  Writer

Fadli Fatanah
Software Engineer



Share this post
Tags
[Odoo 18] Mengenal ORM di Odoo: Model & Field