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.
Mục lục
Nội dung
- 01 Tổng quan & nguyên tắc
- 02 Chuẩn bị: khai báo Thẻ/Ví
- 03 Kiểm soát số dư theo loại tài khoản
- 04 Nạp tiền qua Đề nghị tạm ứng
- 05 Ghi nhận Chi phí (Spend)
- 06 Lập Hóa đơn CPQC
- 07 Import Sao kê ngân hàng
- 08 Tạo & chạy phiên đối soát
- 09 Đọc kết quả: số dư & cờ
- 10 Dashboard & chọn phiên
- 11 Chế độ đặc biệt
- 12 Xử lý sự cố
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:
Hai luồng thanh toán
| Luồng | Áp dụng | Cách hoạt động |
|---|---|---|
| A — Nạp ví / tự trừ | Shopee, Google, TikTok | Nạp tiền vào ví trước; nền tảng tự trừ khi phát sinh spend. |
| B — Thẻ công ty | Facebook… | 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
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.
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ĩa | Bắt buộc? |
|---|---|---|
is_ads_card | Đánh dấu là thẻ/ví quảng cáo | Bắt buộc |
card_last4 | 4 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_balance | Theo dõi số dư ví (mặc định bật). Tắt → chạy chế độ flow-only | tùy chọn |
bank_account_id | Tà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ốc | tự độ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.bankvớiis_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_last4riê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).
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_up và ads_cost (is_ads_flow = True → được đưa vào công thức).
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ãn | Vai trò trong kiểm soát số dư |
|---|---|---|
bank_card | Tài khoản ngân hàng | Mặc định. Tài khoản/ví độc lập, tự giữ số dư riêng. |
payment_card | Thẻ thanh toán | Thẻ 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_card | Thẻ tín dụng | Như tài khoản độc lập trừ khi gắn bank_account_id. |
platform_wallet | Platform Wallet | Ví nền tảng (Shopee/Google/TikTok) — luồng A nạp trước. |
company_card | Company card | Thẻ công ty dùng chung. |
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ắt | Chỉ 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.history — mỗ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:
balance_startcủa ngày =fixed_balance_start(nếu có ấn định) hoặcbalance_endcủa ngày liền trước.total_in/total_out= tổng các dònghistory.in/history.outtrong ngày, bỏ qua dòngis_adjust_balance = True(dòng điều chỉnh tay).- Số dư hiện tại của tài khoản (
balance) =balance_endcủ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”.
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:
- Nguồn/đích được quy về gốc
- Giữ số dư tổng của cả nhóm thẻ
- Nguồn/đích giữ nguyên là thẻ
- Vết thẻ lưu ở
source/dest_payment_card_id
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át | Lấ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_end | balance_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ền | Chỉ hiện khi tài khoản theo dõi số dư; ẩn khi flow-only |
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.
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.
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.
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ện | Trường / giá trị |
|---|---|
| Tài khoản QC trỏ đúng thẻ trừ tiền | ads.account.bank_id = thẻ/ví → quyết định hr.expense.bank_id |
| Sản phẩm chi phí đúng loại | product.default_code = 'CPQC' |
| Được đánh dấu chi phí quảng cáo | is_advertising_expenses = True |
| Đã duyệt | state ∈ (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).
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ường | Giá trị | Ghi chú |
|---|---|---|
is_ads_invoice | True | Tự bật khi có dòng sản phẩm CPQC; kế toán tick/bỏ được |
card_last4 | 4 số cuối thẻ | Gõ đầu thẻ → gợi ý tự điền Thẻ/Ví nếu khớp duy nhất |
ads_receiver_bank_id | Thẻ/Ví CPQC | Domain is_ads_card. Là khóa gom của phiên |
| Trạng thái | posted | Chỉ hóa đơn đã vào sổ mới được đọc |
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.
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.
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ường | Chọn |
|---|---|
bank_id | Tài khoản GỐC — không chọn thẻ thanh toán con |
statement_format | Techcombank hoặc ACB |
file_data | File 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_idtheo 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_typetheo 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òngis_ads_flowvà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.
Tạo & chạy phiên đối soát
Khi đủ 4 nguồn cho kỳ, tạo phiên và chạy engine.
- Chọn Thẻ/Ví và kỳ
bank_id(domainis_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. - 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.
- 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.
- 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.
- (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.
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.
Đọ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ợ
Tiền còn trong ví (chưa tiêu hết).
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 = 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ĩa | Mức |
|---|---|---|
THIEU_HD | Có spend nhưng không có hóa đơn | hard |
THIEU_SPEND | Có hóa đơn/nạp nhưng không có spend | hard |
THIEU_NAP | Có spend nhưng không có nạp | hard |
AM_QUY | Spend vượt số nạp (tồn quỹ ví âm quá ngưỡng) | hard |
LECH_SPEND_HD | Lệch Spend ↔ Hóa đơn quá ngưỡng | hard |
LECH_TIEN_VAO | Lệch tổng tiền vào: Nạp ↔ sao kê (credit) | — |
LECH_TIEN_RA | Lệch tổng tiền ra: sổ ↔ sao kê (charge) | — |
LECH_SODU_HT | Lệch số dư sổ nội bộ ↔ sao kê | soft * |
LECH_SODU_SK | Sao 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:
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.
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).
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.
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).
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.
Xử lý sự cố nhanh
Triệu chứng thường gặp và chỗ cần kiểm tra.
| Triệu chứng | Kiể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 · 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.
Mục lục
Nội dung
- 01 Tổng quan & nguyên tắc
- 02 Chuẩn bị: khai báo Thẻ/Ví
- 03 Kiểm soát số dư theo loại tài khoản
- 04 Nạp tiền qua Đề nghị tạm ứng
- 05 Ghi nhận Chi phí (Spend)
- 06 Lập Hóa đơn CPQC
- 07 Import Sao kê ngân hàng
- 08 Tạo & chạy phiên đối soát
- 09 Đọc kết quả: số dư & cờ
- 10 Dashboard & chọn phiên
- 11 Chế độ đặc biệt
- 12 Xử lý sự cố
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:
Hai luồng thanh toán
| Luồng | Áp dụng | Cách hoạt động |
|---|---|---|
| A — Nạp ví / tự trừ | Shopee, Google, TikTok | Nạp tiền vào ví trước; nền tảng tự trừ khi phát sinh spend. |
| B — Thẻ công ty | Facebook… | 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
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.
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ĩa | Bắt buộc? |
|---|---|---|
is_ads_card | Đánh dấu là thẻ/ví quảng cáo | Bắt buộc |
card_last4 | 4 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_balance | Theo dõi số dư ví (mặc định bật). Tắt → chạy chế độ flow-only | tùy chọn |
bank_account_id | Tà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ốc | tự độ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.bankvớiis_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_last4riê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).
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_up và ads_cost (is_ads_flow = True → được đưa vào công thức).
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ãn | Vai trò trong kiểm soát số dư |
|---|---|---|
bank_card | Tài khoản ngân hàng | Mặc định. Tài khoản/ví độc lập, tự giữ số dư riêng. |
payment_card | Thẻ thanh toán | Thẻ 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_card | Thẻ tín dụng | Như tài khoản độc lập trừ khi gắn bank_account_id. |
platform_wallet | Platform Wallet | Ví nền tảng (Shopee/Google/TikTok) — luồng A nạp trước. |
company_card | Company card | Thẻ công ty dùng chung. |
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ắt | Chỉ 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.history — mỗ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:
balance_startcủa ngày =fixed_balance_start(nếu có ấn định) hoặcbalance_endcủa ngày liền trước.total_in/total_out= tổng các dònghistory.in/history.outtrong ngày, bỏ qua dòngis_adjust_balance = True(dòng điều chỉnh tay).- Số dư hiện tại của tài khoản (
balance) =balance_endcủ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”.
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:
- Nguồn/đích được quy về gốc
- Giữ số dư tổng của cả nhóm thẻ
- Nguồn/đích giữ nguyên là thẻ
- Vết thẻ lưu ở
source/dest_payment_card_id
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át | Lấ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_end | balance_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ền | Chỉ hiện khi tài khoản theo dõi số dư; ẩn khi flow-only |
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.
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.
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.
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ện | Trường / giá trị |
|---|---|
| Tài khoản QC trỏ đúng thẻ trừ tiền | ads.account.bank_id = thẻ/ví → quyết định hr.expense.bank_id |
| Sản phẩm chi phí đúng loại | product.default_code = 'CPQC' |
| Được đánh dấu chi phí quảng cáo | is_advertising_expenses = True |
| Đã duyệt | state ∈ (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).
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ường | Giá trị | Ghi chú |
|---|---|---|
is_ads_invoice | True | Tự bật khi có dòng sản phẩm CPQC; kế toán tick/bỏ được |
card_last4 | 4 số cuối thẻ | Gõ đầu thẻ → gợi ý tự điền Thẻ/Ví nếu khớp duy nhất |
ads_receiver_bank_id | Thẻ/Ví CPQC | Domain is_ads_card. Là khóa gom của phiên |
| Trạng thái | posted | Chỉ hóa đơn đã vào sổ mới được đọc |
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.
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.
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ường | Chọn |
|---|---|
bank_id | Tài khoản GỐC — không chọn thẻ thanh toán con |
statement_format | Techcombank hoặc ACB |
file_data | File 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_idtheo 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_typetheo 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òngis_ads_flowvà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.
Tạo & chạy phiên đối soát
Khi đủ 4 nguồn cho kỳ, tạo phiên và chạy engine.
- Chọn Thẻ/Ví và kỳ
bank_id(domainis_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. - 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.
- 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.
- 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.
- (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.
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.
Đọ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ợ
Tiền còn trong ví (chưa tiêu hết).
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 = 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ĩa | Mức |
|---|---|---|
THIEU_HD | Có spend nhưng không có hóa đơn | hard |
THIEU_SPEND | Có hóa đơn/nạp nhưng không có spend | hard |
THIEU_NAP | Có spend nhưng không có nạp | hard |
AM_QUY | Spend vượt số nạp (tồn quỹ ví âm quá ngưỡng) | hard |
LECH_SPEND_HD | Lệch Spend ↔ Hóa đơn quá ngưỡng | hard |
LECH_TIEN_VAO | Lệch tổng tiền vào: Nạp ↔ sao kê (credit) | — |
LECH_TIEN_RA | Lệch tổng tiền ra: sổ ↔ sao kê (charge) | — |
LECH_SODU_HT | Lệch số dư sổ nội bộ ↔ sao kê | soft * |
LECH_SODU_SK | Sao 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:
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.
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).
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.
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).
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.
Xử lý sự cố nhanh
Triệu chứng thường gặp và chỗ cần kiểm tra.
| Triệu chứng | Kiể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). |