# Giao dịch và cách khớp lệnh

Hạ Tầng đọc nội dung chuyển khoản thế nào để tìm thanh toán hay đơn hàng tương ứng, chuyện gì xảy ra khi khách quên ghi mã, và xử lý tiền về chưa khớp ra sao.

Mọi biến động số dư ngân hàng báo về cho các tài khoản đã liên kết đều có ở **Thanh toán → Giao dịch**, dù giao dịch đó có trả cho thanh toán nào của bạn hay không. Bài này giải thích Hạ Tầng xác định một giao dịch thuộc thanh toán hay đơn hàng nào, và cần làm gì với những giao dịch không xác định được.

![Giao dịch: hai khoản chưa khớp thanh toán, tiếp theo là các khoản đã khớp](https://hatang.dev/help/img/vi/payments/transactions.webp)

## Danh sách hiển thị gì

| Cột | Ý nghĩa |
|---|---|
| **Ghi sổ** | Thời điểm ngân hàng ghi nhận giao dịch |
| **Mô tả** | Nội dung chuyển khoản như ngân hàng báo |
| **Mã** | Mã thanh toán hoặc mã đơn của bạn tìm thấy trong nội dung |
| **Số tiền** | `+` là tiền vào, `-` là tiền ra |
| **Khớp** | **Đã khớp** khi giao dịch trả cho một thanh toán của bạn; **Chưa khớp** trong các trường hợp còn lại |
| **Nguồn** | Cách Hạ Tầng biết giao dịch: `push` (ngân hàng thông báo), `reconcile` (đọc từ lịch sử tài khoản), `import` (sao kê bạn nhập) hoặc `simulator` (môi trường thử nghiệm) |
| **Mã tham chiếu** | Số tham chiếu của ngân hàng |

Lọc bằng **Tiền vào**, **Tiền ra**, **Đã khớp** và **Chưa khớp**.

## Một giao dịch được khớp thế nào

Khi có giao dịch, Hạ Tầng đọc nội dung theo thứ tự sau:

1. **Làm sạch nội dung.** Bỏ dấu, `đ` thành `D`, chuyển hết sang chữ hoa và bỏ mọi khoảng trắng, dấu câu. `ck htbf7rdgvq - cảm ơn` thành `CKHTBF7RDGVQCAMON`.
2. **Tìm mã thanh toán.** Mã tự sinh gồm tiền tố của bạn (mặc định `HT`) và 8 ký tự chữ, số không bao giờ có `0`, `O`, `1` hay `I`, để khách chép tay không nhầm. Nếu nội dung đã làm sạch chứa mã của một thanh toán đang mở trên tài khoản đó, giao dịch trả cho thanh toán đó.
3. **Tìm mã riêng của bạn.** Nếu bạn đặt mã chuyển khoản riêng cho thanh toán (ví dụ `DH000016`), Hạ Tầng tìm mã đó ở bất kỳ vị trí nào trong nội dung. Khi mã này nằm trong mã kia (`DH1002` và `DH10024`), mã dài hơn được ưu tiên.
4. **Tìm theo định dạng mã đơn.** Nếu tài khoản có cài **Mã đơn riêng của bạn** (ví dụ `DH` và 6 chữ số), Hạ Tầng ghi lại mã đơn tìm thấy, kể cả khi không có thanh toán nào cho mã đó, và chuyển cho hệ thống của bạn.

Kết quả:

- Giao dịch trả cho một thanh toán: giao dịch **Đã khớp**, thanh toán chuyển sang **Đã thanh toán**, **Thanh toán một phần** hoặc **Thanh toán dư**, và website của bạn được báo.
- Không khớp thanh toán nào: giao dịch **Chưa khớp**, mã đơn tìm thấy (nếu có) nằm ở cột **Mã**. Hệ thống của bạn vẫn được báo, nên cửa hàng chỉ dùng mã đơn vẫn xác nhận được đơn.
- Một giao dịch không bao giờ bị tính hai lần: nếu ngân hàng báo lại cùng giao dịch (cùng mã tham chiếu và số tiền trên tài khoản), lần sau bị bỏ qua.

> [!WARNING]
> Nếu định dạng mã đơn dùng **chữ+số**, chữ phía sau sẽ dính vào mã khi bỏ khoảng trắng: `DH1001 cam on` thành `DH1001CAMON`. Hãy dùng **chữ số**, hoặc cho mọi mã dài đúng bằng độ dài tối đa.

## Khi khách quên ghi mã

Giao dịch về ở trạng thái **Chưa khớp** và cột **Mã** trống. Cách xử lý:

1. Tìm đơn hàng: so số tiền, thời gian và tên người chuyển (hiện ở **Đối soát hoá đơn**, cột **Người chuyển**). Hỏi khách nếu cần.
2. Mở thanh toán ở **Thanh toán → Thanh toán** và bấm **Đánh dấu đã thanh toán**, kèm ghi chú như `CK thiếu mã, ref FT2610...`.

Thanh toán chuyển sang **Đã thanh toán**, và website của bạn được báo như thường lệ.

| Tình huống | Bạn thấy | Cần làm |
|---|---|---|
| Khách quên ghi mã | **Chưa khớp**, không có mã | Tìm đơn và **Đánh dấu đã thanh toán** |
| Chuyển sai số tiền | Thanh toán **Thanh toán một phần** hoặc **Thanh toán dư** | Nhờ khách chuyển nốt, hoặc hoàn phần dư từ ngân hàng |
| Chuyển hai lần | Hai giao dịch; thanh toán **Thanh toán dư** | Hoàn tiền từ ngân hàng |
| Chuyển sau khi thanh toán hết hạn | Thanh toán vẫn chuyển sang **Đã thanh toán** | Tự quyết có giao hàng hay không |
| Chuyển nhầm sang tài khoản khác | Không thấy gì: Hạ Tầng chỉ đọc tài khoản đã liên kết | Kiểm tra lại với khách |
| Có trong app ngân hàng nhưng không có ở đây | Ngân hàng không báo về | [Nhập sao kê](https://hatang.dev/vi/help/payments/link-bank-account) của ngày đó |

## Cửa hàng chỉ dùng mã đơn của mình

Cửa hàng có QR in sẵn tại quầy, hoặc hệ thống đã có mã đơn riêng, không cần tạo thanh toán cho từng đơn. Hãy cài **Mã đơn riêng của bạn** cho tài khoản (ví dụ tiền tố `DH`, 6 chữ số) ở **Cài đặt thanh toán → Tài khoản ngân hàng → Khớp lệnh và thông báo**. Mọi giao dịch mang mã như vậy sẽ được báo tới hệ thống của bạn kèm mã tìm thấy, để đối chiếu với đơn ở phía bạn. Lập trình viên có thể tạo VietQR điền sẵn mã đơn trong nội dung; xem [Nhận chuyển khoản không cần đơn hàng](https://hatang.dev/vi/docs/guides/payments/transactions).

## Thử ở môi trường thử nghiệm

Ở môi trường thử nghiệm, khung giả lập ở đầu trang **Giao dịch** gửi một giao dịch vào tài khoản giả lập với số tiền và nội dung tuỳ ý, không cần thanh toán, như khách trả theo mã đơn của bạn. Bấm **Giả lập** sau khi thử nội dung `DH123456 thanh toan` khi đã cài định dạng mã đơn, hoặc nội dung không có mã nào.
