Bỏ qua để đến Nội dung
Hướng dẫn Đối soát chi phí quảng cáo

Sổ tay vận hành · Module tiny_ads_reconciliation

Hướng dẫn Đối soát chi phí quảng cáo

Từ đề nghị tạm ứng & nạp tiền, ghi nhận chi phí, lập hóa đơn CPQC, đến đối soát với sao kê ngân hàng. Dành cho kế toán & nhân viên vận hành đối soát.

Odoo 18.0 Phiên bản 18.0.2.0.0 Model ads.reconciliation Menu Đối soát Ads
Trục đối soátThẻ / Ví quảng cáo
×
Chiều thời gianKỳ (Từ ngày → Đến ngày)
→ Neo cuối cùng: Sao kê ngân hàng
01

Tổng quan & nguyên tắc

Đối soát gom 4 nguồn dữ liệu về cùng một trục, tính 2 số dư dòng tiền và gắn cờ lệch.

Mỗi phiên đối soát (ads.reconciliation) trả lời một câu hỏi: trong một kỳ, với một thẻ/ví quảng cáo — tiền đã nạp, tiền đã tiêu (spend), hóa đơn đã nhận và tiền thực ra khỏi ngân hàng (sao kê) có khớp nhau không? Bốn nguồn này được gom theo cùng khóa bank_id:

① NẠP
Nạp thực
bank.daily.balance.history.in
Tiền vào ví/thẻ, sinh tự động từ bút toán nạp đã vào sổ.
② SPEND
Chi phí
hr.expense
Chi tiêu quảng cáo, kéo từ nền tảng qua ads.expense.line.
③ HÓA ĐƠN
Hóa đơn CPQC
account.move
Hóa đơn NCC (vendor bill) đã gắn cờ CPQC, đã vào sổ.
④ SAO KÊ
Sao kê
bank.statement.line
Giao dịch ngân hàng import từ file .xlsx (TCB / ACB).
gom theo Thẻ × Kỳ
Phiên đối soát ads.reconciliation → 2 số dư + cờ + trạng thái

Hai luồng thanh toán

LuồngÁp dụngCách hoạt động
A — Nạp ví / tự trừShopee, Google, TikTokNạp tiền vào ví trước; nền tảng tự trừ khi phát sinh spend.
B — Thẻ công tyFacebook…Thẻ bị charge theo ngưỡng; đối soát Hóa đơn ↔ dòng charge sao kê theo 4 số cuối thẻ.

Vòng đời một phiên

draft Nháp reconciled Đã đối soát done Đã chốt settled Đã cân tiền · cancel Hủy

Ràng buộc kỳ: các kỳ cùng một thẻ không được chồng nhau; kỳ mới phải liền sau kỳ trước. Kỳ phải kết thúc trước hôm nay. Phiên đã done không xóa được.

02

Chuẩn bị: khai báo Thẻ / Ví quảng cáo

Làm một lần trước khi đối soát. Thiếu bước này, thẻ sẽ không chọn được vào phiên.

Mở/tạo bản ghi res.partner.bank và khai báo các trường sau:

TrườngÝ nghĩaBắt buộc?
is_ads_cardĐánh dấu là thẻ/ví quảng cáoBắt buộc
card_last44 số cuối thẻ — dùng khớp Hóa đơn ↔ sao kê (luồng thẻ FB)Bắt buộc cho luồng B
track_balanceTheo dõi số dư ví (mặc định bật). Tắt → chạy chế độ flow-onlytùy chọn
bank_account_idTài khoản ngân hàng gốc (khi thẻ là thẻ con của một tài khoản)tùy mô hình
card_ids(Trên tài khoản gốc) danh sách thẻ con — tự sinh khi thẻ con trỏ về gốctự động

Hai mô hình cấu hình

  • Thẻ độc lập — ví Shopee/Google/TikTok hoặc một thẻ FB riêng: một res.partner.bank với is_ads_card = True, không có card_ids.
  • Tài khoản gốc + nhiều thẻ con — tài khoản gốc (thường không phải thẻ), mỗi thẻ con có bank_account_id = gốc và card_last4 riêng. Khi đối soát chọn tài khoản gốc, hệ thống tự gom cả thẻ con (xem mục 11).
Phân loại dòng sao kê (làm kèm)

Vào Đối soát Ads › Cấu hình › Phân loại chi tiết sao kê để kiểm tra bộ ads.statement.line.category. Dữ liệu mẫu có sẵn 5 loại: foreign_fee, bank_fee, interest (không tính vào đối soát), top_upads_cost (is_ads_flow = True → được đưa vào công thức).

03

Kiểm soát số dư theo loại tài khoản

Số dư và lịch sử giao dịch trên res.partner.bank vận hành khác nhau tùy loại tài khoản (wallet_kind) và cờ track_balance. Hiểu phần này để đọc đúng nguồn Nạp và số dư sổ nội bộ.

3.1 · Loại tài khoản — wallet_kind

Trường “Account type” quyết định tài khoản là ví độc lập hay thẻ con của một tài khoản gốc:

Giá trịNhãnVai trò trong kiểm soát số dư
bank_cardTài khoản ngân hàngMặc định. Tài khoản/ví độc lập, tự giữ số dư riêng.
payment_cardThẻ thanh toánThẻ con — trỏ bank_account_id về gốc. Giao dịch ghi lịch sử ở cả gốc lẫn thẻ (xem 3.4).
credit_cardThẻ tín dụngNhư tài khoản độc lập trừ khi gắn bank_account_id.
platform_walletPlatform WalletVí nền tảng (Shopee/Google/TikTok) — luồng A nạp trước.
company_cardCompany cardThẻ công ty dùng chung.
i
Đừng nhầm với bank_account_type

wallet_kind (loại ví/thẻ) khác với bank_account_type = Cá nhân / Công ty. Chỉ tài khoản Công ty mới tự sinh sổ nhật ký ngân hàng (account.journal); tài khoản Cá nhân thì gỡ liên kết journal. Đây là hai trục khai báo độc lập.

3.2 · Công tắc track_balance — có tính số dư hay không

Giá trịHành vi
Bật (mặc định)Tính đầy đủ số dư đầu/cuối/trong kỳ; gắn hóa đơn phải trả vào lịch sử; hiện nút Cân tiền.
TắtChỉ ghi lịch sử giao dịch (tiền vào/ra), KHÔNG tính số dưbalance = 0. Phiên chạy chế độ flow-only (mục 11).

3.3 · Cơ chế tính số dư hằng ngày

Mỗi tài khoản có một chuỗi bản ghi bank.daily.balance.historymỗi ngày một bản ghi (ràng buộc duy nhất bank_id + date). Số dư được tính tuần tự theo ngày, không đệ quy:

Đầu ngàybalance_start
+
Tiền nhậntotal_in
Tiền chuyểntotal_out
=
Cuối ngàybalance_end
  • balance_start của ngày = fixed_balance_start (nếu có ấn định) hoặc balance_end của ngày liền trước.
  • total_in / total_out = tổng các dòng history.in / history.out trong ngày, bỏ qua dòng is_adjust_balance = True (dòng điều chỉnh tay).
  • Số dư hiện tại của tài khoản (balance) = balance_end của ngày mới nhất có lịch sử.
  • Số dư dự kiến: expected_balance_end = balance_end − total_invoice — trừ tiếp các hóa đơn phải trả (bảng kê chi phí đã duyệt, chưa thanh toán) để biết tiền “thực còn dùng được”.
Số dư đầu kỳ & tính lại

Trên form tài khoản: “Thiết lập lại số dư đầu kỳ” (action_setup_balance_start) đặt mốc balance_start / date_start; “Tính lại số dư hằng ngày” (action_recompute_balance_history) chạy lại toàn chuỗi từ ngày sớm nhất bị ảnh hưởng. Nút Hoạt động / Ngừng hoạt động đổi state.

3.4 · Thẻ thanh toán — lịch sử kép (dual-history)

Đây là điểm dễ hiểu nhầm nhất. Khi một thẻ thanh toán (payment_card có tài khoản gốc) giao dịch, hệ thống ghi lịch sử ở hai nơi:

Tài khoản gốc
bank_account_id
  • Nguồn/đích được quy về gốc
  • Giữ số dư tổng của cả nhóm thẻ
Chính thẻ
payment_card
  • Nguồn/đích giữ nguyên là thẻ
  • Vết thẻ lưu ở source/dest_payment_card_id
!
Vì sao không bị cộng đôi khi đối soát

Cùng một lần nạp sinh dòng history.in ở cả gốc lẫn thẻ. Nguồn Nạp của phiên đối soát lọc theo bank_id của chính bản ghi — chọn thẻ thì chỉ đếm dòng của thẻ, chọn gốc thì chỉ đếm dòng của gốc. Nhờ vậy không cộng đôi. Hệ quả: chỉ đối soát ở một cấp (gốc hoặc từng thẻ), không chạy song song cả hai (mục 11).

3.5 · Số dư này vào phiên đối soát ở đâu

Trong phiên đối soátLấy từ cơ chế số dư
Nguồn ① Nạp (amount_topup)Các dòng history.in của thẻ, is_adjust_balance = False, trong kỳ
book_balance_start / book_balance_endbalance_start / balance_end của lịch sử ngày biên (chỉ khi track_balance = True)
Cờ LECH_SODU_HT · nút Cân tiềnChỉ hiện khi tài khoản theo dõi số dư; ẩn khi flow-only
04

Nạp tiền qua Đề nghị tạm ứng

Nguồn ① — Nạp thực. Tiền vào thẻ được ghi nhận qua luồng tạm ứng/thanh toán, tạo bút toán nạp.

Nguồn Nạp không nhập trực tiếp — nó sinh tự động (bank.daily.balance.history.in) khi một bút toán account.move đã vào sổ (posted) có dòng mang receiver_bank_id = thẻ quảng cáo. Do đó việc của bạn là ghi nhận nạp/chuyển tiền vào thẻ cho đúng.

4.1 · Danh mục tạm ứng phải bật cờ CPQC

Trên accounting.employee.advance.category, bật is_advertising_expenses (“Chi phí quảng cáo”). Cờ này lan truyền sang Đề nghị tạm ứng (employee.advance.register.is_advertising_expenses) để hệ thống nhận biết đề nghị thuộc phạm vi quảng cáo.

4.2 · Đề nghị thanh toán — cờ “Là hoá đơn CPQC”

Trên Đề nghị thanh toán (employee.advance.register.payment), tick is_advertising_expenses (“Là hoá đơn CPQC”). Khi tick, hệ thống tự nạp toàn bộ hóa đơn NCC chưa thanh toán có partner là partner của nhân viên (nhà riêng / liên hệ công việc / user) vào chi tiết thanh toán, rồi dựng các dòng chi tiết.

i
Cơ chế lọc hóa đơn tự nạp

Chỉ lấy hóa đơn in_invoice/in_refund, trạng thái posted, payment_state ≠ paid, đúng partner của nhân viên và đúng công ty. Đổi nhân viên khi đang bật cờ → danh sách nạp lại theo nhân viên mới. Bỏ tick → xóa sạch dòng đã nạp (giữ nguyên dòng nhập tay khi chưa từng tick).

4.3 · Sau khi bút toán vào sổ

Khi bút toán thanh toán/nạp được vào sổ với receiver_bank_id trỏ đúng thẻ, một dòng lịch sử history.in được tạo cho thẻ đó. Phiên đối soát đếm nguồn Nạp theo bản ghi của chính thẻ nên với thẻ con (payment_card) tuy sinh lịch sử ở cả gốc lẫn thẻ, không bị cộng đôi.

!
Điều kiện để lọt vào nguồn Nạp

bank_id = thẻ · is_adjust_balance = False · ngày nằm trong kỳ. Nếu nguồn Nạp = 0, kiểm tra bút toán đã posted chưa và receiver_bank_id đã trỏ đúng thẻ chưa.

05

Ghi nhận Chi phí (Spend)

Nguồn ② — chi tiêu quảng cáo thực tế, đồng bộ từ nền tảng thành hr.expense.

Chi phí spend được kéo từ nền tảng quảng cáo theo chuỗi:

Điều kiện để một chi phí lọt vào đối soát

Điều kiệnTrường / giá trị
Tài khoản QC trỏ đúng thẻ trừ tiềnads.account.bank_id = thẻ/ví → quyết định hr.expense.bank_id
Sản phẩm chi phí đúng loạiproduct.default_code = 'CPQC'
Được đánh dấu chi phí quảng cáois_advertising_expenses = True
Đã duyệtstate ∈ (approved, done)
Trong kỳdate thuộc [Từ ngày, Đến ngày]

Cách chạy: dùng nút/wizard “Đồng bộ chi tiêu”, hoặc cron ads_manager_*_action_fetch_expense_* (mặc định active = False — bật khi cần chạy tự động).

06

Lập Hóa đơn CPQC

Nguồn ③ — đây là nguồn hóa đơn mà engine đối soát thực sự đọc.

Mở hóa đơn nhà cung cấp (vendor bill, account.move loại in_invoice) và điền nhóm “Thông tin quảng cáo (CPQC)”:

TrườngGiá trịGhi chú
is_ads_invoiceTrueTự bật khi có dòng sản phẩm CPQC; kế toán tick/bỏ được
card_last44 số cuối thẻGõ đầu thẻ → gợi ý tự điền Thẻ/Ví nếu khớp duy nhất
ads_receiver_bank_idThẻ/Ví CPQCDomain is_ads_card. Là khóa gom của phiên
Trạng tháipostedChỉ hóa đơn đã vào sổ mới được đọc
!
Chặn vào sổ nếu thiếu Thẻ/Ví

Hóa đơn đã tick CPQC nhưng chưa chọn ads_receiver_bank_id sẽ không cho vào sổ — vì thiếu khóa này nó sẽ rớt khỏi mọi phiên đối soát mà không ai biết. Ràng buộc chỉ áp ở trạng thái posted, không cản lúc nháp.

i
Phân biệt với ads.invoice

Các nút “Lấy hóa đơn” (Facebook / TikTok / Shopee) trong tiny_ads_management tạo bản ghi model ads.invoice — đây là sổ tra cứu riêng. Engine đối soát KHÔNG đọc ads.invoice. Muốn một hóa đơn vào đối soát, nó phải là account.move (vendor bill) đã gắn cờ CPQC như trên.

07

Import Sao kê ngân hàng

Nguồn ④ — mốc neo cuối cùng: tiền thực ra khỏi công ty.

Bấm nút “Import sao kê” (biểu tượng ở đầu danh sách) rồi khai báo:

TrườngChọn
bank_idTài khoản GỐC — không chọn thẻ thanh toán con
statement_formatTechcombank hoặc ACB
file_dataFile sao kê .xlsx
  • Gán đầu thẻ tự động: hệ thống tạo một phiên sao kê duy nhất; mỗi dòng được gán bank_id theo 4 số cuối trong diễn giải — khớp thẻ con nào thì gán thẻ đó, không khớp thì gán tài khoản gốc.
  • Tự phân loại: mỗi dòng được gán line_type theo cấu hình mục 02 (khớp domain, ưu tiên loại mới nhất). Có nút “Phân loại lại”. Chỉ dòng is_ads_flow vào công thức.
  • Chống trùng: dedup theo (bank_id, khóa import); import lại cùng file → bỏ qua dòng trùng.
08

Tạo & chạy phiên đối soát

Khi đủ 4 nguồn cho kỳ, tạo phiên và chạy engine.

  1. Chọn Thẻ/Ví và kỳ bank_id (domain is_ads_card), Từ ngày, Đến ngày. Thẻ có card_ids → tự đối soát cấp gốc; thẻ track_balance = False → chạy flow-only.
  2. Bấm “Chạy đối soát” Engine gom 4 nguồn, khớp thẻ, tính 2 số dư + cờ, chuyển trạng thái sang Đã đối soát.
  3. Rà soát cờ Xem badge trạng thái và danh sách cờ (mục 09). Nếu Cần kiểm tra, phải nhập Giải trình trước khi chốt.
  4. Bấm “Chốt kỳ” Khóa kỳ → trạng thái Đã chốt. Số liệu là snapshot, không đổi khi dữ liệu gốc sửa về sau.
  5. (Chỉ khi theo dõi số dư) Bấm “Cân tiền” Sinh bút toán đưa số dư sổ nội bộ về khớp sao kê → Đã cân tiền.
i
Chạy lại thì sao?

Bấm “Chạy đối soát” lần nữa sẽ rebuild. Các dòng ghép tay (is_manual) được bảo vệ qua wizard xác nhận, không bị rebuild thổi bay.

09

Đọc kết quả: số dư & cờ

Hai số dư dòng tiền, một badge trạng thái, và danh sách cờ lệch.

Hai số dư & công nợ

ton_quy_vi
Nạp Spend

Tiền còn trong ví (chưa tiêu hết).

chua_co_hd
Spend Hóa đơn

Phần đã chi nhưng chưa có hóa đơn.

debt_closing = debt_opening + chua_co_hd — công nợ cuối kỳ được mang sang kỳ kế tiếp cùng thẻ (debt_opening).

Badge trạng thái phân loại

Trường status tổng hợp mức nghiêm trọng của cờ:

Khớp · khop Cảnh báo · canhbao Cần kiểm tra · kiemtra

Khớp = không cờ. Cảnh báo = có cờ mềm (soft). Cần kiểm tra = có cờ cứng (hard) → bắt buộc giải trình khi chốt.

Danh sách cờ (flag_ids)

Mã cờÝ nghĩaMức
THIEU_HDCó spend nhưng không có hóa đơnhard
THIEU_SPENDCó hóa đơn/nạp nhưng không có spendhard
THIEU_NAPCó spend nhưng không có nạphard
AM_QUYSpend vượt số nạp (tồn quỹ ví âm quá ngưỡng)hard
LECH_SPEND_HDLệch Spend ↔ Hóa đơn quá ngưỡnghard
LECH_TIEN_VAOLệch tổng tiền vào: Nạp ↔ sao kê (credit)
LECH_TIEN_RALệch tổng tiền ra: sổ ↔ sao kê (charge)
LECH_SODU_HTLệch số dư sổ nội bộ ↔ sao kêsoft *
LECH_SODU_SKSao kê không liên tục (nghi thiếu dòng)soft *

* Cờ số dư chỉ xuất hiện khi thẻ theo dõi số dư (track_balance = True).

Khớp thẻ (Luồng B) — dòng ads.reconcile.card.line

Mỗi dòng ghép 1 Hóa đơn ↔ 1 dòng charge sao kê (1-1) theo: cùng đầu thẻ + số tiền trong ngưỡng + lệch ngày ≤ day_window. Trạng thái match_state:

khop — đã khớp thieu_sk — HĐ thiếu charge tương ứng chua_hd — charge còn dư, chưa có HĐ
Ngưỡng lệch (mặc định)

tol_pct = 1.0% · tol_abs = 1.000đ · day_window = 4 ngày. Một khoản lệch coi là “trong ngưỡng” nếu |lệch| ≤ tol_abs hoặc |lệch| / gốc × 100 ≤ tol_pct.

10

Dashboard & chọn phiên

Xem trực quan KPI và biểu đồ; mở nhanh một phiên đã tạo.

Dashboard hiển thị: các KPI, waterfall ví (Nạp − Spend = Tồn ví), waterfall chứng từ (Spend − Hóa đơn = Chưa có HĐ), dumbbell sổ ↔ sao kê, spend ↔ charge theo ngày, và spend theo nền tảng.

Bộ lọc “Phiên đã tạo”

  • Chọn Thẻ/Ví và khoảng ngày để xem kỳ tự do; hoặc chọn thẳng một phiên đã tạo từ dropdown — hệ thống tự nạp đúng Thẻ/Ví và kỳ của phiên rồi vẽ lại biểu đồ.
  • Khi đang xem theo phiên, một chip ngữ cảnh hiện tên phiên + badge trạng thái; nút chính đổi thành “Mở phiên” để nhảy vào form.
  • Đổi thủ công Thẻ/Ví hay ngày → tự bỏ chọn phiên (để chip không hiểu nhầm đang xem phiên nào).
i
Số liệu Dashboard là “tính trực tiếp”

Dashboard tính lại số theo kỳ (live preview), không đọc snapshot đã chốt lưu trên bản ghi. Với phiên done/settled, nếu dữ liệu gốc bị sửa sau khi chốt thì số trên Dashboard có thể lệch snapshot — mở phiên (form) để xem số đã chốt.

11

Chế độ đặc biệt

Flow-only cho thẻ charge theo ngưỡng, và đối soát cấp gốc gom thẻ con.

11.1 · Flow-only — thẻ không theo dõi số dư (track_balance = False)

Dùng cho thẻ công ty charge theo ngưỡng (không cần theo dõi số dư ví). Khi đó phiên:

BỏGiữ
Số dư đầu/cuối kỳ · cờ LECH_SODU_HT / LECH_SODU_SK · nút Cân tiền Khớp thẻ · ton_quy_vi · chua_co_hd · cờ AM_QUY · các cờ dòng tiền · công nợ

11.2 · Đối soát cấp gốc — tài khoản có card_ids

Chọn tài khoản gốc (có thẻ con) → Spend, Hóa đơn, Sao kê và Khớp thẻ tự gom cả các thẻ con ([gốc] + card_ids). topup/book_out không mở rộng (sổ số dư gốc đã gộp con sẵn).

!
Không chạy song song hai cấp

Chỉ đối soát ở một cấp — hoặc cấp gốc (gom con), hoặc từng thẻ con — không chạy cả hai để tránh tính trùng.

12

Xử lý sự cố nhanh

Triệu chứng thường gặp và chỗ cần kiểm tra.

Triệu chứngKiểm tra
Một nguồn không có dòng nào bank_id / ads_receiver_bank_id đã trỏ đúng thẻ chưa · kỳ (ngày) đúng chưa · hóa đơn đã posted · chi phí đã approved/done.
Khớp thẻ = 0 Thẻ chưa có card_last4; hoặc dòng sao kê chưa gán đúng thẻ (đầu thẻ trong diễn giải không khớp card_last4 của thẻ con nào).
“Cần kiểm tra” liên tục dù bình thường Thường do LECH_SPEND_HD (spend > hóa đơn) khi có công nợ mang sang — đối chiếu chua_co_hd với debt_closing.
Nút Cân tiền không hiện Thẻ đang ở chế độ flow-only (track_balance = False) — đúng thiết kế.
Hóa đơn “Lấy hóa đơn” không vào đối soát Đó là ads.invoice (sổ tra cứu). Phải lập vendor bill account.move gắn cờ CPQC (mục 06).
Sổ tay vận hành · tiny_ads_reconciliation 18.0.2.0.0 Menu: Đối soát Ads