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

[T04] T04 — Payroll Accounting trên Odoo 19 — Lessons Learned

  • Tất cả blog
  • Knowledge Base
  • [T04] T04 — Payroll Accounting trên Odoo 19 — Lessons Learned
  • 15 tháng 3, 2026 bởi
    [T04] T04 — Payroll Accounting trên Odoo 19 — Lessons Learned
    Viet Nguyen
    ⚠️ HIGH  |  Category: Odoo Tips  |  ID: T04  |  Owner: CEO

    T04 — Payroll Accounting trên Odoo 19 — Lessons Learned

    1. hr.version thay hr.contract

    Odoo 19 dùng hr.version thay vì hr.contract. Payslip dùng version_id.
  • is_in_contract và is_current: computed, KHÔNG stored → không filter qua domain, phải filter trong Python
  • state field: KHÔNG tồn tại trên hr.version
  • employment_type_id: KHÔNG tồn tại trên hr.version, thay bằng contract_type_id
  • 2. Work Entries

  • generate_work_entries(employee_ids, date_from, date_to) trên hr.employee
  • Chỉ generate cho WES=calendar. WES=attendance → Odoo auto-create khi tạo hr.attendance records
  • generate_work_entries return [] (empty) cho attendance-based employees — đây là ĐÚNG, không phải lỗi
  • Duplicate work entries có thể xảy ra khi gọi generate nhiều lần → cần cleanup trước khi test payslip
  • 3. Payroll Journal

  • journal_id nằm trên hr.payroll.structure (NOT structure_type)
  • hr.payroll.structure.type không có journal_id và không truy cập được qua JSON-2
  • Odoo tự tạo "Salaries" journal (code=SLR) cho mỗi company khi cài payroll module
  • Nếu company mới (VD: Fosllea) chưa có → cần tạo thủ công
  • 4. Account Mapping trên Salary Rules

  • account_debit và account_credit nằm trên hr.salary.rule (NOT hr.payslip.line)
  • Khi confirm payslip → Odoo tạo account.move với lines theo mapping từ rules
  • Mapping theo TT133:
  •   BASIC/ALW:    Nợ 6421/6411  Có 3341
      BHXH NV:      Nợ 3341       Có 33831 (trừ vào lương → nộp BHXH)
      BHXH CT:      Nợ 6421/6411  Có 33831 (CP DN → nộp BHXH)
      TNCN:         Nợ 3341       Có 33351
      KPCĐ:         Nợ 6421/6411  Có 33821
      

    5. XML-RPC Gotcha: action_payslip_done returns None

  • hr.payslip.action_payslip_done() returns None
  • Odoo XML-RPC marshaller dùng allow_none=False mặc định
  • Server-side error: TypeError: cannot marshal None unless allow_none is enabled
  • Workaround: catch xmlrpc.client.Fault chứa 'cannot marshal None', coi như thành công, verify state sau đó
  • Payslip state sau confirm: validated (KHÔNG phải done)
  • 6. Odoo 19 Account — Multi-company

  • account.account KHÔNG có company_id field (dùng company_ids many2many)
  • Không thể filter [('company_id', 'in', [3,6,7])] → query không filter, filter Python
  • Nhưng COA shared across companies → account IDs giống nhau cho cả 3 công ty
  • 7. Phân chia chi phí lương theo bộ phận

  • Không bắt buộc gộp hết vào 6421
  • Phân chia: 6421 (quản lý), 6411 (bán hàng), 6220 (sản xuất) → đúng TT133
  • Cách implement: set @EXPENSE account khác nhau theo Structure (Hourly=6411, Regular=6421)
  • Effort: 1 lần setup, chạy mãi
  • 8. Multi-company default gotcha

    Khi create records qua API, Odoo gán default cho company-specific fields dựa trên company của API user (KHÔNG phải company_id trong vals). Ảnh hưởng: journal_id, warehouse_id, sequence_id...
  • Root cause: script 02 tạo structures cho HS/Fosllea nhưng không set journal_id → Odoo gán journal NOTE (id=49) cho tất cả
  • Fix: luôn set rõ company-specific fields khi create multi-company records
  • Alt: dùng context={'allowed_company_ids': [co_id]} nhưng XML-RPC không hỗ trợ context dễ dàng
  • Checklist trước khi apply production

  • [ ] Verify account IDs giống nhau staging ↔ production (COA shared)
  • [ ] Verify journal "Salaries" tồn tại cho mỗi company trên production
  • [ ] Verify structure IDs giống nhau (nếu scripts tạo mới → IDs có thể khác)
  • [ ] Test confirm 1 payslip → check journal entry cân bằng

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

    trong Knowledge Base
    # Odoo Tips
    [T03] T03 — Odoo 19 Leave Management: field names thay đổi so với docs



    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