Mã số VAT theo quốc gia là trường xuất hiện ở gần như mọi luồng hoá đơn xuyên biên giới, và cũng là trường bị kiểm tra sai nhiều nhất. Phần lớn hệ thống chỉ nhìn vào hình dạng của mã rồi kết luận, trong khi câu hỏi thật mà kế toán cần trả lời lại là một câu khác. Bài này tách hai câu hỏi đó ra và nói rõ chúng cần hai tầng xử lý riêng.
Mã số VAT là gì?
Đây là số đăng ký thuế giá trị gia tăng, do cơ quan thuế của quốc gia hoặc vùng lãnh thổ cấp cho chủ thể có nghĩa vụ kê khai loại thuế này. Nó không phải mã số đăng ký doanh nghiệp ở sổ đăng ký, dù ở khá nhiều nơi hai mã này trùng nhau. Việc một doanh nghiệp có mã VAT hay không phụ thuộc vào ngưỡng và quy định của nơi đó, nên trong cùng một quốc gia vẫn có doanh nghiệp đã đăng ký kinh doanh mà chưa có mã VAT.
Trong hoá đơn giữa hai doanh nghiệp ở hai nước khác nhau, mã VAT của bên mua và bên bán thường là căn cứ để xác định loại hoá đơn và cách xử lý thuế. Vì vậy khi trường này sai, hậu quả không dừng ở một dòng dữ liệu lệch: nó kéo theo việc hoá đơn bị coi là không hợp lệ và hai bên phải điều chỉnh lại chứng từ.
Vì sao mã VAT thường bắt đầu bằng hai chữ cái?
Vì tiền tố đó chỉ quốc gia cấp mã, và trong giao dịch xuyên biên giới thì thông tin ấy phải đọc được ngay mà không cần tra cứu thêm. Phần còn lại của mã do cơ quan thuế nơi đó quy định: có nơi dùng toàn chữ số, có nơi trộn chữ và số, có nơi chèn thêm ký tự phân cách khi in. Độ dài vì thế cũng không đồng nhất, và không có một chuẩn quốc tế nào đặt ra cấu trúc này.
Cần hết sức cẩn thận với các bảng “quy tắc định dạng theo quốc gia” trôi nổi trên mạng. Chúng thường lỗi thời, đôi khi trộn cả quy tắc của hệ thống thuế đã bị thay thế, và khi được đưa thẳng vào mã nguồn thì trở thành một hàng rào từ chối khách hàng hợp lệ. Nếu bạn thực sự cần quy tắc của một nước, hãy lấy từ tài liệu của cơ quan thuế nước đó và ghi lại ngày bạn kiểm chứng.
Định dạng đúng có nghĩa là đã đăng ký chưa?
Không. Đây là điểm quan trọng nhất của cả bài, và là nguồn gốc của rất nhiều tranh chấp trong dự án. Một mã có thể đúng số ký tự, đúng tiền tố, đúng vị trí chữ và số, mà vẫn không tồn tại trong sổ đăng ký thuế của nước cấp, vì nó chưa từng được cấp hoặc đã bị thu hồi. Ngược lại, một mã đang hoạt động vẫn có thể bị hệ thống của bạn từ chối chỉ vì bạn áp một biểu thức chính quy quá hẹp.
Ở Liên minh châu Âu, Uỷ ban châu Âu vận hành một dịch vụ tra cứu công khai cho phép kiểm tra xem một mã VAT có đang được đăng ký hay không. Sự tồn tại của dịch vụ đó chính là minh chứng rõ nhất rằng “đúng định dạng” và “đang đăng ký” là hai chuyện khác nhau, và rằng câu hỏi thứ hai cần một nguồn dữ liệu bên ngoài chứ không thể giải bằng thuật toán cục bộ.
| Câu hỏi | Ai trả lời được | Có cần mạng không |
|---|---|---|
| Mã có đúng hình dạng không | Quy tắc định dạng của chính hệ thống bạn | Không |
| Mã có chữ số kiểm tra hợp lệ không | Quy tắc công bố của nơi cấp, nếu có | Không |
| Mã này có đang được đăng ký không | Cơ quan thuế hoặc dịch vụ tra cứu chính thức | Có |
| Mã này có thuộc về người đang nhập không | Không nguồn dữ liệu nào trả lời thay được | Có, kèm kiểm tra quyền |
Mã VAT trong hoá đơn và hoàn thuế
Trong luồng hoá đơn, mã VAT của bên mua thường phải được ghi đúng như trên chứng từ đăng ký, kể cả tiền tố quốc gia. Khi hai bên ở hai nước áp dụng cơ chế đảo nghĩa vụ thuế, việc xác nhận mã của bên mua là bước bắt buộc trước khi phát hành. Với hoàn thuế, mã còn phải khớp với tên và địa chỉ trên hồ sơ, nên chỉ kiểm tra mã thôi là chưa đủ để hồ sơ đi qua.
Một chi tiết dễ bị bỏ sót: thời điểm tra cứu có ý nghĩa. Trạng thái đăng ký của một mã có thể thay đổi giữa lúc lập hoá đơn và lúc cơ quan thuế rà soát. Vì vậy hệ thống nên lưu lại kết quả tra cứu kèm thời điểm, thay vì chỉ lưu một giá trị đúng hoặc sai.
Phần dành cho nhà phát triển
Hãy chia việc kiểm tra thành hai tầng tách biệt, và đừng để tầng này giả vờ làm việc của tầng kia.
- Tầng một là kiểm tra cục bộ, chạy không cần mạng: cắt khoảng trắng, viết hoa, kiểm tra ký tự hợp lệ, và nếu nơi cấp có công bố quy tắc chữ số kiểm tra thì áp dụng quy tắc đó. Tầng này chỉ có quyền nói “hình dạng không hợp lệ”.
- Tầng hai là tra cứu trạng thái đăng ký ở nguồn chính thức. Tầng này có quyền nói “có trong sổ đăng ký” hoặc “không tìm thấy”, và cả hai kết luận đều phải kèm thời điểm tra cứu.
- Khi tầng hai lỗi hoặc quá thời gian chờ, đừng coi đó là kết quả phủ định. Hãy lưu trạng thái “chưa xác minh được” và cho phép chạy lại, vì biến một sự cố mạng thành một lời từ chối sẽ chặn đúng những khách hàng thật.
- Cân nhắc lưu bản ghi tra cứu để tránh gọi lại liên tục cho cùng một mã, nhưng đừng lưu quá lâu tới mức trạng thái đã cũ mà hệ thống vẫn tin.
- Đừng bao giờ tự viết lại quy tắc của từng quốc gia trong mã nguồn nếu bạn không có người chịu trách nhiệm cập nhật chúng; thà để tầng định dạng rộng và dựa vào tầng tra cứu.
Để thử các nhánh này, trình tạo dữ liệu công ty để thử nghiệm của trang này sinh hồ sơ doanh nghiệp tổng hợp kèm mã VAT theo quốc gia bạn chọn, với hình dạng đúng theo cách nơi đó trình bày. Nội dung bài viết chỉ nhằm hỗ trợ kiểm thử phần mềm; không dùng thông tin tổng hợp để kê khai, hoàn thuế hay thay thế hồ sơ do doanh nghiệp thật cung cấp. Nếu bạn đang dựng bộ ca kiểm thử cho biểu mẫu, bài các ca kiểm thử biểu mẫu hoá đơn liệt kê những nhánh cần chạy.
Bước tiếp theo
Hãy rà lại luồng hoá đơn của bạn và trả lời hai câu hỏi riêng biệt: chỗ nào chỉ kiểm tra hình dạng, và chỗ nào thực sự tra trạng thái đăng ký. Sau đó thêm một ca kiểm thử cho tình huống nguồn tra cứu không phản hồi, vì đây là nhánh dễ bị xử lý sai nhất. Bài mã số đăng ký công ty theo từng quốc gia sẽ giúp bạn phân biệt mã VAT với mã số đăng ký doanh nghiệp nếu hai trường này đang bị trộn trong cùng một cột.