Bỏ qua để đến Nội dung
Soul of NOTE
  • Khóa học
  • Check-in
    • NOTE
    • Headspace Vietnam
    • Fosllea
  • Diễn đàn
  • Company
    • Blog
    • Success Stories
  • 0
  • 0
  • Đăng nhập
Soul of NOTE
  • 0
  • 0
    • Khóa học
    • Check-in
      • NOTE
      • Headspace Vietnam
      • Fosllea
    • Diễn đàn
    • Company
      • Blog
      • Success Stories
  • Đăng nhập

[T13] T13 — Automation Rule + Batch Script = Duplicate Risk

  • Tất cả blog
  • Knowledge Base
  • [T13] T13 — Automation Rule + Batch Script = Duplicate Risk
  • 15 tháng 3, 2026 bởi
    [T13] T13 — Automation Rule + Batch Script = Duplicate Risk
    Viet Nguyen
    ⛔ CRITICAL  |  Category: Odoo Tips  |  ID: T13  |  Owner: CEO

    T13 — Automation Rule + Batch Script = Duplicate Risk

    Tóm tắt

    Khi Odoo có Automated Action active trên 1 model (ví dụ: auto-invoice on pos.order state change), và ta chạy batch script gọi cùng method (action_pos_order_invoice) → cả rule VÀ script đều fire → tạo duplicate.

    Sự cố 1 (2026-03-14) — Automation + Batch Script

  • Automation rule "Auto Invoice POS" active (on_state_set → create invoice + post)
  • Script backfill_pos_invoices.py gọi action_pos_order_invoice() cho 189 orders
  • Kết quả: 17 orders đầu tiên bị tạo 2 invoices (22.6M VND duplicate)
  • Duplicate invoices đã posted + reconcile → không cancel được qua API
  • Sự cố 2 (2026-03-15) — Automation + Manual Session Close

  • Automation rule fire khi order state change (on_state_set)
  • Nhân viên đóng POS session → click "Create Invoice" → gọi action_pos_order_invoice() trực tiếp
  • Cả 2 source tạo invoice → Invoice A (automation) bị ghi đè bởi Invoice B (manual)
  • Invoice A thành orphan (posted, reconciled, không link order nào)
  • Ảnh hưởng: HS Lotte — 1 orphan posted 355,320đ (INV/2026/00074)
  • Fix: tắt rule #12 + cancel orphan thủ công trên UI
  • Root cause: on_state_set trigger conflict với POS session close flow
  • Script check: scripts/check_pos_automation.py (--disable/--enable/--check-dupes)
  • Quy tắc cứng

    TRƯỚC khi chạy batch script:

    1. CHECK automation rules active trên model sẽ chạm 2. TẮT automation rules: base.automation.write([[rule_id], {'active': False}]) 3. CHẠY batch script 4. BẬT LẠI automation rules

    Code pattern an toàn:

    Disable rule

    models.execute_kw(db, uid, api_key, 'base.automation', 'write', [[rule_id], {'active': False}]) try: # Run batch for order in orders: models.execute_kw(...) finally: # Re-enable rule models.execute_kw(db, uid, api_key, 'base.automation', 'write', [[rule_id], {'active': True}])

    Automation rule code nên có guard:

    ĐÚNG — check trước khi tạo

    if not record.account_move: record.action_pos_order_invoice()

    SAI — không check

    record.action_pos_order_invoice() # Có thể tạo duplicate

    Ảnh hưởng

  • Duplicate invoices → sổ kế toán sai (ghi nhận doanh thu 2 lần)
  • Reconcile → POS payment link với cả 2 invoices → không cancel được qua API
  • Fix thủ công: kế toán phải unreconcile + draft + cancel trên UI
  • Quy tắc bổ sung — Automation vs UI Manual Action

  • on_state_set trigger trên pos.order sẽ conflict với POS session close flow
  • POS session close gọi action_pos_order_invoice() trực tiếp → KHÔNG qua guard trong automation code
  • Guard if not record.account_move chỉ bảo vệ phía automation, không chặn UI side
  • Giải pháp: override POS session close flow HOẶC dùng trigger khác (scheduled action thay vì real-time)
  • Checklist

  • [ ] Batch script chạm model có automation rule không?
  • [ ] Đã tắt rule trước khi chạy?
  • [ ] Code có guard if not record.field trước khi tạo?
  • [ ] Bật lại rule sau khi xong?
  • [ ] Automation rule có conflict với UI manual action không? (session close, button click)
  • [ ] Test trên staging: tạo order → pay → close session → verify chỉ 1 invoice

  • 📚 Published from Company Knowledge Base — T13
    Last updated: 2026-03-14
    Review by: 2026-06-12

    trong Knowledge Base
    # Odoo Tips
    [T12] Tóm tắt



    Bản quyền thuộc CÔNG TY TNHH NOTE
    Cung cấp bởi Odoo - Một nền tảng thương mại điện tử mã nguồn mở hàng đầu