Tải hóa đơn điện tử (https://hoadondientu.gdt.gov.vn/) Excel Vba

Liên hệ QC

ongke0711

Thành viên gắn bó
Tham gia
7/9/06
Bài viết
2,159
Được thích
2,823
Giới tính
Nam
Chào các bạn,
Tôi ngồi mò mẫm mấy ngày mới tìm được cách tải hóa đơn điện tử từ trang https://hoadondientu.gdt.gov.vn/. Cách này có thể không chuyên nghiệp nhưng cũng giải quyết được vấn đề tải hóa đơn hàng loạt từ trang trên và ghi xuống Excel theo định dạng dễ tổng hợp dữ liệu sau này.
- Tốc độ không nhanh như các ứng dụng python siêu nhanh.
- Chưa tìm được các link tải file .xml hoặc .html
- Chưa trải nghiệm qua các định dạng hóa đơn điện tử của các nhà cung cấp giải pháp khác nhau nên sẽ không đảm bảo chạy đúng 100%.
- Chưa biết cách tích hợp code vượt Captcha của (Python, C#..) vào VBA nên phải nhập Captcha thủ công.
Nói chung cái tool cũng giải quyết được việc tải hóa đơn hàng loạt :D .
Tôi sẽ upload file demo không khóa (có khóa cũng như không) sau vì code còn lộn xộn lắm. Các bạn xem qua và đóng góp cách xử lý tốt hơn, gọn hơn nhé.

 

File đính kèm

  • TaiHoaDonDienTu_v1.xlsm
    202.5 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
bạn có thể up lại file cho mình xin được ko ạ
Đã sửa lại và up link ở bài #1. Bạn tải và kiểm tra thử xem nhé.

Cơ bản còn vấn để xử lý file jason để bẫy lỗi các kiểu nên sẽ còn gặp lỗi vì có nhiều trường hợp khác nhau. Chỉ có sửa từ từ thôi. :)
 
Lần chỉnh sửa cuối:
Upvote 0
Anh xem xét các vấn đề sau có thể cải tiến được thì ứng dụng sẽ lấy được dữ liệu chắc chắn đủ hơn.

1. Lấy dữ liệu từ một server có các lý do có thể không lấy được. Lỗi không lấy được có thể do server bận - > time out (trường hợp này rất có thể xảy ra khi server quá tải), hoặc cú pháp của request không phù hợp (trường hợp này tạm cho là không xảy ra với ứng dụng đã test). Vì thế khi request đến server mình cần kiểm tra kết quả thành công hay không rồi mới xử lý tiếp với JSONConverter hay gì gì đó.

Hàm httpGET cũ là
Function httpGet(url As String, bearer As String) As String

Nên sửa là
Function httpGet(ByVal url As String, Byval bearer As String, ByRef res As String) As Boolean
...
With With CreateObject("MSXML2.serverXMLHTTP.6.0")
...
httpGet = .Status = 200
If httpGet Then
res = .responseText
End If
...
End With
...
End Function

2. Trong thủ tục tải hóa đơn taiHoaDon_Total anh cải tiến

Mảng arrHDChiTiet anh đang lưu thông tin hóa đơn lấy được. Hãy thêm hai cột nữa để lưu: Status - Trạng thái thành công và RequestCount - Số lần cửi lệnh lên server.
arrHDChiTiet(I, RequestCountColIdx) = arrHDChiTiet(I, RequestCountColIdx) + 1
If httpGet(url, bearer, res) Then
arrHDChiTiet(I, StatusColIdx) = True
Set js = JsonConverter.ParseJSON(res)
... Các công việc xử lý với kết quả lấy về thành công
Else
arrHDChiTiet(I, StatusColIdx) = False
End If

Chạy lần 1 xong anh chạy lại quy trình cũ và kiểm tra với arrHDChiTiet(I, StatusColIdx) = False quét lại bao nhiêu lần tùy vào quyết định của anh về arrHDChiTiet(I, RequestCountColIdx) giới hạn max là bao nhiêu?

Em mới xem qua nên góp ý vậy.
 
Upvote 0
hình như dùng
Mã:
Do While .readyState <> 4
DoEvents
Loop

readyState chỉ sử dụng khi gọi phương thức open của http với tham số Async là True.

mình đã test thì lấy dữ liệu được 50 hóa đơn thôi, các hóa đơn khác chưa tải về được.
@ongke0711 Vì mỗi lần trả về kết quả giới hạn là 50 dòng dữ liệu, anh viết mã thiếu phần tiếp tục gửi yêu cầu tiếp theo. Trong json trả về có giá trị khóa State, nếu có giá trị là còn tiếp, nếu trống là hết danh mục. Và gửi yêu cầu POST tiếp tục này cần thêm khóa State và giá trị.
 
Upvote 0
View attachment 304546

Mình thì chưa nghe vụ cán bộ thuế đòi xem XML, tuy nhiên việc lưu giữ file XML là việc làm rất cần thiết. Hóa đơn PDF chỉ là bản thể hiện của hóa đơn điện tử, các thông tin trên PDF đúng chưa chắc hóa đơn XML đã đúng. Các công ty tập đoàn lớn đều có các tools để kiểm tra hóa đơn XML, đơn cử như Tập đoàn C.P, mình đã gặp vài trường hợp hóa đơn PDF thể hiện chuẩn cả, nhưng qua hệ thống của họ soi ra là thông tin trong file XML không chuẩn, và có khi ngược lại, thông tin trong file XML chuẩn nhưng bản thể hiện PDF thì không.
Nhìn chung lưu giữ hóa đơn chuẩn nhất vẫn phải là file XML, còn cho dễ đọc dễ nhìn dễ kiểm tra thì phải có thêm bản cứng hoặc bản PDF của nhà cung cấp gửi.
Về thực tế cơ quan thuế kiểm tra dữ liệu có rất nhiều trường hợp , tùy cán bộ thuế thôi . Mình đúc kết được 1 số dạng như sau :
- Phải khớp đét với dữ liệu của ngành thuế , nếu lệch phải giải trình. Trường hợp này ít vì nó rất hay lệch số liệu báo cáo tài chính của kế toán gửi lên.
- Không cần khớp, bỏ mấy hóa đơn giá trị nhỏ như ngân hàng, phí viễn thông .....cũng được. Trường hợp này chiếm đa số vì cán bộ thuế kiểm tra nhanh chóng hơn nhiều.

Về việc file pdf gốc từ tổ chức giải pháp : Kinh nhiệm của mình là không cần, dùng file in trên trang hoadondientu.gov.vn là được rồi. Tuy nhiên nếu có bản pdf từ tổ chức giải pháp thì in ấn nó đẹp, tiết kiệm giấy hơn. Hàng năm mình quyết toán thuế khá nhiều (tầm 40-50 lần) từ năm 2022 đến giờ chưa thấy cán bộ thuế nào hỏi cần file pdf gốc.

Về file XML : Không cán bộ thuế nào kiểm tra nhưng vẫn phải lưu lại vì chỉ nó có giá trị pháp lý. Tuy nhiên có nhiều trường hợp ta không tải được file xml đó từ trang hoadondientu.gov.vn . Ví dụ : Hóa đơn tiền điện, viễn thông, ngân hàng .....
Đây chỉ là kinh nhiệm của mình , có thể các cơ quan thuế ở chỗ các bạn có những yêu cầu khác.
 
Upvote 0
mình đã test thì lấy dữ liệu được 50 hóa đơn thôi, các hóa đơn khác chưa tải về được.
Bạn vô cái sub taiHoaDon_Total() sửa cái tham số Size thành 500 xem thử nhé.
Cái MST mà tôi test, ít hóa đơn quá nên chưa biết giới hạn số hóa đơn có thể tải.

Screen Shot 2024-10-10 at 20.16.51.png
 
Upvote 0
Tôi mới kiểm tra thì chỉ thiết lập tối đa 50 thôi, phải code lấy thêm các trang sau.
Còn mã tra cứu sẽ có trường hợp không tìm thấy mặc dù HD gốc có, do mỗi nhà ccgp đặt tên mã này khác nhau nên phải thu thập đủ để đưa vào code. File của tôi chỉ mới có 8 kiểu.
 
Lần chỉnh sửa cuối:
Upvote 0
Sao bản này e dùng thử thì tải không đủ hoá đơn (thực tế hơn 200 HĐ nhưng chỉ hiện 30-40 HĐ) và Sheet "ChiTietHD_Mua" trống trơn bác ơi, e thấy báo lỗi chọn debug thì ra như hình đính kèm ạ.
 

File đính kèm

  • 1728651494183.png
    1728651494183.png
    199.4 KB · Đọc: 14
Upvote 0
Sheet "ChiTietHD_Mua" trống trơn
File tôi test nên chưa bỏ dòng lệnh Exit sub như hình.

Screen Shot 2024-10-11 at 20.37.48.png

Bạn kiếm trong sub taiHoaDon_Total và bỏ dòng Exit sub này.
Còn việc hiển thị không đủ số HD thì cũng khó trả lời nguyên nhân vì cái MST mà tôi test hiển thị như hình.
- 197 hóa đơn và 2056 dòng HĐ chi tiết. Mất 2,5 phút.

Screen Shot 2024-10-11 at 20.48.49.png Screen Shot 2024-10-11 at 20.56.20.png
 

File đính kèm

  • Screen Shot 2024-10-11 at 21.00.22.png
    Screen Shot 2024-10-11 at 21.00.22.png
    39.3 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
Sao bản này e dùng thử thì tải không đủ hoá đơn (thực tế hơn 200 HĐ nhưng chỉ hiện 30-40 HĐ) và Sheet "ChiTietHD_Mua" trống trơn bác ơi, e thấy báo lỗi chọn debug thì ra như hình đính kèm ạ.
Bạn tải lại file bài #1 xem còn lỗi này không.
 
Upvote 0
Bạn tải lại file bài #1 xem còn lỗi này không.
e tải lại file bài #1 và test thử với tìm kiếm 1 Quý thì kết quả như sau ạ:
- Hoá đơn bán ra thực tế 81 tờ: Run xoay tầm gần 1' -> Hiện thông báo "Xong." -> Kết quả chỉ tải dc 55 tờ, có tải được chi tiết hoá đơn.
- Hoá đơn mua vào thực tế >200 tờ: Run hiện ngay báo lỗi như ảnh đính kèm, click Debug thì hiện báo vàng như bài #57 -> Kết quả tải được đc 44 tờ, chi tiết hoá đơn trống không tải được.
 

File đính kèm

  • 1728721087080.png
    1728721087080.png
    5.2 KB · Đọc: 5
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom