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

[T05] T05 — Odoo 19 Payroll: default rules tự tạo → payslip tính GẤP ĐÔI

  • Tất cả blog
  • Knowledge Base
  • [T05] T05 — Odoo 19 Payroll: default rules tự tạo → payslip tính GẤP ĐÔI
  • 15 tháng 3, 2026 bởi
    [T05] T05 — Odoo 19 Payroll: default rules tự tạo → payslip tính GẤP ĐÔI
    Viet Nguyen
    ⛔ CRITICAL  |  Category: Odoo Tips  |  ID: T05  |  Owner: CEO

    T05 — Odoo 19 Payroll: default rules tự tạo → payslip tính GẤP ĐÔI

    Vấn đề

    Khi tạo custom Salary Structure trên Odoo 19, Odoo tự động thêm 8 default rules (BASIC, GROSS, NET, v.v.) vào mỗi structure. Nếu script cũng tạo custom rules cùng code → payslip tính 2 lần cho mỗi dòng.

    Lỗi rất tinh vi: không báo lỗi, payslip hiển thị bình thường, chỉ phát hiện khi so sánh số liệu (BASIC gấp đôi, NET sai).

    Ví dụ thực tế

    5 custom structures × 8 default rules = 40 rules trùng lặp cần archive.

    Structure "Regular Pay — NOTE":
      ✅ Custom BASIC (id=130, seq=1)    ← script tạo
      ❌ Default BASIC (id=200, seq=0)   ← Odoo tự tạo → TÍNH 2 LẦN
      ✅ Custom GROSS (id=140, seq=10)
      ❌ Default GROSS (id=201, seq=0)   ← TÍNH 2 LẦN
      ...
    

    Giải pháp

    Archive (KHÔNG xóa) default rules khỏi custom structures:

    Archive 8 default rules per structure (5 structures = 40 rules)

    client.write('hr.salary.rule', [default_rule_ids], {'active': False})
  • Không xóa vì payslip lines có thể tham chiếu → constraint error
  • Archive (active=False) → rules không active nhưng data nguyên vẹn
  • Script: HR/scripts/05_cleanup_default_rules.py
  • Cách phát hiện

    1. Tạo Pay Run → tạo payslip → check BASIC line 2. Nếu BASIC = wage × 2 → có default rule trùng 3. Hoặc: search_read('hr.salary.rule', [('struct_id','=',X),('code','=','BASIC')], ['id','name','active']) 4. Nếu trả về 2+ records → archive cái có sequence=0 (default)

    Áp dụng khi

  • Tạo custom salary structures qua script
  • Payslip cho số liệu gấp đôi mà không rõ nguyên nhân
  • Chạy cleanup TRƯỚC khi tạo Pay Run đầu tiên

  • 📚 Published from Company Knowledge Base — T05
    Last updated: 2026-03-11
    Review by: 2026-06-09

    trong Knowledge Base
    # Odoo Tips
    [T04] T04 — Payroll Accounting trên Odoo 19 — Lessons Learned



    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