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

Liên hệ QC

Người dùng đang xem chủ đề này

ongke0711

Thành viên gắn bó
Tham gia
7/9/06
Bài viết
2,331
Được thích
3,142
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.
*** 05/02/2025: Thêm code tải file Zip và trích xuất dữ liệu hóa đơn từ file XML. Sửa một số lỗi.
*** 23/02/2025: Sửa lỗi hiển thị sai <Trạng thái hóa đơn>.
 

File đính kèm

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 1
Để 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.
Lấy từ json nó sẽ là trường: "msttcgp" và "cttkhac""dlieu"
 
Upvote 0
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.
Cái ý 1 thì mình khỏi bàn. Cái ý 2 thì mình không rõ là khi tạo ra được 1 File XML từ API => cung cấp cho cơ quan thuế => họ đưa vào ứng dụng của thuế nó có đọc được hay không thì cái này mới là quan trọng (vì ứng dụng này chỉ nội bộ của cơ quan thuế), vì có 1 lần mình cũng tạo ra 1 file XML từ DATA có sẵn nhưng khi cho vào ứng dụng của cơ quan thuế thì nó báo lỗi "Cấu trúc tệp không đúng quy định" (có thể do kiến thức mình không đủ để tìm được nguyên nhân nên từ đó là mình đi đường vòng: lấy File XML chuẩn từ hệ thống thuế rồi chỉ thay các giá trị vào theo từng trường cho phù hợp )
 
Upvote 0
Vấn đề sau khi tìm ra mã số thuế Tổ chức giải pháp hóa đơn điện tử là phải có Link tra cứu
Tôi thấy meinvoice của Misa và một vài Tổ chức giải pháp cho phép tải về PDF mà không cần captcha hoặc xác nhận là con người.

Danh sách link tra cứu:

STT
Tên tổ chức
MST
Trang thông tin cung cấp dịch vụ hóa đơn điện tử của tổ chức
Link tra cứu
1​
Công ty TNHH Công nghệ Vĩnh Hy​
0314743623​
2​
Công ty TNHH Hệ thống thông tin FPT​
0104128565​
3​
Công ty Cổ phần Công nghệ tin học EFY Việt Nam​
0102519041​
4​
Công ty Cổ phần Đầu tư công nghệ và thương mại Softdreams​
0105987432​
5​
Công ty TNHH L.C.S​
0302999571​
6​
Công ty TNHH Soft Ware KK VAT​
0313963672​
7​
Công ty Cổ phần CyberLotus​
0105232093​
8​
Công ty TNHH Giải pháp công nghệ Ngô Gia Phát​
0311942758​
9​
Công ty Cổ phần Mắt Bão​
0302712571​
10​
Công ty Cổ phần công nghệ thẻ Nacencomm​
0103930279​
11​
Công ty Cổ phần Megabiz Việt Nam​
0105844836​
12​
Công ty TNHH Công nghệ LCD Việt Nam​
0312483391​
13​
Công ty Cổ phần MISA​
0101243150​
14​
Công ty TNHH Hóa đơn điện tử M-INVOICE​
0106026495​
15​
Công ty Cổ phần Phát triển công nghệ Nguyễn Minh​
0313906508​
16​
Công ty TNHH Phát triển công nghệ Thái Sơn​
0101300842​
17​
Công ty TNHH Máy tính và truyền thông công nghệ kết nối​
0306784030​
18​
Công ty Cổ phần công nghệ số và in đồ họa​
0200638946​
19​
Công ty TNHH Win Tech Solution​
0312303803​
20​
Tập đoàn Công nghiệp - Viễn thông quân đội​
0100109106​
21​
Công ty Cổ phần Công nghệ thông tin Đông Nam Á​
0102454468​
22​
Công ty Cổ phần hóa đơn điện tử New-Invoice​
0105937449​
23​
Công ty Cổ phần Giải pháp phần mềm 3A​
0108516079​
24​
Tổng công ty Viễn thông Mobifone​
0100686209​
25​
Công ty Cổ phần BKAV​
0101360697​
26​
Công ty Cổ phần phát triển phần mềm ASIA​
0101162173​
27​
Công ty Cổ phần thương mại Visnam​
0401486901​
28​
Công ty Cổ phần Thiết bị điện - Điện tử Bách Khoa​
0200784873​
29​
Tập Đoàn Bưu chính viễn thông Việt Nam​
0100684378​
30​
Công ty Cổ phần dịch vụ T-VAN HILO​
0106713804​
31​
Công ty Cổ phần Minh Khang Group​
0314209362​
32​
Công ty Cổ phần Giải pháp hóa đơn điện tử Việt Nam​
0101352495​
33​
Công ty Cổ phần giải pháp thanh toán Việt Nam​
0102182292​
34​
Công ty Cổ phần ICORP​
0106870211​
35​
Công ty Cổ phần đầu tư và công nghệ idocNet​
0104614692​
36​
Công ty Cổ phần chữ ký số VI NA​
0309612872​
37​
Công ty Cổ phần TS24​
0309478306​
38​
Công ty TNHH Hóa đơn điện tử TCT​
0315298333​
39​
Công ty TNHH Tin học Tia lửa Việt​
0303609305​
40​
Công ty Cổ phần phần mềm quản lý doanh nghiệp​
0100727825​
41​
Công ty TNHH ACCONLINE.VN​
0315467091​
42​
Công ty Cổ phần công nghệ hóa đơn điện tử HT​
0315638251​
43​
Công ty Cổ phần công nghệ ITT​
0105958921​
44​
Công ty TNHH PA Việt Nam​
0302431595​
45​
Công ty Cổ phần tích hợp công nghệ VNISC​
0103018807​
46​
Công ty TNHH Giải pháp hóa đơn điện tử My – Invoice​
0106820789​
47​
Công ty Cổ phần Chứng số An toàn​
0310151055​
48​
Công ty Cổ phần công nghệ San Phú​
0303430876​
49​
Công ty TNHH Giấy vi tính Liên Sơn​
0301452923​
50​
Công ty TNHH Thương Mại dịch vụ Online VI NA​
0314185087​
51​
Công ty Cổ phần dịch vụ viễn thông và in Bưu điện​
0100687474​
52​
Công ty TNHH Tuần Châu​
0400462489​
53​
Công ty TNHH Minh Thư​
3500456910​
54​
Công ty Cổ phần phát triển công nghệ ACMAN​
0104908371​
55​
Công ty TNHH Tư vấn thương mại Trí Việt Luật​
0315191291​
56​
Công ty TNHH Đầu tư Hòn Ngọc Việt​
0313844107​
57​
Công ty TNHH Dịch vụ Trí Việt Luật​
0311622035​
58​
Công ty Cổ phần truyền số liệu Việt Nam​
0106361479​
59​
Công ty TNHH NC9 Việt Nam​
0312270160​
60​
Công ty Cổ phần giải pháp First Trust​
0104493085​
61​
Công ty TNHH Phần mềm Nhân Hòa​
0101289966​
62​
Công ty TNHH Kế toán và tư vấn V.L.C​
0303211948​
63​
Công ty Cổ phần Công nghệ và giải pháp Tâm Việt​
0101622374​
64​
Công ty TNHH Dịch vụ phần mềm AVSE​
0310768095​
65​
Công ty TNHH MTV in Bến Thành​
0312961577​
66​
Công ty TNHH ZAMO​
0313950909​
67​
Công ty Cổ phần công nghệ VIETINFO​
0311928954​
68​
Công ty Cổ phần phát triển phần mềm và công nghệ Bitware​
0103770970​
69​
Công ty Cổ phần phần mềm Rosy​
0305142231​
70​
Công ty TNHH MTV thương mại dịch vụ Trần Đình Tùng​
3702037020​
71​
Công ty TNHH Tổng công ty Công nghệ và Giải pháp CMC​
0101925883​
72​
Công ty TNHH Công nghệ và tư vấn Phương Nam​
0316642395​
73​
Công ty TNHH Dịch vụ kế toán - Tư vấn thuế TTL​
0315194912​
74​
Công ty Cô phần Công nghệ Phát triển hóa đơn điện tử Việt Nam​
0315983667​
75​
Công ty TNHH Phần mềm kế toán và dịch vụ thủ tục thuế Sài Gòn​
0310926922​
76​
Công ty Cổ phần Phần mềm Thăng Long​
0101010702​
77​
Công ty Cổ phần Hóa đơn điện tử TIG Thăng Long​
0102720409​
78​
Công ty TNHH Viễn thông Đông Sài Gòn​
0314058603​
79​
Công ty Cổ phần Tin học Lạc Việt​
0301448733​
80​
Công ty Cổ phần Công nghệ TADU​
0313253288​
81​
Công ty Cổ phần Công nghệ UNIT​
0309889835​
82​
Công ty Cổ phần phát triển và ứng dụng phần mềm Bách Khoa​
0202029650​
83​
Công ty Cổ phần My Software​
0108971656​
84​
Công ty TNHH Công nghệ HT Sài Gòn​
0312942260​
85​
Công ty TNHH WEBCASH Việt Nam​
1201496252​
86​
Công ty TNHH Phần mềm và Tư vấn Kim Tự Tháp​
0303549303​
87​
Công ty TNHH Phần mềm BRB​
0311914694​
88​
Công ty TNHH Nhóm Mây​
0312617990​
89​
Công ty Cổ phần Hóa đơn điện tử VININVOICE​
0109282176​
90​
Trung tâm Tin học và Công nghệ số​
0102723181​
91​
Công ty Cổ phần VETC​
0106858609​
92​
Công ty TNHH Phần mềm PVS​
0315151651​
93​
Công ty Cổ phần Dịch vụ Thương mại Việt Nam trực tuyến​
0310151739​
94​
Công ty TNHH Ecount Việt Nam​
0312575123​
95​
Công ty Cổ phần ATIS​
0107732197​
96​
Công ty Cổ phần GMO-Z.com RUNSYSTEM​
0101659906​
97​
Công ty Cổ phần Tin học - Viễn thông Hàng không​
0103019524​
98​
Công ty TNHH Bizzi VietNam​
0316114998​
99​
Công ty Cổ phần Công nghệ BEE​
0316636497​
100​
Công ty Cổ phần MONT-E​
0106249501​
101​
Công ty TNHH Tư vấn và Dịch vụ Home Casta​
0201802839​
102​
Công ty CP Tư vấn và Chuyển giao công nghệ Sơn Phát​
4601328480​
103​
Công ty Cổ phần công nghệ KIOTVIET​
0104359717​
Bài đã được tự động gộp:

lấy File XML chuẩn từ hệ thống thuế rồi chỉ thay các giá trị vào theo từng trường cho phù hợp
Nếu bạn làm được điều này thì từ mục 2 tôi nói ở trên là khả thi.
 
Upvote 0
công ty trung gian phát hành hóa đơn
Phát hành hóa đơn có bắt buộc bạn phải mua hóa đơn bên tổ chức giải pháp không?
Nếu bạn đã có chữ ký số Remote thì bạn có thể tự phát hành hóa đơn tại Hệ thống hóa đơn điện tử không?
Hỏi chung là không cần tổ chức giải pháp, bạn có thể tự quản lý và phát hành hóa đơn tại Hệ thống hóa đơn điện tử không?
 
Upvote 0
svg nó có các ký tự định nghĩa cú pháp M L Q Z
Mã:
<path fill="#333" d="M110.37 35.20L110.31 35.14L107.99 28.36L108.04 28.41Q103.61 15.76 97.67 9.36L97.57 9.27L97.62 9.31Q99.68 10.42 102.26 11.02L102.20 10.96L102.34 11.10Q107.42 17.32 111.76 30.08L111.67 29.98L111.73 30.05Q114.81 21.97 115.50 20.38L115.55 20.42L115.51 20.39Q117.82 14.71 120.64 11.39L120.61 11.36L120.60 11.36Q122.74 11.06 125.37 10.18L125.42 10.23L125.41 10.22Q120.83 14.82 117.78 22.05L117.70 21.97L117.83 22.10Q116.27 25.60 112.58 35.12L112.74 35.28L112.70 35.25Q112.01 35.12 111.44 35.09L111.57 35.21L111.42 35.07Q110.99 35.20 110.41 35.24ZM115.48 37.72L115.32 37.56L115.31 37.55Q118.14 27.59 119.70 23.55L119.64 23.49L119.81 23.66Q122.67 15.82 127.08 10.95L127.12 10.98L127.11 10.98Q126.03 11.31 123.94 12.03L124.05 12.14L125.17 10.79L125.24 10.86Q125.73 10.09 126.34 9.44L126.45 9.55L126.44 9.55Q123.53 10.44 120.52 11.01L120.44 10.92L120.55 11.04Q116.06 16.25 112.18 27.71L112.23 27.77L112.25 27.79Q108.63 17.69 105.43 13.31L105.48 13.37L105.45 13.34Q104.95 13.14 104.07 12.99L104.22 13.13L104.23 13.14Q103.88 12.64 102.28 10.59L102.25 10.55L102.42 10.73Q99.38 9.93 96.68 8.52L96.57 8.42L96.65 8.49Q103.25 15.55 107.63 28.35L107.72 28.44L107.72 28.43Q108.96 32.11 110.14 35.69L110.11 35.66L110.08 35.63Q110.46 35.71 111.30 35.59L111.36 35.65L111.20 35.49Q111.56 36.20 112.25 37.53L112.21 37.49L112.34 37.62Q113.16 37.53 113.89 37.61L113.87 37.59L113.80 37.52Q114.59 37.58 115.35 37.58Z"/>
Đã tìm ra chữ "V"
 
Upvote 0
Phát hành hóa đơn có bắt buộc bạn phải mua hóa đơn bên tổ chức giải pháp không?
Nếu bạn đã có chữ ký số Remote thì bạn có thể tự phát hành hóa đơn tại Hệ thống hóa đơn điện tử không?
Hỏi chung là không cần tổ chức giải pháp, bạn có thể tự quản lý và phát hành hóa đơn tại Hệ thống hóa đơn điện tử không?
Thú thật với anh vụ này vĩ mô quá, bản thân em cũng không nắm được.
Nhưng nói chung để có thể đáp ứng cơ sở hạ tầng có thể truyền nhận thông tin với tổng cục thuế thì doanh nghiệp cũng phải có đội ngũ nhân viên phần mềm và hạ tầng phần cứng anh ạ. Như công ty em sử dụng VNPT để làm trung gian phát hành, hiện tại do nhu cầu muốn lưu trữ dữ liệu hóa đơn điện tử về sever công ty thay vì sử dụng của VNPT thì công ty cũng phải chi ra 1 khoản tiền khá lớn để đảm bảo hạ tầng. Nên đối với các doanh nghiệp vừa và nhỏ việc tự phát hành hóa đơn điện tử với thuế gần như là không có khả năng.
 
Upvote 0
Em có dùng thử tool này nhưng chỉ tải được hóa đơn từ phần "Đã cấp mã hóa đơn", còn phần "Tổng cục thuế đã nhận không mã" và phần "HĐ có mã từ máy tính tiền" thì không tải về được ạ
 

File đính kèm

  • 1728372987487.png
    1728372987487.png
    16.4 KB · Đọc: 56
Upvote 0
Em có dùng thử tool này nhưng chỉ tải được hóa đơn từ phần "Đã cấp mã hóa đơn", còn phần "Tổng cục thuế đã nhận không mã" và phần "HĐ có mã từ máy tính tiền" thì không tải về được ạ
Cái này chỉ cần đổi tham số txly thành 6, 8 là được. Chưa làm thôi bạn :) .
 
Upvote 0
Trong svg mỗi ký tự có 2, 3, 4, 5, 6 nét vẽ, tôi tạo một hàm trích xuất các ký tự như sau:

a = "MQQQQQZMQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZMQQZ"
b = "MQQQQQQQQQZMQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQZMQQQQQQQQZ"
c = "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ"
d = "MQQQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQZ"
e = "MQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
f = "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ"

Tôi chỉ giữ 3 ký mã M Q Z, vì M là bắt đầu vẽ, Z là kết thúc nét vẽ, Q là một cú pháp biểu thị vẽ đường cong, các cú pháp Q của mỗi ký tự là khác nhau nhờ vậy mà các ký tự trích xuất không có trùng.

Cho danh sách vào Dictionary và với svg mới chạy lại hàm trích xuất và tìm trùng.

Với 80 dòng mã là giải được. Tôi giải mẹo này chỉ mất 30 phút, mất 1 tiếng để chép đủ ký tự. Chỉ là một bài toán lập trình thôi, mọi cố gắng sẽ thành công bạn nhé.

Khi nào bí, tôi sẽ gợi ý bạn mẹo tiếp theo
Bài đã được tự động gộp:

Thú thật với anh vụ này vĩ mô quá, bản thân em cũng không nắm được.
Nhưng nói chung để có thể đáp ứng cơ sở hạ tầng có thể truyền nhận thông tin với tổng cục thuế thì doanh nghiệp cũng phải có đội ngũ nhân viên phần mềm và hạ tầng phần cứng anh ạ. Như công ty em sử dụng VNPT để làm trung gian phát hành, hiện tại do nhu cầu muốn lưu trữ dữ liệu hóa đơn điện tử về sever công ty thay vì sử dụng của VNPT thì công ty cũng phải chi ra 1 khoản tiền khá lớn để đảm bảo hạ tầng. Nên đối với các doanh nghiệp vừa và nhỏ việc tự phát hành hóa đơn điện tử với thuế gần như là không có khả năng.
Trước tôi có đọc qua bài viết tổng cục chỉ dẫn lưu trữ quản lý hóa đơn, cũng hơi phức tạp. Tốt nhất vẫn cần Tổ chức giải pháp, tiết kiệm chi phí.
Không biết khi dựa vào Tổ chức giải pháp thì có rắc rối hay nhược điểm gì không. Trước mắt tôi thấy nhiều thứ đều phụ thuộc vào họ.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi nào bí, tôi sẽ gợi ý bạn mẹo tiếp theo
Nhờ hướng dẫn của anh @HeSanbi Em làm thử cái vượt qua CAPTCHA của hddt.
Anh @ongke0711 xem thử có dùng để ứng dụng đâu không nhé.
Phần code em có bổ sung thêm logic để có thể ứng dụng cho nhiều web khác nhau, cho phép mình tự lập thư viện mới.
Nếu thư viện đủ thì hiện captcha luôn, còn không thì sẽ tự bổ sung các ký tự thiếu, cho đến khi đủ ký tự (các anh xóa bớt phần dữ liệu trong sheet dic) Nhấn Get Captcha để thêm vào thư viện.
p/s: Update thêm nút refresh.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Nhờ hướng dẫn của anh @HeSanbi Em làm thử cái vượt qua CAPTCHA của hddt.
Anh @ongke0711 xem thử có dùng để ứng dụng đâu không nhé.
Phần code em có bổ sung thêm logic để có thể ứng dụng cho nhiều web khác nhau, cho phép mình tự lập thư viện mới.
Nếu thư viện đủ thì hiện captcha luôn, còn không thì sẽ tự bổ sung các ký tự thiếu, cho đến khi đủ ký tự (các anh xóa bớt phần dữ liệu trong sheet dic) Nhấn Get Captcha để thêm vào thư viện.
p/s: Update thêm nút refresh.
Dùng code vượt captcha thì nó thuận tiện hơn cách tôi đang dùng là hiển thị ảnh thông qua Web browser control. Có một số máy tính trình duyệt nó chặn nên phải thiết lập lại trong Internet Option của trình duyệt.
 
Upvote 0
Dùng code vượt captcha thì nó thuận tiện hơn cách tôi đang dùng là hiển thị ảnh thông qua Web browser control. Có một số máy tính trình duyệt nó chặn nên phải thiết lập lại trong Internet Option của trình duyệt.
Em đang cho hiển thị để mình có cái nhìn trực quan thôi, và thiên về tìm hiểu. Chứ sau khi quét đủ ký tự thì em làm mảng hằng (const) trong module luôn.
Xem đây như đó công cụ để mình ứng dụng lập thư viện cho dạng Captcha này.
trình duyệt nó chặn nên phải thiết lập lại trong Internet Option của trình duyệt.
Mình lưu về svg trong máy mà vẫn bị Internet Option hả anh, em nghĩ thuần túy hiển thị thôi thì chắc không bị kiểm soát chặt vậy.
 
Upvote 0
Em đang cho hiển thị để mình có cái nhìn trực quan thôi, và thiên về tìm hiểu. Chứ sau khi quét đủ ký tự thì em làm mảng hằng (const) trong module luôn.
Xem đây như đó công cụ để mình ứng dụng lập thư viện cho dạng Captcha này.

Mình lưu về svg trong máy mà vẫn bị Internet Option hả anh, em nghĩ thuần túy hiển thị thôi thì chắc không bị kiểm soát chặt vậy.
Máy bạn tôi bị và đang dùng Office 2016.

hddt.jpg
 
Upvote 0
Mình bị lỗi như sau:
 

File đính kèm

  • CleanShot 2024-10-09 at 11.04.07.png
    CleanShot 2024-10-09 at 11.04.07.png
    59.8 KB · Đọc: 62
  • CleanShot 2024-10-09 at 11.04.39.png
    CleanShot 2024-10-09 at 11.04.39.png
    118.4 KB · Đọc: 60
Upvote 0
@huhumalu
Dùng các API GDIPlus vẽ các SVG Path trực tiếp lên Userform là được không cần đến WebBrowser ActiveX rất rờm rà. Google bạn sẽ tìm thấy thư viện clsGPIPlus, nhưng thư viện này là thư viện chung nên khá tốn kém. Trong đó có phương thức vẽ SVG.


Giải đơn giản như thế này không cần phức tạp, chỉ có 6 ký tự không cần đến thuật toán QuickSort.

-----------------------------------------------------------------------------
Nếu bạn đang tận dụng thuật toán QuickSort cho nhiều dự án, bạn có thể tham khảo thuật toán QuickSort tôi đã tối ưu lại với xử lý tại memory, giúp cải thiện tốc độ, tại bài viết này.

JavaScript:
Function detectSVGCaptcha(ByVal svgCaptcha$) As String
  Dim s$, p, i%, j%, z, k%, re, ms, m, v$, d
  Set d = glbDict: Set re = glbRegex
  re.Pattern = "([MQZ])([^MQZ]*)"
  p = Split(svgCaptcha, " d=\""")
  ms = ListPathAllKeywords
  For i = 0 To UBound(ms)
    If ms(i) <> Empty Then d(ms(i)) = i
  Next
  ReDim z(1 To 6)
  For i = 1 To UBound(p)
    s = Split(p(i), "\""")(0)
    Set ms = re.Execute(s): 'm0 = 0: m1 = 0
    s = re.Replace(s, "$1") 'If Len(s) > 5
    If d.Exists(s) Then
      k = k + 1: z(k) = Array(Val(ms(0).submatches(1)), IIf(d(s) <= 26, chr(d(s) + 65), d(s) - 26))
    End If
  Next
  If k > 0 Then
    For i = 1 To k
      For j = i + 1 To k
        If z(i)(0) > z(j)(0) Then m = z(i): z(i) = z(j): z(j) = m
      Next
    Next
    s = ""
    For i = 1 To k
      s = s & z(i)(1)
    Next
    detectSVGCaptcha = s
  End If
End Function
Private Function glbRegex(Optional bGlobal As Boolean = True, Optional IgnoreCase As Boolean = True, Optional MultiLine As Boolean = True) As Object
  Set glbRegex = CreateObject("VBScript.RegExp")
  With glbRegex: .Global = bGlobal: .IgnoreCase = IgnoreCase: .MultiLine = MultiLine: End With
End Function
Private Function glbDict(Optional ByVal CompareMode As Boolean) As Object
  Set glbDict = CreateObject("Scripting.Dictionary")
  glbDict.CompareMode = -CompareMode
End Function
Private Function ListPathAllKeywords()
  Dim a$, b$, c$, d$, e$, f$, g$, h$, i$, j$, k$, l$, m$, n$, o$, p$, q$, r$, s$, t$, u$, v$, w$, x$, y$, z$
  Dim k0$, k1$, k2$, k3$, k4$, k5$, k6$, k7$, k8$, k9$, aa
  a = "MQQQQQZMQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZMQQZ"
  b = "MQQQQQQQQQZMQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQZMQQQQQQQQZ"
  c = "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ"
  d = "MQQQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQZ"
  e = "MQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  f = "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ"
  g = "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  h = "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ"
  i = ""
  j = "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZ"
  k = "MQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ"
  l = ""
  m = "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  n = "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZ"
  o = ""
  p = "MQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ"
  q = "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQZ"
  r = "MQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ"
  s = "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  t = "MQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQZ"
  u = ""
  v = "MQQQQQQQQQQZMQQQQQQQQQQQQQQQQZ"
  w = "MQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  x = "MQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ"
  y = "MQQQQQQQQQZMQQQQQQQQQQQQQZ"
  z = "MQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ"
  k0 = ""
  k1 = ""
  k2 = "MQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  k3 = "MQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  k4 = "MQQQQZMQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQZ"
  k5 = "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ"
  k6 = "MQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQZ"
  k7 = "MQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZ"
  k8 = "MQQQQQQQQZMQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQZMQQQQQQQZ"
  k9 = "MQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQZ"
  ListPathAllKeywords = Array(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, k0, k1, k2, k3, k4, k5, k6, k7, k8, k9)
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
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 ạ
sao ko xài phần mềm S3TCloud Plugin đang free đó,
Về cơ bản nó đáp ứng được tra cứu hóa đơn mua vào - bán ra
 
Upvote 0
Hình như mã nguồn dùng activex control WebBrowser - Nó dùng các dịch vụ hỗ trợ từ Internet Explorer (IE) thì phải. Mà IE không còn được hỗ trợ nữa thay vào đó MS đã chuyển sang Microsoft Edge. Theo em, nếu được thì cố gắng tránh việc dùng IE có lẽ ứng dụng sẽ chạy được trên nhiều máy tính hơn.
 
Upvote 0
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: 34
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: 21
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: 21
Upvote 0
Cái này hay đây, cảm ơn bác chia sẻ không nghĩ vba làm được món này
 
Upvote 0
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.
Tôi cũng phát hiện cái lỗi như hình của bạn và đang sửa lại code. Xong nhờ bạn kiểm tra lại nhé.
 
Upvote 0
@ongke0711 các dạng ngày trong json anh phải sử dụng hàm ParseIso để chuyển đổi thành ngày chính xác
Ở Việt Nam ParseIso sẽ chuyển ngày và cộng thêm 7 giờ.
 
Upvote 0
Đã cập nhật sửa một đống lỗi. Các bạn test lại xem như thế nào nhé.
Bản cập nhật quá tuyệt vời. Thật sự cám ơn file này của bạn rất có ích cho kế toán.
Tôi phát sinh 1 lỗi null khi tải "Hóa đơn mua vào - Không có mã cơ quan thuế cấp"
Mã:
ws.Cells(row, c + 2).Value = CDate(Left(item(arrColName(c)), 10))
Bạn đang lấy ngày lập hóa đơn theo "ncma" có phải là ngày cơ quan thuế cấp mã không. Nếu đúng vậy thì trường hợp này sẽ null vì đang chọn "Không có mã cơ quan thuế cấp" thì đâu có "ngày cơ quan thuế cấp mã" cho trường hợp này.
Mã:
...
msttcgp = JsonObject("datas")(l)("msttcgp")
tiếp đó biến msttcgp này cũng sẽ lỗi.
 

File đính kèm

  • Test_Error_1.png
    Test_Error_1.png
    162.1 KB · Đọc: 37
Lần chỉnh sửa cuối:
Upvote 0
Sẵn chỗ này anh @HeSanbi gợi ý thêm.
Em đọc thấy có đề cập đến việc sử dụng async-xmlhttp-request dạng gửi request bất đồng bộ. Tận dụng thời gian gửi để xử lý việc khác, anh có từng tận dụng hay có viết hàm gì chỗ này không.
Em thấy nó rất phù hợp kiểu gửi request liên tục.
 
Upvote 0
Rất cảm ơn bạn chia sẻ! Bạn phát triển thêm phần tra theo MST người Mua/Bán nữa thì tuyệt!
 
Upvote 0
Sẵn chỗ này anh @HeSanbi gợi ý thêm.
Em đọc thấy có đề cập đến việc sử dụng async-xmlhttp-request dạng gửi request bất đồng bộ. Tận dụng thời gian gửi để xử lý việc khác, anh có từng tận dụng hay có viết hàm gì chỗ này không.
Em thấy nó rất phù hợp kiểu gửi request liên tục.
Tôi đã viết nó và tận dụng cho những dự án đã được chia sẻ trên diễn đàn như: TaxCode, TranslateXL, dữ liệu tài chính và chứng khoán, ...
 
Lần chỉnh sửa cuối:
Upvote 0
Xem lại giúp mình bị lỗi như thế này
 

File đính kèm

  • 1.PNG
    1.PNG
    124.4 KB · Đọc: 38
Upvote 0
Bạn đang lấy ngày lập hóa đơn theo "ncma" có phải là ngày cơ quan thuế cấp mã không. Nếu đúng vậy thì trường hợp này sẽ null vì đang chọn "Không có mã cơ quan thuế cấp" thì đâu có "ngày cơ quan thuế cấp mã" cho trường hợp này.
Mã:
...
msttcgp = JsonObject("datas")(l)("msttcgp")
tiếp đó biến msttcgp này cũng sẽ lỗi.
Đúng trường hợp này đó bạn. Để tô bẫy lỗi cho điều kiện này. :)
Tôi không trong ngành nên cũng không chắc là có lấy đúng các trường trong file xml để thể hiện trên file Excel hay chưa.
 
Lần chỉnh sửa cuối:
Upvote 0
Đúng trường hợp này đó bạn. Để tô bẫy lỗi cho điều kiện này. :)
Tôi không trong ngành nên cũng không chắc là có lấy đúng các trường trong file xml để thể hiện trên file Excel hay chưa.
Nếu ở góc độ kế toán tôi chỉ quan tâm "ngày hóa đơn" là ngày giao dịch HHDV. Tôi nghĩ ở đây là tham số "tdlap" (tôi đoán là viết tắt của "thời điểm lập". Nếu tìm theo giá trị này thì không bao giờ "null" cho tất cả trường hợp. Còn bên thuế họ sẽ căn cứ "ngày lập hóa đơn" (ntao), "ngày cấp mã cơ quan thuế"(ncma) để xem cty nào xuất hóa đơn không đúng thời điểm sẽ bị phạt. Trong thực tế không phải cty nào cũng có bộ máy kế toán cuối ngày xuất hóa đơn kịp và có khi cty phải chấp nhận xuất sai ngày. Lúc giải trình thì tùy mức độ mà bị phạt cảnh cáo hoặc theo khung phạt tiền. Nên cột "ngày lập" hóa đơn trên các file bảng kê xlsx tôi thấy thuế vẫn căn cứ vào ngày ghi trên hóa đơn.
 
Upvote 0
Điều kiện từ ngày đến ngày, Nếu ta chọn cùng ngày thì bị báo lỗi bạn, với hóa đơn có một số chi phí khác như thuế Tiêu Thụ Đặc Biệt, thế hay phí khác thì Sheet chi tiết hóa đơn không hiển thị được!
 
Upvote 0
Sẵn chỗ này anh @HeSanbi gợi ý thêm.
Em đọc thấy có đề cập đến việc sử dụng async-xmlhttp-request dạng gửi request bất đồng bộ. Tận dụng thời gian gửi để xử lý việc khác, anh có từng tận dụng hay có viết hàm gì chỗ này không.
Em thấy nó rất phù hợp kiểu gửi request liên tục.
Chắc ý tưởng theo tôi là như vầy không biết có đúng không, tạo một loạt đối tượng XMLHTTP tương ứng với số lượng URL, tiếp theo tạo một loạt đối tượng callback gán cho thuộc tính onReadyStateChange của đối tượng XMLHTTP.
Trước khi chạy, cần mở Internet Options, chọn tab Security, chọn tiếp Custom Level. Trong mục Miscellaneous, chọn Enable cho Access data sources across domains, sau đó nhấn OK để lưu lại.
1728913750396.png
1728913782321.png
1728913834665.png
1728913967521.png
 

File đính kèm

Upvote 0
1728913750396.png

Cái này không nhất thiết, có chọn disabled cũng không sao
phải đánh dấu các SSL và TLS ở mục Internet Properties/Advenced/Settings

Lập trình HTTP bất đồng bộ không đơn giản là tạo mã là được, ví dụ có 10000 hóa đơn cần tải về, không đơn giản là cho vòng lặp khởi tạo lớp.
Yêu cầu nhất thiết:
1. Quản lý RAM và CPU: Không thể khởi tạo và gửi 10000 yêu cầu liên tục, không đủ RAM, và CPU để xử lý. Phải có giới hạn 30, 40, 100, để dừng gửi yêu cầu trong một lần chạy, và khi nào tiếp tục gửi yêu cầu. Bạn sẽ nhận được một khung thông báo lỗi "Out of stack space" nếu bỏ qua yêu cầu này.
2. Phân chia công việc, lưu trữ công việc và gán vào yêu cầu, để khi nhận được kết quả và xử lý. Không thể cứ mỗi công việc là tạo một lớp mới để viết mã. Xác định được công việc kết thúc khi nào, để giải phóng bộ nhớ kịp thời, nhường bộ nhớ cho công việc tiếp theo, trong công việc có chia ra các task riêng lẻ, quản lý các task này như thế nào.
3. Chia và xử lý các task riêng lẻ trong công việc.
4. Với các HTTP vấn đề lưu trữ và quản lý Cookie như thế nào cho hợp lý nếu có.
5. Giả sử như các yêu cầu bắt buộc chạy đồng bộ trong mã bất đồng bộ thì sao, và cũng bắt buộc gửi đồng bộ cách một khoảng thời gian thì sao.
Ví dụ trên trang masothue.com yêu cầu này là bắt buộc, để tránh bị chặn.​
6. Giải phóng bộ nhớ các công việc, các task, các HTTP đã khởi tạo như thế nào cho hợp lý.
7. .....rất nhiều.

Tải dữ liệu Hóa đơn điện tử vẫn còn đơn giản, dữ liệu tài chính và chứng khoáng mới đủ để đưa vào bài học lập trình VBA nâng cao. Vì ở đó mỗi nguồn cấp dữ liệu với mỗi phương thức chia sẻ dữ liệu khác nhau, đấy là điều mà các yêu cầu nhất thiết là cần thiết.

Tất cả những yêu cầu nhất thiết về Lập trình HTTP bất đồng bộ trên tôi đã phát triển vào các dự án, trong đó phiên bản mới nhất tôi đang phát triển để hoàn thiện tốt nhất.
 
Upvote 0
Cái này không nhất thiết, có chọn disabled cũng không sao
phải đánh dấu các SSL và TLS ở mục Internet Properties/Advenced/Settings

Lập trình HTTP bất đồng bộ không đơn giản là tạo mã là được, ví dụ có 10000 hóa đơn cần tải về, không đơn giản là cho vòng lặp khởi tạo lớp.
Yêu cầu nhất thiết:
1. Quản lý RAM và CPU: Không thể khởi tạo và gửi 10000 yêu cầu liên tục, không đủ RAM, và CPU để xử lý. Phải có giới hạn 30, 40, 100, để dừng gửi yêu cầu trong một lần chạy, và khi nào tiếp tục gửi yêu cầu. Bạn sẽ nhận được một khung thông báo lỗi "Out of stack space" nếu bỏ qua yêu cầu này.
2. Phân chia công việc, lưu trữ công việc và gán vào yêu cầu, để khi nhận được kết quả và xử lý. Không thể cứ mỗi công việc là tạo một lớp mới để viết mã. Xác định được công việc kết thúc khi nào, để giải phóng bộ nhớ kịp thời, nhường bộ nhớ cho công việc tiếp theo, trong công việc có chia ra các task riêng lẻ, quản lý các task này như thế nào.
3. Chia và xử lý các task riêng lẻ trong công việc.
4. Với các HTTP vấn đề lưu trữ và quản lý Cookie như thế nào cho hợp lý nếu có.
5. Giả sử như các yêu cầu bắt buộc chạy đồng bộ trong mã bất đồng bộ thì sao, và cũng bắt buộc gửi đồng bộ cách một khoảng thời gian thì sao.
Ví dụ trên trang masothue.com yêu cầu này là bắt buộc, để tránh bị chặn.​
6. Giải phóng bộ nhớ các công việc, các task, các HTTP đã khởi tạo như thế nào cho hợp lý.
7. .....rất nhiều.

Tải dữ liệu Hóa đơn điện tử vẫn còn đơn giản, dữ liệu tài chính và chứng khoáng mới đủ để đưa vào bài học lập trình VBA nâng cao. Vì ở đó mỗi nguồn cấp dữ liệu với mỗi phương thức chia sẻ dữ liệu khác nhau, đấy là điều mà các yêu cầu nhất thiết là cần thiết.

Tất cả những yêu cầu nhất thiết về Lập trình HTTP bất đồng bộ trên tôi đã phát triển vào các dự án, trong đó phiên bản mới nhất tôi đang phát triển để hoàn thiện tốt nhất.
Tất nhiên, cái code kia của tôi chỉ là dạng đơn giản nhất không quan tâm đến vấn đề tài nguyên máy tính, chỉ đơn thuần là hiển thị kết quả yêu cầu gửi đi đã thành công hay chưa. Nếu không cần đắn đo tài nguyên như CPU, RAM, v.v., của máy tính, thì không phải cứ khởi tạo tầm 100 đối tượng xmlhttp là đồng nghĩa với việc tạo ra 100 kết nối đồng thời đến máy chủ, cái này còn phụ thuộc vào giới hạn kết nối TCP đồng thời do Windows đặt ra nữa.
Điểm nghẽn lớn nhất ở đây là VBA do chỉ hỗ trợ đơn luồng (STA thread), response trả về hàng loạt mà mỗi lần chỉ có thể xử lý một response trong một thời điểm, trường hợp này nếu xung nhịp CPU đơn nhân càng cao thì càng tốt.
 
Upvote 0
Điều kiện từ ngày đến ngày, Nếu ta chọn cùng ngày thì bị báo lỗi bạn, với hóa đơn có một số chi phí khác như thuế Tiêu Thụ Đặc Biệt, thế hay phí khác thì Sheet chi tiết hóa đơn không hiển thị được!
Đã sửa lỗi nhập cùng ngày và các báo lỗi Null.
 
Upvote 0
Chắc ý tưởng theo tôi là như vầy không biết có đúng không, tạo một loạt đối tượng XMLHTTP tương ứng với số lượng URL, tiếp theo tạo một loạt đối tượng callback gán cho thuộc tính onReadyStateChange của đối tượng XMLHTTP.
Trước khi chạy, cần mở Internet Options, chọn tab Security, chọn tiếp Custom Level. Trong mục Miscellaneous, chọn Enable cho Access data sources across domains, sau đó nhấn OK để lưu lại.
View attachment 304770
View attachment 304771
View attachment 304772
View attachment 304773
Đúng rồi. Cái bạn làm đang giống như duyệt web mà dùng trình duyệt mở nhiều trang web cùng lúc. Nếu bạn nào đọc truyện tranh online sẽ hay làm, đọc tập 1 thì tab bên cạnh load tập 2, cuốn chiếu như vậy, chứ không chờ duyệt từng cái cho xong, như vậy thì tiết kiệm được rất nhiều thời gian.
 
Upvote 0
Nay em mới có thời gian để test thử file của anh, tốc độ có vẻ bất ổn anh ạ, em thử tải data của 2 ngày thôi mà Excel đơ và phải mất khoảng 34 giây.
Nếu cần tải dữ liệu 1 tháng thì có thể không gồng nổi, liệu VBA có gánh nổi nhiệm vụ này không. :unknw:

1729045773064.png
 
Upvote 0
- Em đăng nhập bị lỗi khi có mở thêm file excel khác như thế này

Lỗi đăng nhập xong thì không hiện khung nhập ngày tháng.png

- Tương tự lỗi nhập ngày tháng khi có mở file excel khác

Lỗi .png

- Khi gặp những lỗi này thì khá bất tiện khi phải đăng nhập lại từ đầu tài khoản và mật khẩu, nếu có thêm phần lưu tài khoản đăng nhập gần nhất thì quá ok ạ
- Mà sao không tải luôn cả hóa đơn không mã của cơ quan thuế và Máy tính tiền cùng 1 lúc luôn cho tiện mà lại phải tách ra cho cực công ạ
Này là quan điểm cá nhân ạ, không có ý công kích hay bắt lỗi gì nhé !
 
Upvote 0
Nay em mới có thời gian để test thử file của anh, tốc độ có vẻ bất ổn anh ạ, em thử tải data của 2 ngày thôi mà Excel đơ và phải mất khoảng 34 giây.
Nếu cần tải dữ liệu 1 tháng thì có thể không gồng nổi, liệu VBA có gánh nổi nhiệm vụ này không. :unknw:

View attachment 304799
2 ngày khoảng bao nhiêu hoá đơn vậy bạn? Còn bên chi tiết nó ra bao nhiêu dòng?
Về tốc độ thì code lấy dữ liệu của tôi chưa làm theo cách của bạn Hesanbi chỉ nên vẫn còn dùng lệnh ngưng mỗi hoá đơn để chờ web xử lý nên nó sẽ lâu.
Bài đã được tự động gộp:

- Em đăng nhập bị lỗi khi có mở thêm file excel khác như thế này



- Tương tự lỗi nhập ngày tháng khi có mở file excel khác



- Khi gặp những lỗi này thì khá bất tiện khi phải đăng nhập lại từ đầu tài khoản và mật khẩu, nếu có thêm phần lưu tài khoản đăng nhập gần nhất thì quá ok ạ
- Mà sao không tải luôn cả hóa đơn không mã của cơ quan thuế và Máy tính tiền cùng 1 lúc luôn cho tiện mà lại phải tách ra cho cực công ạ
Này là quan điểm cá nhân ạ, không có ý công kích hay bắt lỗi gì nhé !
Việc lưu tài khoản đăng nhập cho lần sau thì dễ thôi bạn. Vì tôi sợ mấy bạn muốn bảo mật nên không viết để lưu thôi.
Còn việc tải tất cả hoá đơn để tôi xem lại. Tôi làm theo mẫu của trang hđđt thôi.
 
Upvote 0
Dữ liệu hóa đơn mua vào trong 2 ngày em test thử khoảng 52 hóa đơn anh nha
1729048361163.png

Em cũng mới test thử hóa đơn bán ra trong 2 ngày, số lượng 131 hóa đơn, bị đơ và bị báo lỗi anh ạ.
1729048414426.png


1729048302596.png
 

File đính kèm

  • 1729048323695.png
    1729048323695.png
    4.7 KB · Đọc: 8
  • 1729048356507.png
    1729048356507.png
    6.1 KB · Đọc: 8
Upvote 0
Dữ liệu hóa đơn mua vào trong 2 ngày em test thử khoảng 52 hóa đơn anh nha


Em cũng mới test thử hóa đơn bán ra trong 2 ngày, số lượng 131 hóa đơn, bị đơ và bị báo lỗi anh ạ.



View attachment 304800
Oh.. số lượng hđ ít vậy thì không thể lâu đến mấy chục giây, để tôi xem lại, có thể do lỗi xử lý dữ liệu nên nó bị treo. Bị rớt mạng nó cũng bị treo lâu và tôi chưa bẫy lỗi Time out này.
 
Upvote 0
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.
em bấm TẢI HOÁ ĐƠN thì bị báo như file đính kèm ạ
 

File đính kèm

Upvote 0
Mình mới tải lại File bạn mới Update, nói chung tốc độ tải rất nhanh. Tuy nhiên mình tải thử hóa đơn đầu vào không có mã cơ quan thuế thì lại không lấy được ngày lập hóa đơn và ngày ký!z5935025818241_319d34e68d47f4992e0524e4a1a29f8d.jpg
 
Upvote 0
Mình mới tải lại File bạn mới Update, nói chung tốc độ tải rất nhanh. Tuy nhiên mình tải thử hóa đơn đầu vào không có mã cơ quan thuế thì lại không lấy được ngày lập hóa đơn và ngày ký!View attachment 304806
Tôi cũng mới phát hiện cái lỗi này và đã sửa vào file bài #1 nhé.
Do lấy sai tên cột cho ngày hóa đơn "tdlap" chứ không phải "ncma" :) .
Bài đã được tự động gộp:

Đã sửa lỗi:
- Sai ngày hóa đơn (không hiện ngày).
- Sửa lỗi khi nhập ngày tháng ở các máy có thiết lập định dạng ngày tháng theo kiểu USA (mm/dd/yyyy) hoặc Việt Nam (dd/mm/yyyy). Qui ước của tool là nhập kiểu : dd/mm/yyyy.
- Thêm tùy chọn [Tất cả] cho mục "Kết quả kiểm tra".

Có một vấn đề nữa là đối với một số nhà cung cấp giải pháp, tôi không tìm được chỗ để lấy mã tra cứu, bạn nào biết thì chia sẻ nhé.
- BKAV: https://van.ehoadon.vn/TCHD
- FPT: https://hoadon.ftg.vn/
- https://portaltool-miennam.vnpt-invoice.com.vn/
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cũng mới phát hiện cái lỗi này và đã sửa vào file bài #1 nhé.
Do lấy sai tên cột cho ngày hóa đơn "tdlap" chứ không phải "ncma" :) .
Bài đã được tự động gộp:

Đã sửa lỗi:
- Sai ngày hóa đơn (không hiện ngày).
- Sửa lỗi khi nhập ngày tháng ở các máy có thiết lập định dạng ngày tháng theo kiểu USA (mm/dd/yyyy) hoặc Việt Nam (dd/mm/yyyy). Qui ước của tool là nhập kiểu : dd/mm/yyyy.
- Thêm tùy chọn [Tất cả] cho mục "Kết quả kiểm tra".

Có một vấn đề nữa là đối với một số nhà cung cấp giải pháp, tôi không tìm được chỗ để lấy mã tra cứu, bạn nào biết thì chia sẻ nhé.
- BKAV: https://van.ehoadon.vn/TCHD
- FPT: https://hoadon.ftg.vn/
- https://portaltool-miennam.vnpt-invoice.com.vn/
cái này PM có phí cũng chưa tra được a ơi, nên tạm thời để vậy đi a
 
Upvote 0
Dạ em Vân đang tải mà bị lỗi này anh ạ
1729061848877.png
 
Upvote 0
Upvote 0
@ongke0711
thấy anh vẫn chưa xử vụ captcha, chắc nhìn mấy module kia tùm lum quá ha;
anh thử
Mã:
Me.txtNhapCaptcha = hddtCAPTSolve(cContent)

Em code hàm hddtCAPTSolve và hàm đi kèm:
Mã:
Function hddtCAPTSolve(svgData As String) As String
    Dim http As Object, json As Object, svgDoc As Object
    Dim Dic As Object, Key As Variant, pathElements As Object
    Dim ArrData() As Variant, CAPcode As String, ShortenCode As String
    Dim k As Long, l As Long, result As String, Position As String
    
    Set Dict = CreateObject("Scripting.Dictionary")
    Set Dict = CaptchaDict

    Set svgDoc = CreateObject("MSXML2.DOMDocument")
    If svgDoc.LoadXML(svgData) Then
        Set pathElements = svgDoc.getElementsByTagName("path")
        ReDim ArrData(1 To 2, 1 To 6)
        eCount = 0
        For idx = 0 To pathElements.Length - 1
            If pathElements.item(idx).getAttribute("fill") <> "none" Then
                eCount = eCount + 1
                result = pathElements.item(idx).getAttribute("d")
                Position = Split(result, ".")(0)
                Position = Replace(Position, "M", "")
                ArrData(1, eCount) = CInt(Position)
                ArrData(2, eCount) = Dict(CleanSVGPath(result))
            End If
        Next idx
        ' Sort ArrData
        For i = 1 To UBound(ArrData, 2)
            For j = i + 1 To UBound(ArrData, 2)
                If ArrData(1, i) > ArrData(1, j) Then
                    
                    tempPosition = ArrData(1, i)
                    ArrData(1, i) = ArrData(1, j)
                    ArrData(1, j) = tempPosition
                    
                    tempData = ArrData(2, i)
                    ArrData(2, i) = ArrData(2, j)
                    ArrData(2, j) = tempData
                End If
            Next j
        Next i
        
        CAPTSolve = ""
        For k = 1 To UBound(ArrData, 2)
            CAPTSolve = CAPTSolve & ArrData(2, k)
        Next k
    Else
        Debug.Print "Error XML: " & svgDoc.parseError.reason
    End If
    
    Set http = Nothing
    Set json = Nothing
    Set svgDoc = Nothing
    Set Dic = Nothing
    If Len(CAPTSolve) = 6 Then hddtCAPTSolve = CAPTSolve
End Function

Function CleanSVGPath(svgPath As String) As String
    Dim strPath As String
    Dim i As Integer
    Dim currentChar As String
    For i = 1 To Len(svgPath)
        currentChar = Mid(svgPath, i, 1)
        If Not (IsNumeric(currentChar) Or currentChar = "." Or currentChar = " ") Then
            strPath = strPath & currentChar
        End If
    Next i
    CleanSVGPath = Replace(strPath, "L", "")
End Function

Function CaptchaDict() As Object
    Set Dict = CreateObject("Scripting.Dictionary")
    Dict.Add "0000000000000", "0"
    Dict.Add "1111111111111", "1"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "2"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "3"
    Dict.Add "MQQQQZMQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQZ", "4"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "5"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQZ", "6"
    Dict.Add "MQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZ", "7"
    Dict.Add "MQQQQQQQQZMQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQZMQQQQQQQZ", "8"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQZ", "9"
    
    Dict.Add "MQQQQQZMQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZMQQZ", "A"
    Dict.Add "MQQQQQQQQQZMQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQZMQQQQQQQQZ", "B"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "C"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQZ", "D"
    Dict.Add "MQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "E"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "F"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "G"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "H"
    Dict.Add "IIIIIIIIIIIIIIIIIIII", "I"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZ", "J"
    Dict.Add "MQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "K"
    Dict.Add "LLLLLLLLLLLLLLLLLLLL", "L"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQZ", "M"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZ", "N"
    Dict.Add "OOOOOOOOOOOOOOOOOOOO", "O"
    Dict.Add "MQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "P"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQZ", "Q"
    Dict.Add "MQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "R"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "S"
    Dict.Add "MQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQZ", "T"
    Dict.Add "UUUUUUUUUUUUUUUUUUU", "U"
    Dict.Add "MQQQQQQQQQQZMQQQQQQQQQQQQQQQQZ", "V"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "W"
    Dict.Add "MQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "X"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQZ", "Y"
    Dict.Add "MQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "Z"
    
    Set CaptchaDict = Dict
End Function
 
Upvote 0
@ongke0711
thấy anh vẫn chưa xử vụ captcha, chắc nhìn mấy module kia tùm lum quá ha;
anh thử
Mã:
Me.txtNhapCaptcha = hddtCAPTSolve(cContent)

Em code hàm hddtCAPTSolve và hàm đi kèm:
Mã:
Function hddtCAPTSolve(svgData As String) As String
    Dim http As Object, json As Object, svgDoc As Object
    Dim Dic As Object, Key As Variant, pathElements As Object
    Dim ArrData() As Variant, CAPcode As String, ShortenCode As String
    Dim k As Long, l As Long, result As String, Position As String
   
    Set Dict = CreateObject("Scripting.Dictionary")
    Set Dict = CaptchaDict

    Set svgDoc = CreateObject("MSXML2.DOMDocument")
    If svgDoc.LoadXML(svgData) Then
        Set pathElements = svgDoc.getElementsByTagName("path")
        ReDim ArrData(1 To 2, 1 To 6)
        eCount = 0
        For idx = 0 To pathElements.Length - 1
            If pathElements.item(idx).getAttribute("fill") <> "none" Then
                eCount = eCount + 1
                result = pathElements.item(idx).getAttribute("d")
                Position = Split(result, ".")(0)
                Position = Replace(Position, "M", "")
                ArrData(1, eCount) = CInt(Position)
                ArrData(2, eCount) = Dict(CleanSVGPath(result))
            End If
        Next idx
        ' Sort ArrData
        For i = 1 To UBound(ArrData, 2)
            For j = i + 1 To UBound(ArrData, 2)
                If ArrData(1, i) > ArrData(1, j) Then
                   
                    tempPosition = ArrData(1, i)
                    ArrData(1, i) = ArrData(1, j)
                    ArrData(1, j) = tempPosition
                   
                    tempData = ArrData(2, i)
                    ArrData(2, i) = ArrData(2, j)
                    ArrData(2, j) = tempData
                End If
            Next j
        Next i
       
        CAPTSolve = ""
        For k = 1 To UBound(ArrData, 2)
            CAPTSolve = CAPTSolve & ArrData(2, k)
        Next k
    Else
        Debug.Print "Error XML: " & svgDoc.parseError.reason
    End If
   
    Set http = Nothing
    Set json = Nothing
    Set svgDoc = Nothing
    Set Dic = Nothing
    If Len(CAPTSolve) = 6 Then hddtCAPTSolve = CAPTSolve
End Function

Function CleanSVGPath(svgPath As String) As String
    Dim strPath As String
    Dim i As Integer
    Dim currentChar As String
    For i = 1 To Len(svgPath)
        currentChar = Mid(svgPath, i, 1)
        If Not (IsNumeric(currentChar) Or currentChar = "." Or currentChar = " ") Then
            strPath = strPath & currentChar
        End If
    Next i
    CleanSVGPath = Replace(strPath, "L", "")
End Function

Function CaptchaDict() As Object
    Set Dict = CreateObject("Scripting.Dictionary")
    Dict.Add "0000000000000", "0"
    Dict.Add "1111111111111", "1"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "2"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "3"
    Dict.Add "MQQQQZMQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQZ", "4"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "5"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQZ", "6"
    Dict.Add "MQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZ", "7"
    Dict.Add "MQQQQQQQQZMQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQZMQQQQQQQZ", "8"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQZ", "9"
   
    Dict.Add "MQQQQQZMQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZMQQZ", "A"
    Dict.Add "MQQQQQQQQQZMQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZMQQQQQQQQZMQQQQQQQQZ", "B"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "C"
    Dict.Add "MQQQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQZ", "D"
    Dict.Add "MQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "E"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "F"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "G"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQZ", "H"
    Dict.Add "IIIIIIIIIIIIIIIIIIII", "I"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQZ", "J"
    Dict.Add "MQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "K"
    Dict.Add "LLLLLLLLLLLLLLLLLLLL", "L"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQZ", "M"
    Dict.Add "MQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQZ", "N"
    Dict.Add "OOOOOOOOOOOOOOOOOOOO", "O"
    Dict.Add "MQQQQQQZMQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "P"
    Dict.Add "MQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQZ", "Q"
    Dict.Add "MQQQQQQZMQQQQQQQQQQQQZMQQQQQQQQQQQQQQQZMQQQQQQQQZ", "R"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "S"
    Dict.Add "MQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQZ", "T"
    Dict.Add "UUUUUUUUUUUUUUUUUUU", "U"
    Dict.Add "MQQQQQQQQQQZMQQQQQQQQQQQQQQQQZ", "V"
    Dict.Add "MQQQQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQQQQQQQZ", "W"
    Dict.Add "MQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQZ", "X"
    Dict.Add "MQQQQQQQQQZMQQQQQQQQQQQQQZ", "Y"
    Dict.Add "MQQQQQQQQQQQQQQQQZMQQQQQQQQQQQQQQQQQQQQQZ", "Z"
   
    Set CaptchaDict = Dict
End Function
Chưa em, anh lo xử lý cho nó ra đúng dữ liệu trước rồi mới tinh chỉnh code theo code của em vsf các hướng dẫn của bác Tuân, Hesanbi. Vừa ngâm cứu vừa làm thôi nên còn lỗi tùm lum :D
 
Upvote 0
Khi hàm httpGet(,,, res) = False thì tham số res nhận kết quả trả về từ server là nội dung lỗi có cấu trúc:
{
"timestamp": "16/10/2024 16:28:41",
"message": "Kho?ng th?i gian tìm ki?m không du?c l?n hon 1 tháng.",
"details": "",
"path": "uri=/invoices/purchase"
}

Ta cần bắt nội dung này rồi đưa lên thông báo cho người dùng biết. Bắt thêm các lỗi khác một cách tỉ mỉ thì mới sửa code dễ dàng. Mà bên viết ứng dụng server cho website này thấy ngộ ngộ, nội dung chuỗi JSON trả về thông báo lỗi không có mã lỗi, như các ứng dụng server thông thường khác phải có key "error" thì lập trình bắt mới dễ dàng.
Bài đã được tự động gộp:

Chưa em, anh lo xử lý cho nó ra đúng dữ liệu trước rồi mới tinh chỉnh code theo code của em vsf các hướng dẫn của bác Tuân, Hesanbi. Vừa ngâm cứu vừa làm thôi nên còn lỗi tùm lum :D

Bản mới hình như anh quên cắt bỏ phần chia thời gian thành từng tháng nên báo lỗi vượt quá một tháng khi requets.
 
Upvote 0
Em download bản mới nhất vẫn bị lỗi như hình.

1729075136781.png
 
Upvote 0
Bản mới hình như anh quên cắt bỏ phần chia thời gian thành từng tháng nên báo lỗi vượt quá một tháng khi requets.
Tôi sửa cái hàm laythoigian() nhưng không kỹ nên sai 1 dòng code dẫn đến lỗi trên. :D

Đang gặp 1 vấn đề về hiển thị ngày hóa đơn:
* Nếu định dạng của hệ thống là: dd/mm/yyyy:
- Nếu ngày <12 thì nó lại hiển thị mm/dd (kiểu Date), ngày >12 thì hiển thị đúng dd/mm (nhưng là kiểu String).
- Mặc dù hiển thị sai định dạng nhưng hóa đơn thì lấy đúng khoản thời gian.
* Nếu định dạng hệ thống là: mm/dd/yyyy
=> Hiển thị đúng định dạng yêu cầu.

*** Đã sửa lỗi ngày tháng ở trên :D . Sau khi gán giá trị Ngày thì dùng NumberFormat luôn, thêm 1 dòng code nữa :). Giờ ngày hệ thống kiểu English (USA) hay Vietnamese đều hiển thị đúng.
 
Lần chỉnh sửa cuối:
Upvote 0
Đang gặp 1 vấn đề về hiển thị ngày hóa đơn:
Em thì hay dùng hạ sách này, thôi cứ chắc ăn anh à.
Mã:
    yearPart = Mid(timeString, 1, 4)
    monthPart = Mid(timeString, 5, 2)
    dayPart = Mid(timeString, 7, 2)
    hourPart = Mid(timeString, 9, 2)
    minutePart = Mid(timeString, 11, 2)
    secondPart = Mid(timeString, 13, 2)
    
    dateTimeValue = DateSerial(CInt(yearPart), CInt(monthPart), CInt(dayPart)) + _
    TimeSerial(CInt(hourPart), CInt(minutePart), CInt(secondPart))
 
Upvote 0
Trong trường hợp code mình tắt Cập nhật màn hình và tắt luôn tính toán Calucation thì tốc độ Excel xử lý có nhanh hơn không anh nhỉ ? Vì em tay ngang nên không dám thử code của anh đã làm :D :D :D

- Và em test tải tất cả thì vẫn chưa có hóa đơn từ MTT anh ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi sửa cái hàm laythoigian() nhưng không kỹ nên sai 1 dòng code dẫn đến lỗi trên. :D

Đang gặp 1 vấn đề về hiển thị ngày hóa đơn:
* Nếu định dạng của hệ thống là: dd/mm/yyyy:
- Nếu ngày <12 thì nó lại hiển thị mm/dd (kiểu Date), ngày >12 thì hiển thị đúng dd/mm (nhưng là kiểu String).
- Mặc dù hiển thị sai định dạng nhưng hóa đơn thì lấy đúng khoản thời gian.
* Nếu định dạng hệ thống là: mm/dd/yyyy
=> Hiển thị đúng định dạng yêu cầu.

*** Đã sửa lỗi ngày tháng ở trên :D . Sau khi gán giá trị Ngày thì dùng NumberFormat luôn, thêm 1 dòng code nữa :). Giờ ngày hệ thống kiểu English (USA) hay Vietnamese đều hiển thị đúng.
1729131583731.png
Em tải bản mới nhất mà vẫn bị ạ!
 
Upvote 0

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

Back
Top Bottom