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,259
Được thích
2,996
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é.



*** 12/10/2024: Cập nhật sửa một đống lỗi.
*** 15/10/2024: Cập nhật sửa lỗi Null và nhập ngày tháng.
*** 16/10/2024: Thêm tính năng lưu User/Pass.
*** 20/10/2024: Sửa lỗi hiển thị ngày tháng, sửa và thêm một số code phụ trợ.
*** 28/10/2024: Sửa lấy hóa đơn từ máy tính tiền.
*** 07/11/2024: Sửa code trích xuất dữ liệu, thêm cột so sánh.
*** 13/11/2024: Dùng code của bạn Hesanbi để tự động nhập Captcha. Thêm code lấy link tra cứu của VNPT và BKAV.
 

File đính kèm

  • TaiHoaDonDienTu_v5_luuUserPass.xlsb
    212.5 KB · Đọc: 175
Lần chỉnh sửa cuối:
Quá tuyệt vời. Mong chờ File từ bạn !
 
Upvote 0
Quá hay ạ! Cảm ơn bác nhiều!
 
Upvote 0
Tool này hay quá anh ơi! anh em dân kế toán đang vật vã với hóa đơn chứng từ
Em có 1 mã số thuế , có số lượng hóa đơn hàng tháng (~500 số) và số lượng dòng dữ liệu của các hóa đơn (~ 1000), hy vọng được test file của anh ạ
 
Upvote 0
nếu tải được xml nữa thì tuyệt ạ!
 
Upvote 0
Tool này hay quá anh ơi! anh em dân kế toán đang vật vã với hóa đơn chứng từ
Em có 1 mã số thuế , có số lượng hóa đơn hàng tháng (~500 số) và số lượng dòng dữ liệu của các hóa đơn (~ 1000), hy vọng được test file của anh ạ
Theo tôi với số liệu hóa đơn nhiều vậy bạn nên đề xuất công ty mua gói dịch vụ kèm theo phần mềm quản lý hóa đơn điện tử để tải xml. Tôi cũng làm kế toán nên hiểu nỗi khổ này. Hiện tại tôi dùng VBA kết hợp với Selenium để tự động hóa thao tác click tải file xml hàng loạt nhưng tốc độ còn chậm khoản 5s/file xml.
 
Upvote 0
File này cũng đâu có gì ghê gớm đâu các bạn, có nhiều hạn chế như tôi đã đề cập ở bài #1. Đưa lên để các bạn cùng tham gia chỉnh sửa thôi. Tôi cũng đang mò mẫm tìm hiểu nó nên chưa biết lấy ra các api để tải file XML, HTML v.v... Đang ngâm cứu thêm :D .
Đối với số lượng hóa đơn nhiều như của bạn Excel my love_1 thì bạn nên dùng phần mềm chuyên nghiệp để khỏi bị các lỗi phát sinh. Tôi thấy các cty dùng phần mềm kế toán như misa, fast...đề có tool tải hóa đơn này mà.

Đã đính kèm file vào bài #1.

À cách lấy dữ liệu của tôi nó còn có một cái lỗi là khi tải liên tục nhiều file thì hình như web xử lý không kịp nên không trả về kết quả và dẫn đến báo lỗi file json. Tôi xử lý bằng cách cho thêm thời gian 500ms giữa mỗi lần kết nối --> nó chậm hơn.
 
Upvote 0
File này cũng đâu có gì ghê gớm đâu các bạn, có nhiều hạn chế như tôi đã đề cập ở bài #1. Đưa lên để các bạn cùng tham gia chỉnh sửa thôi. Tôi cũng đang mò mẫm tìm hiểu nó nên chưa biết lấy ra các api để tải file XML, HTML v.v... Đang ngâm cứu thêm :D .
Đối với số lượng hóa đơn nhiều như của bạn Excel my love_1 thì bạn nên dùng phần mềm chuyên nghiệp để khỏi bị các lỗi phát sinh. Tôi thấy các cty dùng phần mềm kế toán như misa, fast...đề có tool tải hóa đơn này mà.

Đã đính kèm file vào bài #1.

À cách lấy dữ liệu của tôi nó còn có một cái lỗi là khi tải liên tục nhiều file thì hình như web xử lý không kịp nên không trả về kết quả và dẫn đến báo lỗi file json. Tôi xử lý bằng cách cho thêm thời gian 500ms giữa mỗi lần kết nối --> nó chậm hơn.
Bác phát triển thêm chỗ này:
- Trang tra cứu, mã số bí mật để lấy hóa đơn gốc thì tuyệt vời (trừ 1 số nhà cung cấp hóa đơn không lấy được từ XML). Cám ơn!
 
Upvote 0
Bác phát triển thêm chỗ này:
- Trang tra cứu, mã số bí mật để lấy hóa đơn gốc thì tuyệt vời (trừ 1 số nhà cung cấp hóa đơn không lấy được từ XML). Cám ơn!
Để bác ấy mò xong mấy cái cơ bản đã bạn.

Trong mỗi file xml sẽ có mã số thuế của tổ chức giải pháp, viết tắt mình nhớ không nhầm là msttcgp, đây là đơn vị trung gian phát hành hóa đơn.
Tiếp theo bạn tìm mã tra cứu, nó cũng gần quanh quanh chỗ msttcgp thôi.

Có 2 thông tin trên rồi thì bạn vào website tra cứu hóa đơn của đơn vị trung gian phát hành, nhập mã tra cứu vào là lấy được hóa đơn pdf thôi. Tất nhiên không phải hóa đơn xml nào cũng có đủ 2 thông tin này, nhưng đa số là sẽ có.

Đây là danh sách các công ty trung gian phát hành hóa đơn:
 
Upvote 0
@ongke0711 ơi!
EM tải file về, Sau khi điền mật khẩu , chờ 1 lúc thì bị hiện ra lỗi này
(Máy em dùng win 7, IE 8)
1728353466366.png1728353608009.png

1728353713806.png
 
Upvote 0
@ongke0711 ơi!
EM tải file về, Sau khi điền mật khẩu , chờ 1 lúc thì bị hiện ra lỗi này
(Máy em dùng win 7, IE 8)


View attachment 304540
Lỗi đầu do không kết nối được trang ưeb, rớt mạng cũng gây ra lỗi này. Khi không kết nối được thì không tải file json đúng chuẩn nên báo lỗi thứ 2 .
Bạn không nhập captch à? Mã captch nó cũng có thời gian hiệu lực chừng 2 phút thì phải. Bạn đóng lại rồi mở để lấy mã mới.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn file chia sẻ của bạn. Tốc độ xử lý này theo mình là tuyệt vời rồi. Đối với kế toán khi làm tờ khai thuế thì kiểm tra được dữ liệu đầu vào đầu ra thì như vậy là ổn.
Mình test qua còn gặp lỗi đối với các hóa đơn không phải GTGT thì JsonObject("hdhhdvu") và JsonObject("datas") sẽ empty không hiển thị số tiền. Theo mình những trường hợp "hóa đơn thông thường" này bạn có thể cho "số tiền" hiển thị tại cột "Thành tiền sau thuế"
 
Upvote 0
À cách lấy dữ liệu của tôi nó còn có một cái lỗi là khi tải liên tục nhiều file thì hình như web xử lý không kịp nên không trả về kết quả

Do anh không viết mã gửi yêu cầu OPTIONS đến nguồn cấp dữ liệu trước khi GET/POST để tải dữ liệu, mỗi OPTIONS đều có cookie riêng, nhập cookie cho từng yêu cầu GET/POST.

VBA đủ nhanh như Python nếu lập trình mã HTTP bất đồng bộ, và các luồng Excel song song. Với Captcha của web hệ thống HDDT họ đã giải sẵn cho mình trong svg chỉ cần định hình cấu trúc mỗi ký tự và so sánh mà không cần phải tạo thuật toán để giải.

nếu tải được xml nữa thì tuyệt ạ!
Bạn có thể cho biết tại sao phải cần tải XML/HTML không? Vì trong hệ thống HDDT tôi thấy có API đã cấp đầy đủ dữ liệu thông tin như trong tệp XML.
Vì quá trình tải tệp invoice zip là tốn kém. Nên quá trình này là không cần thiết. Tất cả dữ liệu tải về lưu trữ vào Database và truy cập để xem dữ liệu hoặc tạo ra tệp XML/HTML nếu muốn.
 
Lần chỉnh sửa cuối:
Upvote 0
Do anh không viết mã gửi yêu cầu OPPTIONS đến nguồn cấp dữ liệu trước khi GET/POST để tải dữ liệu, mỗi OPPTIONS đều có cookie riêng, nhập cookie cho từng yêu cầu GET/POST.
Tôi có thấy OPTIONS trong request nhưng chưa biết công năng nó làm gì trên web nên không dùng :D:D.
Cảm ơn nhé, để tôi sửa lại.
 
Upvote 0
Do anh không viết mã gửi yêu cầu OPTIONS đến nguồn cấp dữ liệu trước khi GET/POST để tải dữ liệu, mỗi OPTIONS đều có cookie riêng, nhập cookie cho từng yêu cầu GET/POST.

VBA đủ nhanh như Python nếu lập trình mã HTTP bất đồng bộ, và các luồng Excel song song. Với Captcha của web hệ thống HDDT họ đã giải sẵn cho mình trong svg chỉ cần định hình cấu trúc mỗi ký tự và so sánh mà không cần phải tạo thuật toán để giải.


Bạn có thể cho biết tại sao phải cần tải XML/HTML không? Vì trong hệ thống HDDT tôi thấy có API đã cấp đầy đủ dữ liệu thông tin như trong tệp XML.
Vì quá trình tải tệp invoice zip là tốn kém. Nên quá trình này là không cần thiết. Tất cả dữ liệu tải về lưu trữ vào Database và truy cập để xem dữ liệu hoặc tạo ra tệp XML/HTML nếu muốn.
để mình giải thích tại sao cần tải XML: vì khi kiểm tra doanh nghiệp các cán bộ thuế họ yêu cầu cung cấp chứng từ (hóa đơn) mua vào kèm XML, có cán bộ thuế còn yêu cầu XML phải là XML gốc từ phía nhà mạng . Chính vì thế nó ra câu chuyện cần phải tải XML là như vậy
 
Upvote 0
1728362196772.png

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.
 
Upvote 0
nhưng chưa biết công năng nó làm gì

OPTIONS trong HTTP là lệnh gửi yêu cầu thiết đặt tùy chọn tại server trước khi gửi yêu cầu tiếp theo, để server hiểu là yêu cầu tiếp theo gửi đến các tùy chọn là khớp với OPTIONS đó để server nhận đúng yêu cầu và sẽ trả về kết quả theo OPTIONS đó.
Nếu anh viết mã HTTP đồng bộ thì quá trình gửi OPTIONS này sẽ thêm độ trễ.
Viết mã HTTP Bất đồng bộ là lập trình VBA nâng cao, để tiến đến viết mã ứng dụng chuyên nghiệp mà người học lập trình nên hướng đến. Hãy xem một ví dụ là Chrome tải hình ảnh của Intagram của một cá nhân, với hàng trăm ảnh cùng lúc. Thì không thể tải đồng bộ, nó sẽ tạo ra độ trễ lớn cho người xem.

Việc xử lý với svg trước đã, sau thì nếu có code svg rồi sao ra được Captcha anh nhỉ ?
Hãy hiểu về svg trước bạn nhé, svg nó có các ký tự định nghĩa cú pháp M L Q Z ... bạn chỉ cần xóa hết các chỉ số định vị vị trí chiều rộng cao đi. Giữ lại các ký tự cú pháp. Bây giờ việc bạn cần làm là nhấn nút tạo mới captcha để chép lại các dãy mã SVG từ 0-9 A-Z xóa như trên để sau này so sánh với SVG mới. Hãy nghĩ xem bạn sẽ thấy mỗi ký tự có chỉ số định vị vị trí theo chiều ngang, so sánh 1 trong các chỉ số này của mỗi ký tự bạn sẽ có được thứ tự vị trí 6 ký tự.
Mỗi tệp svg đều có 2 3 đường kẻ che phía trước, các định nghĩa cú pháp SVG của nó rất đơn giản, nên rất dễ phát hiện chúng để loại trừ ra.

Sử dụng biểu thức chính quy bạn sẽ làm được các điều trên.

Tôi cũng đang viết ứng dụng này, bước captcha tôi đã xử lý xong, giai đoạn tiếp theo là xử lý khối dữ liệu và tải dữ liệu. Viết ứng dụng về HDDT là không đơn giản tí nào.

Bạn có thể xem qua hình ảnh ứng dụng tôi viết. Và cũng sẽ sớm chia sẻ.

1728363065153.png

@quocphuoc88
Dữ liệu API và XML là giống hệt nhau, từ dữ liệu API viết mã tạo tệp XML, thay vì tải zip. Bạn có 10k hóa đơn, nếu bạn tải về máy tính của bạn thì chỉ tốn kém. có 2 cách để giải quyết vấn đề tải zip để tiết kiệm cho việc tải:
1. Tải zip sau khi bạn lọc danh sách ít hóa đơn.
2. Từ Dữ liệu API tạo ra xml/html.
 
Upvote 0
Có dòng thông tin gì để biết nó là gốc không bạn. Tôi không làm kế toán nên mù mờ vụ này.
Cấu trúc XML mà bạn đang tạo ra File được thuế quy định bắt buộc phải có các trường như thế (Khi xưa hóa đơn điện tử theo thông tư 32 cũ thì thuế không quy định => các nhà mạng thích làm các trường như thế nào là làm => nó vô vàng các tình huống. Nhưng từ khi hóa đơn theo thông tư 78 ra đời thì được chuẩn hóa như hiện tại). XML gốc từ các nhà mạng thì theo mình được biết các nhà mạng sẽ có thêm 1 vài trường khác ngoài các trường được quy định theo thông tư ví dụ như: trường link tra cứu hóa đơn, trường ghi chú số hợp đồng, hoặc những trường được thiết kế riêng cho từng công ty từ phía nhà mạng.
 
Upvote 0
Web KT

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

Back
Top Bottom