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

[T12] Tóm tắt

  • Tất cả blog
  • Knowledge Base
  • [T12] Tóm tắt
  • 15 tháng 3, 2026 bởi
    [T12] Tóm tắt
    Viet Nguyen
    ⛔ CRITICAL  |  Category: Odoo Tips  |  ID: T12  |  Owner: CEO

    Tóm tắt

    LUÔN NHỚ: Odoo có 3 công ty — NOTE (ID 6), HS (ID 7), Fosllea. Mọi script chạm tới accounting, products, HR, hoặc bất kỳ model có property fields PHẢI xử lý cho TẤT CẢ companies, không chỉ company mặc định.

    Bài học (Incident 2026-03-14)

    Khi tạo category "Discount & Loyalty" + set property_account_income_id = 5210:

  • Script chỉ write({'property_account_income_id': 891}) → chỉ set cho NOTE
  • HS vẫn dùng DEFAULT (5110) → discount vào sai tài khoản cho HS
  • Phải set riêng cho mỗi company với context={'force_company': company_id}
  • Quy tắc cứng

    1. Property fields = per-company

    Các field có prefix property_ lưu giá trị khác nhau per company:
  • property_account_income_id (product → income account)
  • property_account_expense_id (product → expense account)
  • property_account_income_categ_id (category → income account)
  • property_account_payable_id (partner → payable account)
  • property_account_receivable_id (partner → receivable account)
  • property_stock_* (stock locations)
  • 2. Khi write property field → loop qua TẤT CẢ companies

    COMPANY_IDS = [6, 7]  # NOTE, HS (thêm Fosllea khi cần)
    

    for company_id in COMPANY_IDS: # Tìm account cho company này acc = models.execute_kw(db, uid, api_key, 'account.account', 'search_read', [[('code', '=', '5210')]], {'fields': ['id'], 'limit': 1, 'context': {'allowed_company_ids': [company_id], 'force_company': company_id}})

    if acc: models.execute_kw(db, uid, api_key, 'product.product', 'write', [product_ids, {'property_account_income_id': acc[0]['id']}], {'context': {'allowed_company_ids': [company_id], 'force_company': company_id}})

    3. Account IDs KHÁC NHAU per company

    Cùng code "5210" nhưng ID khác:
  • NOTE: 5110=889, 5111=?, 5210=891
  • HS: 5110=1106, 5111=?, 5210=1108
  • KHÔNG BAO GIỜ hardcode account ID — luôn search by code + company context.

    4. Odoo 19: account.account không có company_id field

  • Odoo 19 dùng shared chart of accounts
  • Filter by company qua context, không qua domain ('company_id','=',X)
  • Sẽ lỗi Invalid field account.account.company_id nếu filter bằng domain
  • 5. Server action (Automated Actions) — dùng with_company()

    ĐÚNG:

    for company in env['res.company'].search([]): acc = env['account.account'].with_company(company).search([('code','=','5210')], limit=1) if acc: records.with_company(company).write({'property_account_income_id': acc.id})

    SAI:

    records.write({'property_account_income_id': some_fixed_id}) # Chỉ set cho 1 company

    6. Checklist trước khi viết Odoo script

  • [ ] Script có chạm model nào có property fields không?
  • [ ] Nếu có → loop qua COMPANY_IDS
  • [ ] Account IDs có hardcode không? → search by code + context
  • [ ] Test output cho CẢ 2 companies (NOTE + HS)
  • [ ] Verify trên Odoo UI: switch company → check giá trị

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

    trong Knowledge Base
    # Odoo Tips
    [T11] T11 — Odoo 19 HR Model Field Gotchas (3 issues)



    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