Hệ thống pháp luật

BỘ THÔNG TIN VÀ
TRUYỀN THÔNG
-------

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
---------------

Số: 25/BTTTT-VP
V/v trả lời kiến nghị của cử tri tỉnh Tây Ninh gửi tới trước kỳ họp thứ 4, Quốc hội khóa XV

Hà Nội, ngày 04 tháng 01 năm 2023

 

Kính gửi: Đoàn đại biểu Quốc hội tỉnh Tây Ninh

Bộ Thông tin và Truyền thông (TT&TT) nhận được kiến nghị của cử tri tỉnh Tây Ninh do Ban Dân nguyện chuyển đến theo Công văn số 1418/BDN ngày 07/11/2022, nội dung kiến nghị như sau:

Câu 1: Cử tri phản ánh một số khó khăn, vướng mắc trong việc triển khai các chỉ tiêu trong Quyết định số 1127/QĐ-BTTTT, đề nghị Bộ Thông tin và Truyền thông xem xét, điều chỉnh các chỉ tiêu:

Đối với Chỉ tiêu 8.2: Tỷ lệ thuê bao sử dụng điện thoại thông minh trong bộ tiêu chí xã Nông thôn mới (NTM) nâng cao. Địa phương gặp khó khăn trong việc thu thập thông tin, xác định tỷ lệ dân số theo độ tuổi lao động có thuê bao sử dụng điện thoại thông minh (nếu thực hiện theo phương pháp điều tra xã hội học sẽ mất thời gian và rất tốn kém). Ngoài ra, cơ quan chuyên môn cũng không có công cụ xác định, theo dõi số liệu này của từng địa phương để kịp thời hỗ trợ, hướng dẫn.

Đối với Chỉ tiêu 8.4: Bộ TT&TT quy định: “100% hộ gia đình, cơ quan, tổ chức, khu di tích được thông báo, gắn biển địa chỉ số đến từng điểm địa chỉ”. Hiện nay, Sở TT&TT đang phối hợp với Bưu điện tỉnh để rà soát, nhận bàn giao dữ liệu địa chỉ số (Bưu điện tỉnh đã thu thập) và thống nhất phương án thực hiện thông báo địa chỉ số trên địa bàn tỉnh. Tuy nhiên, việc này phải có lộ trình thực hiện cụ thể nên không thể hoàn thành ngay trong năm 2022. Vì vậy, sẽ gặp vướng mắc trong việc chấm đạt tiêu chí đối với các xã phấn đấu đạt chuẩn nông thôn mới nâng cao trong năm 2022. Nội dung thực hiện “gắn biển địa chỉ số đến từng điểm địa chỉ” cũng gặp một số vướng mắc như: nguồn kinh phí thực hiện khá lớn (1 biển địa chỉ tốn chi phí khoảng 50.000 đồng), sự đồng thuận của người dân (vừa gắn biển địa chỉ số vừa sử dụng địa chỉ vật lý hiện tại), sự cần thiết gắn biển địa chỉ số để tránh lãng phí...

Sau khi nghiên cứu, Bộ TT&TT có ý kiến trả lời như sau:

a) Đối với Chỉ tiêu 8.2:

Trong tiêu chí xã Nông thôn mới nâng cao được hướng dẫn tại Quyết định số 1127/QĐ-BTTTT ngày 22/6/2022 của Bộ TT&TT có nội dung “Xã có tỷ lệ dân số theo độ tuổi lao động có thuê bao sử dụng điện thoại thông minh”. Chỉ tiêu này không thể hiện rõ đối tượng đánh giá là người dân hay thuê bao sử dụng điện thoại thông minh. Do đó, khi thực hiện tiêu chí này, có các cách đánh giá như sau:

(i) Đối tượng đánh giá là người sử dụng điện thoại thông minh thì cần thực hiện điều tra thống kê trên địa bàn.

(ii) Đối tượng đánh giá thuê bao: Hiện tại theo quy định chế độ báo cáo thống kê hiện hànhb) Đối với Chỉ tiêu 8.4:

Trả lời:

Thực hiện Chương trình mục tiêu quốc gia xây dựng Nông thôn mới giai đoạn 2021-2025, theo nhiệm vụ được Thủ tướng Chính phủ giao tại Quyết định số 263/QĐ-TTg ngày 22/02/2022, Bộ TT&TT đã hướng dẫn thực hiện nội dung này tại Điều 8 của Thông tư số 05/2022/TT-BTTTT ngày 30/6/2022 quy định, hướng dẫn thực hiện Nội dung 09 thuộc thành phần số 02 và Nội dung 02 thuộc thành phần số 08 của Chương trình mục tiêu quốc gia xây dựng Nông thôn mới giai đoạn 2021-2025.

Về kinh phí, tại Quyết định số 263/QĐ-TTg ngày 22/02/2022 của Thủ tướng Chính phủ phê duyệt Chương trình mục tiêu quốc gia xây dựng Nông thôn mới giai đoạn 2021-2025 đã quy định cơ chế hỗ trợ từ ngân sách nhà nước để thực hiện nhiệm vụ này; Thông tư số 53/2022/TT-BTC ngày 12/8/2022 của Bộ Tài chính quy định quản lý và sử dụng kinh phí sự nghiệp từ nguồn ngân sách trung ương thực hiện Chương trình mục tiêu quốc gia xây dựng Nông thôn mới giai đoạn 2021-2025, tại khoản 2 Điều 33 đã hướng dẫn quản lý tài chính đối với nhiệm vụ này.

Trong quá trình thực hiện nội dung “100% hộ gia đình, cơ quan, tổ chức, khu di tích được thông báo, gắn biển địa chỉ số đến từng điểm địa chỉ” của Tiêu chí xã Nông thôn mới nâng cao, Bộ TT&TT đã nhận được phản ảnh của một số địa phương về những khó khăn, vướng mắc. Bộ TT&TT đã có công văn số 6021/BTTTT-KHTC ngày 14/12/2022 về việc hướng dẫn triển khai nền tảng địa chỉ số quốc gia gắn với bản đồ số gửi các địa phương. Bộ TT&TT thống nhất lùi thời hạn áp dụng chỉ tiêu “100% hộ gia đình, quan, tổ chức, khu di tích được thông báo, gắn biển địa chỉ số đến từng điểm địa chỉ” quy định tại điểm đ, tiêu chí 4, phụ lục 2 của Quyết định số 1127/QĐ-BTTTT ngày 22/6/2022 của Bộ TT&TT đến ngày 01/7/2023. Các cơ quan liên quan khi xem xét công nhận xã đạt tiêu chí Nông thôn mới nâng cao trước ngày 01/7/2023 thì chưa xét chỉ tiêu này.

Đề nghị Ủy ban nhân dân các tỉnh, thành phố chỉ đạo các sở, ban ngành liên quan và chính quyền cấp huyện, xã đẩy mạnh triển khai nội dung về địa chỉ số quy định tại Thông tư số 05/2022/TT-BTTTT ngày 30/6/2022 hướng dẫn thực hiện một số nội dung về TT&TT thuộc Chương trình mục tiêu quốc gia xây dựng nông thôn mới giai đoạn 2021-2025 và Quyết định số 1127/QĐ-BTTTT ngày 22/6/2022 công bố các chỉ tiêu thuộc tiêu chí TT&TT của Bộ tiêu chí quốc gia về xã Nông thôn mới và xã Nông thôn mới nâng cao giai đoạn 2021-2025.

Câu 2: Kiến nghị có giải pháp hiệu quả hơn để phát hiện, xử lý các trang thông tin, các ứng dụng mạng xã hội, các thuê bao nhắn tin quảng cáo, rao vặt liên quan đến tín dụng đen, cho vay ngân hàng, cho vay tuyến không đúng theo quy định của pháp luật. Đồng thời, có cơ chế để quản lý các dịch vụ cho vay tiền qua các ứng dụng mạng đối với các tổ chức, cá nhân ngoài hệ thống ngân hàng; công bố các ứng dụng cho vay hợp pháp để người dân biết.

Sau khi nghiên cứu, Bộ TT&TT có ý kiến trả lời như sau:

Hiện nay, Bộ TT&TT đã triển khai một số giải pháp, cụ thể:

- Bổ sung xử phạt hành vi thực hiện cuộc gọi rác; tăng mức xử phạt lên đến 80 triệu đồng đối với hành vi thực hiện cuộc gọi rác, phát tán tin nhắn rác; quy định bổ sung hình thức xử phạt thu hồi số thuê bao phát tán rác. Bộ TT&TT đã trình Chính phủ ban hành:

Nghị định số 15/2020/NĐ-CP ngày 03/02/2020 quy định xử phạt vi phạm hành chính trong lĩnh vực bưu chính, viễn thông, tần số vô tuyến điện, công nghệ thông tin và giao dịch điện tử, trong đó quy định các biện pháp rất chặt chẽ để đảm bảo ngăn chặn tin nhắn rác, tin nhắn lừa đảo; nâng mức xử phạt tiền từ 80 triệu đến 100 triệu đồng đối với hành vi gửi tin nhắn rác, gửi tin nhắn quảng cáo, gọi điện thoại quảng cáo đến các số điện thoại nằm trong danh sách không quảng cáo; phạt tiền đến 200 triệu đồng đối với hành vi không ngăn chặn, thu hồi số thuê bao được dùng để phát tán tin nhắn rác. Ngoài ra còn bị buộc hoàn trả hoặc buộc nộp lại số lợi bất hợp pháp có được do thực hiện hành vi vi phạm; bị buộc thu hồi đầu số, kho số viễn thông.

Nghị định số 14/2022/NĐ-CP ngày 27/01/2022 của Chính phủ sửa đổi, bổ sung một số điều của Nghị định số 15/2020/NĐ-CP, trong đó đã sửa đổi, bổ sung hình thức xử phạt bổ sung là đình chỉ phát triển thuê bao mới áp dụng đối với các hành vi vi phạm về quản lý thông tin thuê bao. Tùy theo mức độ vi phạm sẽ bị đình chỉ phát triển thuê bao mới từ 01 tháng đến 12 tháng. Đây là hình thức xử phạt rất nghiêm khắc đối với các doanh nghiệp viễn thông. Quy định bổ sung hình thức xử phạt thu hồi số thuê bao phát tán rác.

- Tổ chức thanh tra, phát hiện và chuyển cơ quan Công an đề nghị xử lý hình sự 04 đối tượng lắp đặt trạm BTS giả để phát tán tin nhắn rác.

- Xử lý 01 đối tượng mua và sử dụng SIM đã đăng ký trước thông tin thuê bao 25 triệu, thu hồi 5.385 thuê bao mà đối tượng đã mua, sử dụng.

- Kiểm tra 07 doanh nghiệp viễn thông di động, xử phạt 2,925 tỷ đồng đối với 07 doanh nghiệp và 39 Điểm cung cấp dịch vụ viễn thông (tăng 2,92 lần so với kết quả xử lý 05 năm trước). Trong đó triển khai kiểm tra về quản lý thông tin thuê bao để hạn chế, ngăn chặn SIM đã đăng ký trước thông tin thuê bao được bán ra thị trường. Xử phạt 39 Đại lý/điểm CCDVVT: 1,995 tỷ đồng; Xử phạt 21 Đơn vị gồm: 04 Công ty; 01 Tổng công ty cấp 2, 04 Công ty khu vực, 08 Chi nhánh, 04 Trung tâm kinh doanh tại các tỉnh thành phố với tổng số tiền xử phạt là: 1,425 tỷ đồng, buộc nộp lại ngân sách 15,2 triệu đồng. Tổng số tiền xử phạt dự kiến: hơn 3,4 tỷ đồng gấp hơn 3 lần so với tổng số tiền phạt cả giai đoạn 2016 - 2021).

- Xác minh, làm rõ sai phạm và đề nghị Sở TT&TT TP. Hồ Chí Minh xử phạt Bà Ngô Thị Bích Mai (nhân viên Công ty Luật TNHH Kiên Cường) 7,5 triệu do thực hiện hành vi quấy rối điện thoại.

* Giải pháp thực hiện trong thời gian tới:

Để phòng, chống vi phạm pháp luật và tội phạm trong bối cảnh toàn cầu hóa và hội nhập quốc tế hiện nay, góp phần bảo đảm sự ổn định và phát triển đất nước, Bộ TT&TT sẽ tiến hành thực hiện một số giải pháp sau đây:

- Giám sát chặt chẽ các doanh nghiệp trong việc thực hiện, khắc phục các tồn tại, sai phạm về quản lý thông tin thuê bao, chấp hành các kết luận kiểm tra, thanh tra; Tập trung đánh giá, phát hiện dấu hiệu vi phạm, thanh tra đột xuất và xử lý nghiêm minh đối với các doanh nghiệp vẫn tiếp tục xảy ra sai phạm; Sử dụng phương tiện, thiết bị, hạ tầng kỹ thuật viễn thông để rà quét, phát hiện, bắt giữ các đối tượng sử dụng trạm BTS giả phát tán tin nhắn rác, tin nhắn lừa đảo; Tăng cường thông tin, tuyên truyền đến người dân về các phương thức, thủ đoạn gọi điện lừa đảo; biện pháp chặn cuộc gọi rác, cuộc gọi lừa đảo để người dân biết, chủ động thực hiện.

- Tăng cường thanh tra, xử lý nghiêm các trường hợp quảng cáo bất hợp pháp, không sử dụng tên định danh, các cuộc gọi đòi nợ, quấy rối, lừa đảo.

- Tăng cường thanh tra, xử lý doanh nghiệp nếu không áp dụng các biện pháp ngăn chặn cuộc gọi rác, tin nhắn rác. Triển khai thanh tra đột xuất việc chấp hành pháp luật về an toàn thông tin mạng và cung cấp dịch vụ nội dung thông tin trên mạng viễn thông di động đối với các doanh nghiệp viễn thông di động.

- Phối hợp với các cơ quan, đơn vị liên quan xây dựng bộ tiêu chí xác định cuộc gọi rác để chỉ đạo doanh nghiệp viễn thông ngăn chặn.

- Chỉ đạo doanh nghiệp nhắc nhở, chấn chỉnh, cắt dịch vụ thuê bao quấy rối.

- Sử dụng phương tiện, thiết bị, hạ tầng kỹ thuật viễn thông để rà quét, phát hiện, bắt giữ các đối tượng sử dụng trạm BTS giả phát tán tin nhắn rác, tin nhắn lừa đảo.

- Tăng cường thông tin, tuyên truyền đến người dân về các phương thức, thủ đoạn gọi điện lừa đảo; biện pháp chặn cuộc gọi rác, cuộc gọi lừa đảo để người dân biết, chủ động thực hiện.

- Tăng cường công tác thực thi pháp luật, xử lý kịp thời, kiên quyết đối với các hành vi vi phạm, đặc biệt, đối với các quảng cáo, rao vặt liên quan đến tín dụng đen và các hành vi vu khống, bôi nhọ tổ chức cá nhân trên không gian mạng.

- Tăng cường công tác nắm tình hình, chủ động đánh giá thực trạng và dự báo xu thế phát triển của các hành vi vi phạm pháp luật lĩnh vực tài chính, hoạt động “tín dụng đen” và các hành vi vu khống, bôi nhọ tổ chức cá nhân trên không gian mạng.

- Hoạt động tín dụng, cho vay là lĩnh vực thuộc phạm vi quản lý nhà nước của Ngân hàng Nhà nước Việt Nam theo quy định tại Nghị định số 16/2017/NĐ-CP; các tổ chức có giấy phép do Ngân hàng Nhà nước Việt Nam cấp mới được phép hoạt động tín dụng. Bộ TT&TT sẽ tiếp tục tăng cường phối hợp với Ngân hàng Nhà nước Việt Nam và các bộ, ngành liên quan tuyên truyền phòng, chống tội phạm nói chung và cho vay tài chính “tín dụng đen” nói riêng trên không gian mạng.

Câu 3: Đề nghị Bộ Thông tin và Truyền thông chủ phối hợp với các bộ, ngành liên quan sớm ban hành các định mức kinh tế - kỹ thuật liên quan đến triển khai, duy trì, bảo trì bảo dưỡng các hệ thống phần cứng, phần mềm, nền tảng xác định cơ quan thẩm định giá trị các nền tảng số để thực hiện đầu tư, mua sắm, thuê dịch vụ công nghệ thông tin trong các cơ quan nhà nước. Có hướng dẫn chung việc xây dựng cơ sở dữ liệu chuyên ngành; Việc chia sẻ dữ liệu, liên thông giữa các bộ, ngành và địa phương; Rà soát và khóa lại tính năng giao dịch các bộ thủ tục hành chính không phát sinh hồ sơ nhiều năm.

Sau khi nghiên cứu, Bộ TT&TT có ý kiến trả lời như sau:

- Về đề nghị Bộ TT&TT chủ trì phối hợp với các bộ, ngành liên quan sớm ban hành các định mức kinh tế - kỹ thuật liên quan đến triển khai, duy trì, bảo trì bảo dưỡng các hệ thống phần cứng, phần mềm, nền tảng số; Xác định cơ quan thẩm định giá trị các nền tảng số để thực hiện đầu tư, mua sắm, thuê dịch vụ công nghệ thông tin trong các cơ quan nhà nước.

Bộ TT&TT ghi nhận ý kiến của cử tri tỉnh Tây Ninh, Bộ sẽ chỉ đạo các đơn vị chức năng (Cục Chuyển đổi số quốc gia; Vụ Kế hoạch - Tài chính) phối hợp với các bộ, ngành liên quan nghiên cứu đưa vào chương trình xây dựng định mức kinh tế - kỹ thuật trong thời gian tới (giai đoạn năm 2023-2025).

- Về đề nghị có hướng dẫn chung việc xây dựng cơ sở dữ liệu chuyên ngành; Việc chia sẻ dữ liệu, liên thông giữa các bộ, ngành và địa phương. Ngày 03/3/2022, Bộ TT&TT đã có văn bản số 677/BTTTT-THH về hướng dẫn kết nối và chia sẻ dữ liệu thông qua Nền tảng tích hợp, chia sẻ dữ liệu quốc gia gửi các bộ, ngành và địa phương. Bộ TT&TT đã phối hợp với các bộ, ngành, địa phương kết nối 8 cơ sở dữ liệu quốc gia, 12 Hệ thống thông tin Nền tảng tích hợp, chia sẻ dữ liệu quốc gia (NDXP) để cung cấp dịch vụ chia sẻ dữ liệu cho các bộ, ngành, địa phương. Trong quá trình triển khai kết nối, chia sẻ dữ liệu với NDXP, nếu có khó khăn, vướng mắc đề nghị liên hệ với Cục Chuyển đổi số quốc gia - Bộ TT&TT để được hướng dẫn, hỗ trợ triển khai được hiệu quả.

- Về đề nghị rà soát và khóa lại tính năng giao dịch các bộ thủ tục hành chính không phát sinh hồ sơ nhiều năm.

Khoản 3, Điều 11, Nghị định số 42/2022/NĐ-CP ngày 24/6/2022 của Chính phủ quy định: Văn phòng Chính phủ hướng dẫn rà soát, đánh giá thủ tục hành chính đáp ứng yêu cầu xây dựng dịch vụ công trực tuyến theo các mức độ quy định tại Nghị định này. Do đó, nội dung này sẽ do Văn phòng Chính phủ hướng dẫn thực hiện.

Câu 4: Đề nghị có văn bản hướng dẫn các địa phương xây dựng chế độ đãi ngộ, hỗ trợ cho đội ngũ chuyên trách về công nghệ thông tin và an toàn thông tin mạng cho các tỉnh, thành (kể cả chế độ hỗ trợ cho cán bộ kiêm nhiệm) để các địa phương có cơ sở xây dựng và trình cấp có thẩm quyền ban hành chính sách nhằm thu hút được lao động giỏi về công nghệ thông tin, phục vụ việc chuyển đổi số của tỉnh và cả nước trong thời gian tới.

Sau khi nghiên cứu, Bộ TT&TT có ý kiến trả lời như sau:

* Về chính sách hỗ trợ đặc thù cho cán bộ làm công tác công nghệ thông tin:

Tại Điều 21, khoản 3, Nghị định số 163/2016/NĐ-CP ngày 21/12/2016 của Chính phủ quy định chi tiết thi hành một số điều của Luật Ngân sách nhà nước có quy định: “Thẩm quyền của Hội đồng nhân dân cấp tỉnh quyết định định mức phân bổ và chế độ, tiêu chuẩn, định mức chi tiêu ngân sách:...Quyết định các chế độ chi ngân sách đối với một số nhiệm vụ chi có tính chất đặc thù ở địa phương ngoài các chế độ, tiêu chuẩn, định mức chi tiêu do Chính phủ, Thủ tướng Chính phủ, Bộ trưởng Bộ Tài chính ban hành để thực hiện nhiệm vụ phát triển kinh tế - xã hội, bảo đảm trật tự, an toàn xã hội trên địa bàn, phù hợp với khả năng cân đối của ngân sách địa phương, ngân sách trung ương không hỗ trợ. Riêng những chế độ chi có tính chất tiền lương, tiền công, phụ cấp, trước khi quyết định phải có ý kiến của Bộ Tài chính, Bộ Nội vụ, Bộ Lao động - Thương binh và Xã hội và các bộ quản lý ngành, lĩnh vực trực tiếp”.

- Điểm 4, mục III, Nghị quyết số 27-NQ/TW ngày 21/5/2018 của Ban Chấp hành Trung ương tại Hội nghị Trung ương 7 (khóa XII) về cải cách chính sách tiền lương đối với cán bộ, công chức, viên chức, lực lượng vũ trang và người lao động trong doanh nghiệp có nêu: “Bãi bỏ các khoản chi ngoài lương của cán bộ, công chức, viên chức có nguồn gốc từ ngân sách nhà nước...”. Thực hiện Nghị quyết số 27-NQ/TW ngày 21/5/2018, Thủ tướng Chính phủ đã có ý kiến chỉ đạo tại văn bản số 8476/VPCP-KTTH ngày 06/9/2019 của Văn phòng Chính phủ: “Từ nay đến khi ban hành các văn bản quy định chế độ tiền lương mới để thực hiện Nghị quyết số 27-NQ/TW, không xem xét ban hành mới hoặc sửa đổi, bổ sung các chế độ, chính sách tiền lương hiện hành”.

Vì vậy, để có chính sách ưu đãi hỗ trợ đặc thù cho cán bộ làm công tác công nghệ thông tin, đề nghị tỉnh Tây Ninh xem xét xây dựng Nghị quyết của Hội đồng nhân dân cấp tỉnh đảm bảo phù hợp tinh thần của Nghị quyết số 27-NQ/TW ngày 21/5/2018 và chỉ đạo của Thủ tướng Chính phủ nêu trên; đồng thời căn cứ quy định của Luật Ban hành văn bản quy phạm pháp luật, Nghị định số 163/2016/NĐ-CP ngày 21/12/2016 và các văn bản quy phạm pháp luật có liên quan, tổng hợp ý kiến các bộ, cơ quan có liên quan, trình Hội đồng nhân dân cấp tỉnh quyết định từ nguồn ngân sách địa phương, đảm bảo đúng quy định.

Câu 5: Đề nghị Bộ Thông tin và Truyền thông có kế hoạch chia sẻ dữ liệu cho địa phương như dữ liệu thu chi ngân sách, giải ngân đầu tư công, ...trên hệ thống Tabmis của Bộ Tài chính.

Sau khi nghiên cứu, Bộ TT&TT có ý kiến trả lời như sau:

Bộ Tài chính là cơ quan chủ quản hệ thống TABMIS. Theo Điều 24 của Nghị định số 47/2020/NĐ-CP ngày 09/4/2020, Bộ Tài chính có trách nhiệm thiết lập và công bố các dịch vụ chia sẻ dữ liệu, các tài liệu kỹ thuật cần thiết phục vụ mục đích truy cập dữ liệu thuộc phạm vi dữ liệu do mình quản lý. Hiện tại, Bộ Tài chính chưa thiết lập và công bố các dịch vụ chia sẻ dữ liệu từ hệ thống TABMIS, chưa có kế hoạch chia sẻ dữ liệu thông qua Nền tảng tích hợp, chia sẻ dữ liệu quốc gia (NDXP) nhằm đáp ứng nhu cầu của các bộ, ngành, địa phương.

Để có căn cứ triển khai, đề nghị các bộ, ngành, địa phương có văn bản gửi về Bộ Tài chính, Bộ TT&TT để đề nghị phối hợp, kết nối, chia sẻ dữ liệu, trong đó nêu rõ mục đích, nhu cầu khai thác dữ liệu.

Trên cơ sở Bộ Tài chính thống nhất mở dữ liệu hệ thống TABMIS, Bộ TT&TT sẵn sàng phối hợp với Bộ Tài chính và các cơ quan liên quan để các bộ, ngành, địa phương có thể kết nối, khai thác dữ liệu từ hệ thống TABMIS thông qua Nền tảng tích hợp, chia sẻ dữ liệu quốc gia.

Trên đây là nội dung trả lời của Bộ TT&TT đối với kiến nghị của cử tri tỉnh Tây Ninh, trân trọng gửi tới Đoàn đại biểu Quốc hội tỉnh Tây Ninh để trả lời cử tri./.

 


Nơi nhận:
- Như trên;
- Ban Dân nguyện - Ủy ban TVQH;
- Ủy ban TWMTTQVN;
- Vụ QHĐP (VPCP);
- Vụ Dân nguyện (VPQH);
- Tổng Thư ký Quốc hội;
- Bộ trưởng Nguyễn Mạnh Hùng;
- Thứ trưởng Phạm Đức Long;
- Trung tâm Thông tin (để đăng lên Cổng TTĐT của Bộ);
- Lưu: VT, VP, TKTH.

BỘ TRƯỞNG




Nguyễn Mạnh Hùng

 



lồng nhau (bên trong) hay không const memberID = 0; const vbID = '4a6bce331864c473527a2a7ccbf8f4f3'; // State management cho phân tích let isAnalyzing = false; // Có đang phân tích không let currentAnalyzingAddress = null; // Address đang được phân tích let currentAnalyzingElement = null; // Element đang được phân tích let currentAnalyzingBadge = null; // Badge của element đang phân tích let isPanelOpen = false; // Panel phân tích có đang mở không console.log('Tiện ích loaded - memberID:', memberID, 'vbID:', vbID); function isInViewportAndTabNoiDung(element) { const rect = element.getBoundingClientRect(); const buffer = 1500; // Buffer to preload content below the viewport (approx. 50+ lines) const viewHeight = window.innerHeight || document.documentElement.clientHeight; const isInViewport = rect.top < viewHeight + buffer && rect.bottom >= 0; const isInTabNoiDung = $(element).closest('#tab_noi_dung_vb').length > 0; return isInViewport && isInTabNoiDung; } function getAddress(element) { const validTags = ['trichyeu', 'cancu', 'phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem']; const $parent = $(element).closest(validTags.join(',')); if (!$parent.length) { return null; } let addr = $parent.attr('address'); if (!addr && $parent.prop('tagName').toLowerCase() === 'trichyeu') { addr = 'trichyeu'; $parent.attr('address', addr); } return addr || null; } function processTnplClasses($element) { const tnplKeysInLine = new Set(); // key = slug hoặc text (thường là slug) $element.find('tnpl').each(function () { const $tnpl = $(this); const tnplSlug = ($tnpl.attr('slug') || '').trim().toLowerCase(); const tnplKey = tnplSlug || $tnpl.text().trim().toLowerCase(); // Đã xử lý trong cùng dòng => bỏ if (tnplKeysInLine.has(tnplKey)) { return; } tnplKeysInLine.add(tnplKey); let tnplExists = false; // Chỉ duyệt các tnpl đã được tô màu (class on) $('tnpl.on').each(function () { const $existingTnpl = $(this); const existingSlug = ($existingTnpl.attr('slug') || '').trim().toLowerCase(); const existingKey = existingSlug || $existingTnpl.text().trim().toLowerCase(); if ( existingKey === tnplKey && isInViewportAndTabNoiDung($existingTnpl[0]) ) { tnplExists = true; return false; // break each } }); if (!tnplExists) { $tnpl.addClass('on'); } }); } function processQueue() { while (pendingRequests < maxConcurrentRequests && requestQueue.length > 0) { const task = requestQueue.shift(); pendingRequests++; task() .always(() => { pendingRequests--; processQueue(); }); } } function processVisibleParagraphs() { try { $('#tab_noi_dung_vb p:not([is-posted="1"])').each(function () { let $element = $(this); if (isInViewportAndTabNoiDung(this)) { $element.attr('is-posted', '1'); $element.addClass('loading-content'); let p_innerHTML = $element.html(); let address = null; if (cac_cau_hinh.loai_noi_dung.includes('docs')) { address = getAddress($element); } const isSubP = $element.parents('p').length > 0; if (isSubP && !allow_sub_p) { $element.removeClass('loading-content'); return; // Không gửi nếu không cho phép } const postData = { p_content: p_innerHTML, cac_cau_hinh, address }; if (isSubP && allow_sub_p) { postData.sub_p = 1; } requestQueue.push(() => $.ajax({ url: '//tnpl' + (Math.floor(Math.random() * 10) + 1) + '.hethongphapluat.com/tien-ich/tim.tien.ich.php', type: 'POST', data: postData, success: function(response) { $element.html(response); processTnplClasses($element); // Đợi CTTD và các tiện ích load xong rồi mới attach badge if (memberID === 4 && typeof attachPhanTichBadge === 'function') { setTimeout(function() { // $element chính là thẻ p, kiểm tra và attach badge trực tiếp const $parent = $element.closest('phan, chuong, muc, tieumuc, dieu, khoan, diem'); if ($parent.length > 0 && $parent.find('.badge-phan-tich[data-for="' + $parent.attr('address') + '"]').length === 0) { const address = $parent.attr('address'); $element.attr('data-address', address); // Lấy tên loại thẻ cho tooltip const parentType = getParentTypeName($parent.prop('tagName').toLowerCase()); // Append badge VÀO PARENT (dieu, khoan,...) thay vì vào

để tránh xung đột CTTD const $badge = $('Phân tích'); $parent.append($badge); // Thêm class để CSS set position: relative CHỈ cho element có badge $parent.addClass('has-phan-tich-badge'); } // Xử lý các p con (nếu có sub-p) attachPhanTichBadge($element); }, 300); // Đợi 300ms để CTTD render xong } }, complete: function() { $element.removeClass('loading-content'); } }) ); processQueue(); } }); } catch(e) { console.error('Lỗi processVisibleParagraphs:', e); } } $(window).on('scroll resize', function () { processVisibleParagraphs(); }); console.log('Bắt đầu processVisibleParagraphs lần đầu...'); processVisibleParagraphs(); console.log('processVisibleParagraphs lần đầu hoàn thành'); // Chức năng phân tích điều luật (chỉ cho member_id = 4) if (memberID === 4) { // Modal cảnh báo function showWarningModal(message) { // Tạo modal nếu chưa có if ($('#warningModal').length === 0) { const modalHTML = `

`; $('body').append(modalHTML); } $('#warningModalBody').html('

' + message + '

'); $('#warningModal').modal('show'); } // Hàm lấy tên tiếng Việt của thẻ function getParentTypeName(tagName) { const typeNames = { 'phan': 'Phần', 'chuong': 'Chương', 'muc': 'Mục', 'tieumuc': 'Tiểu mục', 'dieu': 'Điều', 'khoan': 'Khoản', 'diem': 'Điểm' }; return typeNames[tagName] || 'Nội dung'; } function attachPhanTichBadge($container) { const validTags = 'phan, chuong, muc, tieumuc, dieu, khoan, diem'; $container.find('p').each(function() { const $p = $(this); const $parent = $p.closest(validTags); if ($parent.length > 0) { const address = $parent.attr('address'); // Kiểm tra đã có badge cho parent này chưa if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) { // Lưu address vào data attribute $p.attr('data-address', address); // Lấy tên loại thẻ cho tooltip const parentType = getParentTypeName($parent.prop('tagName').toLowerCase()); // Append badge vào PARENT, không vào

const $badge = $('Phân tích'); $parent.append($badge); // Thêm class để CSS set position: relative CHỈ cho element có badge $parent.addClass('has-phan-tich-badge'); } } }); } // Helper: Escape HTML entities function escapeHtml(text) { const map = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return String(text).replace(/[&<>"']/g, function(m) { return map[m]; }); } // Helper: Convert Markdown to HTML (đơn giản) function markdownToHtml(markdown) { if (!markdown) return ''; let html = markdown; // Headers html = html.replace(/^### (.*$)/gim, '

$1
'); html = html.replace(/^## (.*$)/gim, '

$1

'); html = html.replace(/^# (.*$)/gim, '

$1

'); // Bold html = html.replace(/\*\*(.*?)\*\*/g, '$1'); // Italic html = html.replace(/\*(.*?)\*/g, '$1'); // Blockquote html = html.replace(/^> (.*$)/gim, '
$1
'); html = html.replace(/^> (.*$)/gim, '
$1
'); // Lists (unordered) html = html.replace(/^\- (.*$)/gim, '
  • $1
  • '); html = html.replace(/(
  • .*<\/li>)/s, '
      $1
    '); // Lists (ordered) html = html.replace(/^\d+\. (.*$)/gim, '
  • $1
  • '); // Line breaks và paragraphs html = html.split('\n\n').map(para => { para = para.trim(); if (para.startsWith('')) { return para; } if (para) { return '

    ' + para.replace(/\n/g, '
    ') + '

    '; } return ''; }).join('\n'); // Clean up multiple line breaks html = html.replace(/\n{3,}/g, '\n\n'); return html; } // Panel fixed position function closePhanTichPanel() { const $panel = $('#phanTichPanel'); if ($panel.length) { $panel.removeClass('show'); setTimeout(() => { $panel.remove(); }, 300); } // Reset highlight và badge khi đóng panel if (currentAnalyzingElement) { currentAnalyzingElement.removeClass('highlight-border-persistent'); } if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); currentAnalyzingBadge.data('hovering', false); currentAnalyzingBadge.css({display: 'none'}); // Ẩn badge khi đóng } // Reset tất cả các element khác (trong trường hợp có nhiều) $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent'); $('#tab_noi_dung_vb .badge-phan-tich-container.analyzing').each(function() { $(this).text('Phân tích').removeClass('analyzing').data('analyzing', false); }); // Check: có CTTD pointer đang mở không? const $visiblePointers = $('.pointer:visible'); const hadCTTDOpen = $visiblePointers.length > 0; if (hadCTTDOpen) { // CÓ CTTD đang mở → giữ rightdocinfo ẩn console.log('ℹ️ CTTD pointer is visible, keeping rightdocinfo hidden'); } else { // KHÔNG có CTTD → SHOW lại rightdocinfo const $rightdocinfo = $('#rightdocinfo'); if ($rightdocinfo.length > 0) { $rightdocinfo.show(); console.log('✅ Showing rightdocinfo back (no CTTD pointer)'); } } // Reset state isAnalyzing = false; currentAnalyzingAddress = null; currentAnalyzingElement = null; currentAnalyzingBadge = null; isPanelOpen = false; // Đánh dấu panel đã đóng console.log('✅ Panel closed, state reset, isPanelOpen = false'); } // Panel đã song song với rightdocinfo → không cần MutationObserver nữa console.log('✅ Panel running in standalone mode (parallel to rightdocinfo)'); // Resize event để update panel dimensions khi browser resize let resizeTimer; $(window).on('resize', function() { clearTimeout(resizeTimer); resizeTimer = setTimeout(function() { if (isPanelOpen && $('#phanTichPanel').length > 0) { updatePanelDimensions(); console.log('✅ Panel dimensions updated on window resize'); } }, 250); // Debounce 250ms }); // Function để detect và áp dụng dimensions từ rightdocinfo function updatePanelDimensions() { const $panel = $('#phanTichPanel'); const $rightdocinfo = $('#rightdocinfo'); const $docRightCol = $('#doc-right-col'); if ($panel.length === 0) return; // Ưu tiên: doc-right-col > rightdocinfo let $reference = $docRightCol.length > 0 ? $docRightCol : $rightdocinfo; // Nếu reference bị ẩn (display:none), tạm show để get dimensions let wasHidden = false; if ($reference.length > 0 && !$reference.is(':visible')) { wasHidden = true; $reference.css('visibility', 'hidden').show(); } if ($reference.length > 0) { const refWidth = $reference.outerWidth(); const refOffset = $reference.offset(); if (refWidth && refOffset) { // Tính vị trí right từ edge màn hình const windowWidth = $(window).width(); const rightPosition = windowWidth - (refOffset.left + refWidth); $panel.css({ 'width': refWidth + 'px', 'right': rightPosition + 'px' }); console.log('✅ Panel dimensions updated:', { width: refWidth + 'px', right: rightPosition + 'px', reference: $reference.attr('id') }); } else { console.warn('⚠️ Could not get dimensions from reference element'); } // Restore trạng thái hidden nếu cần if (wasHidden) { $reference.hide().css('visibility', ''); } } else { console.warn('⚠️ No reference element found for panel dimensions'); } } function openPhanTichPanel(address, vbID) { console.log('openPhanTichPanel called with address:', address); console.log('Current state - isAnalyzing:', isAnalyzing, 'currentAnalyzingAddress:', currentAnalyzingAddress); // Kiểm tra nếu đang phân tích element khác if (isAnalyzing && currentAnalyzingAddress && currentAnalyzingAddress !== address) { const currentName = getElementDisplayName(currentAnalyzingAddress); console.warn('Already analyzing:', currentAnalyzingAddress, 'Cannot analyze:', address); showWarningModal('Vui lòng chờ phân tích ' + currentName + ' hoàn tất...'); return; } // Nếu đang phân tích cùng element → không làm gì if (isAnalyzing && currentAnalyzingAddress === address) { console.log('Already analyzing this element, ignoring duplicate request'); return; } // Panel sẽ fixed position append vào body const $rightdocinfo = $('#rightdocinfo'); // KHÔNG ẨN CTTD pointer - cho phép CTTD và panel cùng tồn tại console.log('Panel opening, CTTD pointer can stay visible'); // ẨN rightdocinfo để tiết kiệm không gian if ($rightdocinfo.length > 0) { $rightdocinfo.hide(); console.log('Hidden rightdocinfo to save space'); } // XÓA highlight persistent của TẤT CẢ elements cũ trước $('#tab_noi_dung_vb .highlight-border-persistent').removeClass('highlight-border-persistent'); console.log('Removed all previous highlight-border-persistent'); // Tìm element đang được phân tích và badge của nó const $element = $('[address="' + address + '"]'); const $badge = $element.find('.badge-phan-tich-container[data-for="' + address + '"]').first(); // Set state isAnalyzing = true; currentAnalyzingAddress = address; currentAnalyzingElement = $element; currentAnalyzingBadge = $badge; console.log('State set:', { isAnalyzing: isAnalyzing, currentAnalyzingAddress: currentAnalyzingAddress, elementFound: $element.length > 0, badgeFound: $badge.length > 0 }); // Thêm highlight persistent cho element MỚI này $element.addClass('highlight-border-persistent'); // Thay đổi badge thành "Đang phân tích..." và giữ hiển thị if ($badge.length > 0) { $badge.text('Đang phân tích...').addClass('analyzing'); // Giữ badge hiển thị và ở đúng vị trí $badge.data('analyzing', true); $badge.data('hovering', true); // Prevent auto-hide console.log('Badge set to analyzing state'); // Đảm bảo badge hiển thị ở đúng vị trí (vì dùng position: fixed) showPhanTichBadgeForParent($element); } // Tạo panel nếu chưa có - fixed position append vào body if ($('#phanTichPanel').length === 0) { const panelHTML = `
    Phân tích điều luật
    Đang phân tích...

    Đang phân tích...

    `; // Append vào body (fixed position không cần container cụ thể) $('body').append(panelHTML); // Detect width từ rightdocinfo và áp dụng cho panel updatePanelDimensions(); // Trigger show và set flag setTimeout(() => { $('#phanTichPanel').addClass('show'); isPanelOpen = true; console.log('✅ Panel opened (fixed position), isPanelOpen = true'); }, 10); } else { $('#phanTichPanelBody').html(`
    Đang phân tích...

    Đang phân tích...

    `); // Update dimensions khi re-open updatePanelDimensions(); $('#phanTichPanel').addClass('show'); isPanelOpen = true; console.log('✅ Panel re-opened (fixed position), isPanelOpen = true'); } // Bind nút đóng và ESC $(document).off('click.closePhanTich').on('click.closePhanTich', '.close-phan-tich', function() { closePhanTichPanel(); }); $(document).off('keyup.closePhanTich').on('keyup.closePhanTich', function(e) { if (e.key === 'Escape') closePhanTichPanel(); }); // Bind nút refresh - phân tích lại $(document).off('click.refreshPhanTich').on('click.refreshPhanTich', '.btn-refresh-phan-tich', function(e) { e.preventDefault(); e.stopPropagation(); const $btn = $(this); const $icon = $btn.find('i'); // Disable button và thêm animation $btn.prop('disabled', true); $icon.addClass('fa-spin'); console.log('🔄 Refresh: Phân tích lại address:', address); // Show loading trong panel $('#phanTichPanelBody').html(`
    Đang phân tích lại...

    Đang xóa cache và phân tích lại...

    `); // Gọi API xóa cache trước deletePhanTichCache(address, vbID, function(deleteSuccess) { if (deleteSuccess) { console.log('✅ Cache deleted, now re-analyzing...'); // Sau khi xóa cache, gọi lại API phân tích callPhanTichAPI(address, vbID, function() { // Enable lại button $btn.prop('disabled', false); $icon.removeClass('fa-spin'); }); } else { console.error('❌ Failed to delete cache'); $('#phanTichPanelBody').html(` `); $btn.prop('disabled', false); $icon.removeClass('fa-spin'); } }); }); // Gọi API phân tích (dùng function helper) callPhanTichAPI(address, vbID); } // Helper: Gọi API phân tích (tách riêng để dùng lại) function callPhanTichAPI(address, vbID, callback) { const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php', type: 'POST', contentType: 'application/json', timeout: 300000, // 5 phút data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { console.log('Analysis complete for:', address, response); // Reset badge về trạng thái bình thường (nhưng vẫn hiển thị) if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); console.log('Badge reset to normal state'); } // Reset state analyzing để có thể phân tích element khác isAnalyzing = false; console.log('State reset: isAnalyzing = false, can analyze other elements now'); if (response.ok) { // Render kết quả phân tích let html = ''; html += '
    '; html += '
    ' + escapeHtml(response.ten_van_ban) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Điều khoản: ' + escapeHtml(response.address) + ''; if (response.from_cache) { html += ' Cache'; } html += '
    '; html += '
    ' + markdownToHtml(response.phan_tich) + '
    '; if (response.usage) { html += '
    '; html += 'Thống kê: '; html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', '; html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0); html += '
    '; } $('#phanTichPanelBody').html(html); } else { $('#phanTichPanelBody').html(` `); } if (callback) callback(); }, error: function(xhr, status, error) { console.error('Analysis error:', error); // Reset badge về trạng thái bình thường if (currentAnalyzingBadge) { currentAnalyzingBadge.text('Phân tích').removeClass('analyzing'); currentAnalyzingBadge.data('analyzing', false); } // Reset state analyzing isAnalyzing = false; let errorMsg = error; if (xhr.responseJSON && xhr.responseJSON.error) { errorMsg = xhr.responseJSON.error; } $('#phanTichPanelBody').html(` `); if (callback) callback(); } }); } // Helper: Xóa cache phân tích function deletePhanTichCache(address, vbID, callback) { const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/delete.phan.tich.cache.php', type: 'POST', contentType: 'application/json', timeout: 10000, data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { console.log('Delete cache response:', response); if (callback) callback(response.ok || false); }, error: function(xhr, status, error) { console.error('Delete cache error:', error); if (callback) callback(false); } }); } // Helper: Lấy tên hiển thị của element từ address function getElementDisplayName(address) { if (!address) return 'nội dung'; const $element = $('[address="' + address + '"]'); if ($element.length === 0) return address; // Parse address: vd "dieu_3_khoan_29" -> "Khoản 29 Điều 3" // Address format: lớn đến nhỏ (phan > chuong > muc > dieu > khoan > diem) const parts = address.split('_'); const displayParts = []; for (let i = 0; i < parts.length; i += 2) { if (i + 1 < parts.length) { const type = getParentTypeName(parts[i]); const num = parts[i + 1]; displayParts.push(type + ' ' + num); } } // Reverse để hiển thị từ nhỏ đến lớn: "Khoản 29 Điều 3" (thay vì "Điều 3 Khoản 29") return displayParts.reverse().join(' '); } function openPhanTichModal(address, vbID) { // Tạo modal nếu chưa có if ($('#modalPhanTich').length === 0) { const modalHTML = ` `; $('body').append(modalHTML); } // Reset và hiển thị modal với loading $('#modalPhanTichBody').html(`
    Đang phân tích...

    Đang phân tích...

    `); $('#modalPhanTich').modal('show'); // AJAX request const randomServer = Math.floor(Math.random() * 10) + 1; $.ajax({ url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/phan.tich.dieu.luat.php', type: 'POST', contentType: 'application/json', data: JSON.stringify({ address: address, vb_id: vbID }), success: function(response) { if (response.ok) { // Render kết quả phân tích let html = ''; // Header thông tin văn bản html += '
    '; html += '
    ' + escapeHtml(response.ten_van_ban) + '
    '; if (response.so_hieu) { html += 'Số hiệu: ' + escapeHtml(response.so_hieu) + '
    '; } html += 'Điều khoản: ' + escapeHtml(response.address) + ''; html += '
    '; // Nội dung phân tích (Markdown -> HTML) html += '
    '; html += markdownToHtml(response.phan_tich); html += '
    '; // Thông tin usage (nếu có) if (response.usage) { html += '
    '; html += 'Thống kê: '; html += 'Input tokens: ' + (response.usage.promptTokenCount || 0) + ', '; html += 'Output tokens: ' + (response.usage.candidatesTokenCount || 0); html += '
    '; } $('#modalPhanTichBody').html(html); } else { $('#modalPhanTichBody').html(` `); } }, error: function(xhr, status, error) { let errorMsg = error; if (xhr.responseJSON && xhr.responseJSON.error) { errorMsg = xhr.responseJSON.error; } $('#modalPhanTichBody').html(` `); } }); } // Helpers: show/hide badge cho parent element (dieu, khoan,...) với position: fixed function showPhanTichBadgeForParent($parent) { // Lấy badge CỦA CHÍNH parent này (match data-for với address của parent) const parentAddress = $parent.attr('address'); const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first(); if ($badge.length === 0) { console.warn('No badge found for parent:', parentAddress); return; } // Ẩn TẤT CẢ các badge khác để tránh overlap $('.badge-phan-tich-container').not($badge).each(function() { const $otherBadge = $(this); // Chỉ ẩn badge KHÔNG đang analyzing if (!$otherBadge.data('analyzing')) { $otherBadge.css({display: 'none'}); } }); // Show badge tạm để tính width $badge.css({display: 'inline-block', opacity: 0, visibility: 'hidden'}); const badgeWidth = $badge.outerWidth(); // Tính toán vị trí fixed dựa trên offset của parent const offset = $parent.offset(); const scrollTop = $(window).scrollTop(); const scrollLeft = $(window).scrollLeft(); // Position badge top-right của parent và show $badge.css({ display: 'inline-block', visibility: 'visible', opacity: 1, top: (offset.top - scrollTop) + 'px', left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px' // -5px padding }); console.log('Showing badge for:', parentAddress, 'at position:', $badge.css('top'), $badge.css('left')); $parent.addClass('highlight-border'); } function hidePhanTichBadgeForParent($parent) { const $badge = $parent.find('.badge-phan-tich-container').first(); if ($badge.length === 0) return; $badge.css({display: 'none', opacity: 0}); $parent.removeClass('highlight-border'); } // Biến lưu element đang hover let currentHoveredElement = null; let hoverDebounceTimer = null; // Dùng mousemove để track chính xác element nào đang được hover $(document).on('mousemove', '#tab_noi_dung_vb', function(e) { // Tìm element gần nhất (phan, chuong, muc, dieu, khoan, diem) tại vị trí chuột const $target = $(e.target).closest('phan, chuong, muc, tieumuc, dieu, khoan, diem'); if ($target.length === 0) { // Không hover vào element nào return; } const address = $target.attr('address'); // Nếu đang hover vào cùng element → skip if (currentHoveredElement && currentHoveredElement[0] === $target[0]) { return; } // Clear debounce timer cũ if (hoverDebounceTimer) { clearTimeout(hoverDebounceTimer); } // Debounce để tránh trigger quá nhiều hoverDebounceTimer = setTimeout(function() { // Element thay đổi console.log('Hover changed to:', address); // Set flag hovering cho element mới $target.data('hovering', true); // Cancel timeout nếu có const timeoutId = $target.data('hideTimeout'); if (timeoutId) { clearTimeout(timeoutId); } // Ẩn badge của TẤT CẢ elements khác $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem') .not($target) .each(function() { const $el = $(this); // Chỉ xóa highlight-border, KHÔNG xóa highlight-border-persistent $el.removeClass('highlight-border'); // Ẩn badge nếu KHÔNG đang analyzing const $badge = $el.find('.badge-phan-tich-container'); if ($badge.length && !$badge.data('analyzing')) { $badge.css({display: 'none'}); } }); // Attach badge nếu chưa có if (address && $target.find('.badge-phan-tich-container[data-for="' + address + '"]').length === 0) { const parentType = getParentTypeName($target.prop('tagName').toLowerCase()); const $badge = $('Phân tích'); console.log('Creating badge for address:', address, 'parentType:', parentType); $target.append($badge); $target.addClass('has-phan-tich-badge'); } // Show badge cho element này if ($target.find('.badge-phan-tich-container').length > 0) { showPhanTichBadgeForParent($target); } // Update current hovered element currentHoveredElement = $target; }, 50); // Debounce 50ms }); // Event delegation cho hover ra khỏi #tab_noi_dung_vb $(document).on('mouseleave', '#tab_noi_dung_vb', function(e) { // Clear current hovered element currentHoveredElement = null; // Ẩn tất cả badge không đang analyzing sau một khoảng thời gian setTimeout(function() { if (currentHoveredElement === null) { // Chỉ ẩn nếu thực sự không hover vào element nào $('#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem') .each(function() { const $el = $(this); const $badge = $el.find('.badge-phan-tich-container'); if ($badge.length && !$badge.data('analyzing')) { $badge.css({display: 'none'}); } }); console.log('Mouse left tab_noi_dung_vb, hiding all badges'); } }, 300); }); // Event delegation cho hover ra khỏi parent (giữ lại cho badge behavior) $(document).on('mouseleave', '#tab_noi_dung_vb phan, #tab_noi_dung_vb chuong, #tab_noi_dung_vb muc, #tab_noi_dung_vb tieumuc, #tab_noi_dung_vb dieu, #tab_noi_dung_vb khoan, #tab_noi_dung_vb diem', function(e) { const $parent = $(this); const parentAddress = $parent.attr('address'); const $badge = $parent.find('.badge-phan-tich-container[data-for="' + parentAddress + '"]').first(); // Set flag parent not hovering $parent.data('hovering', false); // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị if ($badge.length > 0 && $badge.data('analyzing')) { console.log('Badge is analyzing, keep visible'); return; } // Delay để có thời gian di chuột vào badge const timeoutId = setTimeout(() => { // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing if ($badge.length > 0 && !$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing')) { hidePhanTichBadgeForParent($parent); } }, 300); // Tăng lên 300ms $parent.data('hideTimeout', timeoutId); }); // Hover vào badge → giữ hiển thị $(document).on('mouseenter', '.badge-phan-tich-container', function(e) { e.stopPropagation(); const $badge = $(this); const $parent = $badge.parent(); $badge.data('hovering', true); // Cancel timeout của parent const timeoutId = $parent.data('hideTimeout'); if (timeoutId) { clearTimeout(timeoutId); } }); // Hover ra khỏi badge → ẩn nếu không hover parent $(document).on('mouseleave', '.badge-phan-tich-container', function(e) { const $badge = $(this); $badge.data('hovering', false); const $parent = $badge.parent(); // Nếu badge đang analyzing thì KHÔNG ẩn, GIỮ hiển thị if ($badge.data('analyzing') || $badge.hasClass('analyzing')) { console.log('Badge is analyzing on mouseleave, keep visible'); return; } setTimeout(() => { // Chỉ ẩn nếu cả parent và badge đều không hover và không analyzing if (!$parent.data('hovering') && !$badge.data('hovering') && !$badge.data('analyzing') && !$badge.hasClass('analyzing')) { hidePhanTichBadgeForParent($parent); } }, 300); }); // Event delegation cho hover vào badge → hiện tooltip $(document).on('mouseenter', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() { const $badge = $(this); const parentType = $badge.attr('data-parent-type') || 'Nội dung'; if ($badge.find('.badge-tooltip').length === 0) { const $tooltip = $('Phân tích chi tiết nội dung ' + parentType + ' này'); $badge.append($tooltip); setTimeout(() => $tooltip.addClass('show'), 10); } }); // Event delegation cho hover ra khỏi badge → ẩn tooltip $(document).on('mouseleave', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function() { const $tooltip = $(this).find('.badge-tooltip'); if ($tooltip.length > 0) { $tooltip.removeClass('show'); setTimeout(() => $tooltip.remove(), 300); } }); // Event delegation cho click badge → mở panel $(document).on('click', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function(e) { e.preventDefault(); e.stopPropagation(); const $badge = $(this); console.log('Badge clicked! Element:', $badge[0]); console.log('Badge parent:', $badge.parent().prop('tagName'), $badge.parent().attr('address')); console.log('Badge data-for:', $badge.attr('data-for')); console.log('Badge data-parent-type:', $badge.attr('data-parent-type')); // Nếu badge đang analyzing thì không cho click if ($badge.hasClass('analyzing') || $badge.data('analyzing')) { console.log('Badge is analyzing, click ignored'); return; } // Lấy address từ data-for attribute const address = $badge.attr('data-for'); console.log('Will analyze address:', address, 'vbID:', vbID); if (address && vbID) { openPhanTichPanel(address, vbID); } else { console.error('Missing address or vbID', {address, vbID}); showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!'); } }); // Ẩn badge khi click vào CTTD $(document).on('click', 'cttd.chuthichtudong span, dctk span, dctd span', function(e) { console.log('CTTD clicked'); // Ẩn TẤT CẢ badge KHÔNG đang analyzing $('.badge-phan-tich-container').each(function() { const $badge = $(this); if (!$badge.data('analyzing') && !$badge.hasClass('analyzing')) { $badge.css({display: 'none'}); console.log('Hiding badge:', $badge.attr('data-for')); } }); }); // Update badge position khi scroll hoặc resize (vì dùng position: fixed) function updateBadgePositions() { $('.badge-phan-tich-container:visible').each(function() { const $badge = $(this); const $parent = $badge.parent(); // Cập nhật position nếu parent đang hover HOẶC badge đang analyzing if ($parent.length && ($parent.is(':hover') || $badge.data('analyzing'))) { // Re-calculate position const offset = $parent.offset(); const scrollTop = $(window).scrollTop(); const scrollLeft = $(window).scrollLeft(); const badgeWidth = $badge.outerWidth(); $badge.css({ top: (offset.top - scrollTop) + 'px', left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 5) + 'px' }); } }); } $(window).on('scroll', updateBadgePositions); $(window).on('resize', updateBadgePositions); } });