Cùng là "tự động", nhưng cron và Automated Action trả lời hai câu hỏi khác nhau. Cron hỏi "mấy giờ rồi?" — đến giờ hẹn thì chạy. Automated Action hỏi "có ai vừa động vào dữ liệu không?" — có bản ghi được tạo/sửa/xoá thì chạy ngay. Chọn nhầm cơ chế là hoặc trễ (đợi cron tới lượt) hoặc lãng phí (cron quét liên tục thứ vốn chỉ cần phản ứng khi có thay đổi). Bài này dựng một Automated Action thật và đo nó bắn tức thì.

Automated Action chạy theo sự kiện

Automated Action là model base.automation (cần app base_automation). Nó gắn vào một model, chọn một trigger (loại sự kiện), và chạy một server action mỗi khi sự kiện đó xảy ra trên bản ghi:

Ảnh chụp đoạn mã XML nền tối khai record base.automation id auto_chao_the_moi với name Chào mừng thẻ mới, model_id ref model_quan_the_thanh_vien, trigger on_create kèm chú thích bắn khi tạo bản ghi; tiếp theo là record ir.actions.server gắn vào automation qua base_automation_id, state code, code gọi record message_post đăng lời chào, kèm chú thích record là bản ghi vừa kích hoạt; dưới cùng chú thích các trigger on_create on_write on_create_or_write on_unlink on_change on_archive on_state_set on_time không cần lịch

Hình 1: Một base.automation với trigger="on_create" gắn vào model thẻ, kèm một ir.actions.server (base_automation_id trỏ về quy tắc). Khi có thẻ mới được tạo, Odoo tự chạy server action đó với biến record là chính bản ghi vừa tạo. Danh sách trigger rất giàu: on_create, on_write, on_create_or_write, on_unlink, on_change, on_archive, on_state_set... — tất cả đều là sự kiện dữ liệu, không dính gì tới đồng hồ.

Trên giao diện, quy tắc này nằm ở Cài đặt → Kỹ thuật → Quy tắc tự động hoá:

Ảnh chụp form Quy tắc tự động hoá của Odoo tên Chào mừng thẻ mới, trường Mô hình là Thẻ thành viên, trường Kích hoạt là Khi tạo, dòng Áp dụng cho ghi Khớp tất cả hồ sơ với nút Thêm điều kiện và 4 bản ghi, tab Tác vụ cần thực hiện liệt kê một tác vụ Đăng lời chào lên thẻ mới, khung nhật ký ghi Automation Rule created

Hình 2: Quy tắc tự động hoá thật. Kích hoạt: "Khi tạo" (on_create); Mô hình: Thẻ thành viên; ô Áp dụng cho cho phép thêm điều kiện lọc (chỉ chạy khi thẻ khớp domain nào đó); tab Tác vụ cần thực hiện chứa server action "Đăng lời chào lên thẻ mới". Đây là bản dựng bằng XML, nhưng người vận hành có thể tạo/sửa ngay trên giao diện này mà không cần lập trình.

Đo: nó bắn tức thì

Khác biệt lớn nhất so với cron là thời điểm. Tạo một thẻ trong shell và kiểm ngay:

new = env['quan.the.thanh.vien'].create({'name': 'TEST-AUTO-001', 'hang_the': 'bac'})
# ngay sau create, automation on_create đã chạy:
new.message_ids.filtered(lambda m: 'Chào mừng thẻ mới' in (m.body or ''))
# -> 1 message: "Chào mừng thẻ mới được tạo tự động (automated action)"

Không chờ một giây nào — thẻ vừa create xong đã có lời chào trong khung trao đổi. So với cron ở phần trước: cron phải đợi tới nextcall mới chạy. Đó là toàn bộ sự khác biệt về bản chất.

Chọn cái nào

Ảnh sơ đồ so sánh hai cột trên nền kem tiêu đề Automated Action vs Cron chạy theo gì. Cột trái Automated Action base.automation theo sự kiện: kích hoạt khi dữ liệu đổi với các nhãn on_create on_write on_unlink on_change on_state_set, chạy ngay lúc bản ghi tạo hoặc sửa, ngữ cảnh có record vừa kích hoạt, cần app base_automation, hợp cho phản ứng tức thì theo thao tác. Cột phải Cron ir.cron theo lịch: kích hoạt đến giờ đã hẹn với interval_number và interval_type, chạy định kỳ nền scheduler, ngữ cảnh record bằng None nên tự search, có sẵn trong base, hợp cho quét dọn nhắc theo chu kỳ. Dòng dưới ghi đã đo tạo thẻ TEST-AUTO-001 thì automation on_create bắn ngay thẻ mới có lời chào không chờ scheduler còn cron phải tới nextcall mới chạy

Hình 3: Hai cơ chế, hai câu trả lời. Automated Action phản ứng tức thì theo thao tác — hợp khi cần validate/điền/ghi log ngay lúc người dùng tạo hay sửa bản ghi, và code có sẵn record để làm việc trực tiếp. Cron chạy theo chu kỳ — hợp khi cần quét toàn bộ, dọn dữ liệu, nhắc hạn hàng loạt, và phải tự search vì không có bản ghi cụ thể.

Một điểm hay nhầm: on_time của Automated Action nghe như "theo thời gian" nhưng nó vẫn là theo mốc của từng bản ghi (ví dụ "3 ngày sau ngày cấp") — Odoo hiện thực nó bằng một ir.cron ngầm quét các bản ghi tới mốc. Nếu việc của bạn là "mỗi đêm quét tất cả", dùng cron thẳng vẫn rõ ràng hơn.

Ba ý mang về

  1. Cron chạy theo LỊCH (interval_number/interval_type, tự search vì không có bản ghi cụ thể); Automated Action chạy theo SỰ KIỆN dữ liệu (on_create/on_write/...), có sẵn record vừa kích hoạt.
  2. Automated Action bắn tức thì ngay lúc tạo/sửa — đo thật: thẻ vừa create đã có message; cron thì phải tới nextcall.
  3. Chọn theo nhu cầu: phản ứng tức thì theo thao tác → Automated Action (cần app base_automation); quét/dọn/nhắc theo chu kỳ → cron. on_time chỉ là cron ngầm theo mốc từng bản ghi.

Cả hai cơ chế trên hay đi kèm việc gửi email tự động — chào khách mới, nhắc hạn. Muốn email đẹp và tái dùng được thì cần một mẫu. Phần sau dựng mail.template khai bằng XML: nội dung động, trường QWeb, và cách gọi gửi từ code.