Scheduled Actions atau biasa disebut Cron Job adalah sebuah action yang akan dijalankan secara otomatis dalam waktu tertentu, bisa setiap beberapa menit sekali, beberapa jam sekali, atau beberapa hari sekali. Biasanya Scheduled Actions digunakan untuk pekerjaan yang rutin dilakukan tetapi tidak membutuhkan aksi pengguna, misal membuat laporan di akhir bulan, mengirim email kepada customer jika invoice tidak dibayar setelah beberapa hari, memproses transaksi lama dll. Pada tutorial ini kita akan membuat Scheduled Actions untuk meng-cancel Sales Order jika usianya lewat lebih dari 7 hari.
Scheduled Actions di simpan pada model ir.cron oleh karena itu untuk membuat Scheduled Actions kita perlu membuat record dari model ir.cron. Berikut ini adalah contoh kodenya.
<?xml version='1.0' encoding='utf-8'?> <odoo> <record id="cancel_sales_order_scheduler" model="ir.cron"> <field name="name">Cancel Sales Order</field> <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 name="doall">0</field> <field name="model_id" ref="model_sale_order"/> <field name="code">model.cancel_old_sales_order()</field> <field name="priority">10</field> </record> </odoo>
Isi id dengan kata-kata bebas, biasanya setiap kata dipisahkan dengan underscore. Sedangkan pada attribute model isi nama model dari Scheduled Actions yaitu ir.cron.
Isi field name dengan kata-kata bebas. Ini adalah nama dari record yang kita buat.
Isi field user_id dengan base.user_root. User base.user_root adalah user bawaan odoo dengan nama OdooBot. Anda bisa menggunakan user lain tapi tidak saya sarankan, karena nanti bisa terbentur hak akses.
Isi field interval_type dengan pilihan minutes, hours, days, weeks, atau months. Field ini digunakan untuk mengatur satuan waktu Scheduled Actions.
Isi field interval_number dengan integer bernilai bebas. Field ini jika dikombinasikan dengan field interval_type akan digunakan untuk mengatur seberapa sering Scheduled Actions akan dijalankan. Pada contoh kode di atas Scheduled Actions akan dijalankan setiap sehari sekali.
Isi field numbercall dengan integer bernilai bebas. Field ini digunakan untuk mengatur batas berapa kali Scheduled Actions akan dijalankan. Jika nilainya negatif artinya Scheduled Actions tidak dibatasi. Scheduled Actions akan terus dapat dieksekusi sampai kapanpun.
Isi field doall dengan nilai 0 untuk nilai False atau 1 untuk nilai True. Field ini digunakan untuk mengatur apakah Scheduled Actions yang terlewat, misal karena ada gangguan teknis, akan dieksekusi ulang atau tidak setelah server kembali normal.
Isi field model_id dengan nama model dimana kita menulis kode python yang akan dijalankan oleh Scheduled Actions. Perhatikan penulisannya.
Isi field code dengan nama method / function yang akan dipanggil oleh Scheduled Actions. Berikut adalah contoh kodenya, yang saya buat di model sale.order
# -*- coding: utf-8 -*- from odoo import api, fields, models, _ from datetime import datetime, timedelta class SalesOrder(models.Model): _inherit = 'sale.order' def cancel_old_sales_order(self): # batas hari limit = 7 # tanggal hari ini date_today = datetime.today() # tanggal yang seharusnya sudah boleh dicancel cancel_date = date_today - timedelta(days = limit) # cari sales order yang tanggalnya sesuai dan belum di confirm old_order = self.env['sale.order'].search([('date_order', '<', cancel_date), ('state','in', ['draft','sent'])]) # cancel sales order yang sesuai kriteria old_order.action_cancel()
Isi field priority dengan integer bernilai bebas. Scheduled Actions dengan nilai priority lebih kecil akan dieksekusi terlebih dahulu.
Import baik file .xml dan .py kemudian install module.
Untuk melihat daftar Scheduled Actions, masuk menu Settings >> Technical >> Automation >> Scheduled Actions. Jika kita buka salah satu Scheduled Actions, pada field Next Execution Date akan terlihat tanggal dan jam kapan Scheduled Actions tersebut akan dieksekusi kembali. Anda dapat mengubah field tersebut agar Scheduled Actions lebih cepat atau lebih lambat untuk dieksekusi.

PENTING !!!
Jika aktivitas user anda ramai dan Scheduled Actions anda banyak mengolah data, misal melakukan aksi write, pastikan Scheduled Actions tersebut tidak dieksekusi di jam-jam sibuk, dengan cara mengatur field Next Execution Date. Karena bisa mengakibatkan error concurrence upate, yaitu error pada postgre sql dimana satu buah record diubah oleh banyak proses.
Anda juga dapat memaksa agar Scheduled Actions segera dieksekusi saat itu juga, diluar jadwalnya, dengan cara menekan tombol Run Manually.
TIPS
Pada kode diatas kita membatasi bahwa sales order yang usianya lebih dari 7 hari akan dicancel secara hardcode. Lalu bagaimana jika user tiba-tiba kepikiran untuk mengubahnya jadi 2 hari ?
Agar kita tidak perlu mengubah kode setiap saat, kita bisa menggunakan function parameter. Berikut ini adalah method cancel_old_sales_order di atas yang sudah diubah dengan menambahkan sebuah function parameter.
# -*- coding: utf-8 -*- from odoo import api, fields, models, _ from datetime import datetime, timedelta class SalesOrder(models.Model): _inherit = 'sale.order' def cancel_old_sales_order(self, force_limit=None): # batas hari limit = 7 # cek apakah user mengisi nilai force_limit atau tidak if force_limit: limit = force_limit # tanggal hari ini date_today = datetime.today() # tanggal yang seharusnya sudah boleh dicancel cancel_date = date_today - timedelta(days = limit) # cari sales order yang tanggalnya sesuai dan belum di confirm old_order = self.env['sale.order'].search([('date_order', '<', cancel_date), ('state','in', ['draft','sent'])]) # cancel sales order yang sesuai kriteria old_order.action_cancel()
Jika user tidak mengisi parameter force_limit di Scheduled Actions, maka Scheduled Actions hanya akan mengcancel sales order yang sudah berusia 7 hari. Tetapi jika user mengisi force_limit seperti pada gambar di bawah ini, Scheduled Actions hanya akan mengcancel sales order yang usianya sesuai dengan nilai force_limit yang diinput user.
Atau anda juga bisa menggunakan system parameter.
