ỦY BAN NHÂN DÂN TỈNH BẮC KẠN -------
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc ---------------
Số: 1454/QĐ-UBND
Bắc Kạn, ngày 11 tháng 8 năm 2023
QUYẾT ĐỊNH
BAN HÀNH KẾ HOẠCH TRIỂN KHAI THỰC HIỆN QUYẾT ĐỊNH SỐ 05/QĐ-TTG NGÀY 04 THÁNG 01 NĂM 2023 CỦA THỦ TƯỚNG CHÍNH PHỦ VỀ VIỆC PHÊ DUYỆT CHIẾN LƯỢC PHÁT TRIỂN NGÂN HÀNG CHÍNH SÁCH XÃ HỘI ĐẾN NĂM 2030
ỦY BAN NHÂN DÂN TỈNH BẮC KẠN
Căn cứ Luật Tổ chức chính quyền địa phương ngày 19 tháng 6 năm 2015; Luật sửa đổi, bổ sung một số điều của Luật Tổ chức Chính phủ và Luật Tổ chức chính quyền địa phương ngày 22 tháng 11 năm 2019;
Căn cứ Nghị định số 78/2002/NĐ-CP ngày 04 tháng 10 năm 2002 của Chính phủ về tín dụng đối với người nghèo và các đối tượng chính sách khác;
Căn cứ Quyết định số 05/QĐ-TTg ngày 04 tháng 01 năm 2023 của Thủ tướng Chính phủ về việc phê duyệt Chiến lược phát triển Ngân hàng Chính sách xã hội đến năm 2030;
Theo đề nghị của Chi nhánh Ngân hàng Chính sách xã hội tỉnh Bắc Kạn tại Tờ trình số 749/TTr-NHCS ngày 08 tháng 8 năm 2023.
QUYẾT ĐỊNH:
Điều 1. Ban hành kèm theo Quyết định này Kế hoạch triển khai thực hiện Quyết định số 05/QĐ-TTg ngày 04 tháng 01 năm 2023 của Thủ tướng Chính phủ về việc phê duyệt Chiến lược phát triển Ngân hàng Chính sách xã hội đến năm 2030.
Điều 2. Quyết định này có hiệu lực kể từ ngày ký ban hành.
Điều 3. Chánh Văn phòng Ủy ban nhân dân tỉnh, Thủ trưởng các sở, ban, ngành và các đơn vị có liên quan, Trưởng Ban đại diện Hội đồng quản trị Ngân hàng Chính sách xã hội tỉnh, Giám đốc Ngân hàng Nhà nước Chi nhánh tỉnh Bắc Kạn, Giám đốc Chi nhánh Ngân hàng Chính sách xã hội tỉnh Bắc Kạn, Chủ tịch Ủy ban nhân dân các huyện, thành phố chịu trách nhiệm thi hành Quyết định này./.
Nơi nhận: - Như Điều 3; - NH CSXH Việt Nam; - TT Tỉnh ủy, TT HĐND tỉnh; - Ủy ban MTTQVN tỉnh; - Chủ tịch, các PCT UBND tỉnh; - Các Sở, ban, ngành, đoàn thể tỉnh; - LĐVP (ông Nguyên); - Lưu: VT, VXNV(H).
TM. ỦY BAN NHÂN DÂN KT. CHỦ TỊCH PHÓ CHỦ TỊCH Phạm Duy Hưng
KẾ HOẠCH
TRIỂN KHAI THỰC HIỆN QUYẾT ĐỊNH SỐ 05/QĐ-TTG NGÀY 04 THÁNG 01 NĂM 2023 CỦA THỦ TƯỚNG CHÍNH PHỦ VỀ VIỆC PHÊ DUYỆT CHIẾN LƯỢC PHÁT TRIỂN NGÂN HÀNG CHÍNH SÁCH XÃ HỘI ĐẾN NĂM 2030 (Kèm theo Quyết định số 1454/QĐ-UBND ngày 11/8/2023 của UBND tỉnh Bắc Kạn)
Nhằm triển khai thực hiện đồng bộ, có hiệu quả Quyết định số 05/QĐ-TTg ngày 04 tháng 01 năm 2023 của Thủ tướng Chính phủ về việc phê duyệt Chiến lược phát triển Ngân hàng Chính sách xã hội (NHCSXH) đến năm 2030, Ủy ban nhân dân (UBND) tỉnh Bắc Kạn ban hành Kế hoạch triển khai thực hiện, cụ thể như sau:
I. MỤC ĐÍCH, YÊU CẦU
1. Mục đích
a) Cụ thể hóa các nhiệm vụ, giải pháp nhằm tổ chức triển khai thực hiện đồng bộ, hiệu quả Quyết định số 05/QĐ-TTg ngày 04/01/2023 của Thủ tướng Chính phủ về việc phê duyệt Chiến lược phát triển NHCSXH đến năm 2030 (sau đây gọi tắt là Chiến lược).
b) Nâng cao vai trò, trách nhiệm của UBND các cấp, các sở, ban, ngành, cơ quan, đơn vị, cá nhân có liên quan trong công tác lãnh đạo, chỉ đạo, quản lý, phối hợp triển khai thực hiện tín dụng chính sách xã hội đảm bảo tính đồng bộ, khả thi và hiệu quả.
c) Tăng cường sự chỉ đạo của các cấp chính quyền trong xây dựng, triển khai thực hiện cơ chế chính sách và bố trí nguồn lực cho tín dụng chính sách xã hội, tạo điều kiện để NHCSXH tỉnh triển khai thực hiện có hiệu quả các chương trình tín dụng chính sách trên địa bàn.
2. Yêu cầu
a) Các sở, ban, ngành, UBND các cấp tổ chức nghiên cứu, triển khai, quán triệt đầy đủ, sâu sắc quan điểm, mục tiêu, nhiệm vụ và giải pháp mà Chiến lược và Kế hoạch này đã đề ra để thống nhất thực hiện; giám sát quá trình thực hiện; đánh giá kết quả thực hiện các mục tiêu cụ thể trong từng giai đoạn, mức độ và khả năng đạt được của mục tiêu Chiến lược và Kế hoạch này.
b) Xác định tín dụng chính sách xã hội là giải pháp quan trọng thực hiện các chủ trương, chính sách, mục tiêu, nhiệm vụ của Đảng, Nhà nước về tăng trưởng kinh tế đi đôi với thực hiện công bằng xã hội và thực hiện các chương trình mục tiêu Quốc gia; coi đây là một trong những nhiệm vụ trọng tâm gắn với triển khai nhiệm vụ, kế hoạch phát triển kinh tế - xã hội, góp phần thực hiện thắng lợi Nghị quyết Đại hội XIII của Đảng, Nghị quyết Đại hội đại biểu Đảng bộ tỉnh lần thứ XII, nhiệm kỳ 2020 - 2025 đã đề ra.
c) Tiếp tục duy trì và phát huy hiệu quả mô hình tổ chức và phương thức quản lý tín dụng chính sách đặc thù, phù hợp với thực tiễn, đáp ứng yêu cầu nhiệm vụ trong thời gian tới. Phát huy vai trò và sự tham gia tích cực của cả hệ thống chính trị trong công tác tín dụng chính sách xã hội, giúp đỡ, khuyến khích các đối tượng chính sách sản xuất kinh doanh, tạo việc làm, tăng thu nhập, ổn định cuộc sống, vươn lên thoát nghèo, từng bước làm giàu chính đáng.
d) Nâng cao năng lực và hiệu quả hoạt động của NHCSXH để phát triển theo hướng ổn định, bền vững, đủ năng lực để thực hiện tốt tín dụng chính sách xã hội tại địa phương.
II. MỤC TIÊU
1. Mục tiêu tổng quát
a) Tập trung nguồn lực cho NHCSXH để thực hiện các chương trình tín dụng chính sách xã hội phù hợp với các chương trình mục tiêu quốc gia và các nội dung của chiến lược phát triển kinh tế - xã hội của địa phương.
b) Hoạt động tín dụng chính sách xã hội phát triển ổn định, bền vững, bảo đảm thực hiện tốt tín dụng chính sách xã hội, tạo điều kiện hỗ trợ hộ nghèo, hộ cận nghèo và các đối tượng chính sách khác vươn lên thoát nghèo bền vững, góp phần thực hiện có hiệu quả công tác giảm nghèo, xây dựng nông thôn mới, phát triển kinh tế - xã hội vùng đồng bào dân tộc thiểu số và miền núi và đảm bảo an sinh xã hội trên địa bàn.
2. Mục tiêu cụ thể
a) Thực hiện có hiệu quả mô hình tổ chức và phương thức quản lý tín dụng chính sách đặc thù của NHCSXH.
b) Thực hiện tốt các chương trình tín dụng chính sách xã hội được Tổng Giám đốc NHCSXH giao và các chương trình tín dụng do địa phương, các tổ chức, đơn vị giao vốn ủy thác; 100% người nghèo và các đối tượng chính sách khác có nhu cầu, đủ điều kiện đều được tiếp cận các sản phẩm, dịch vụ tài chính NHCSXH cung cấp.
c) Tăng trưởng dư nợ tín dụng chính sách xã hội bình quân hằng năm từ 8% đến 10% (tương ứng trên 210 tỷ đồng/năm),d) Tập trung huy động các nguồn lực để thực hiện các chương trình tín dụng chính sách xã hội trên địa bàn. Hằng năm, ngân sách địa phương ủy thác nguồn vốn qua chi nhánh NHCSXH tỉnh để cho vay đối với người nghèo và các đối tượng chính sách khác chiếm khoảng 15%-20% (tương ứng từ 30 tỷ đồng/năm đến 40 tỷ đồng/năm) đ) Tỷ lệ nợ quá hạn dưới 0,50%/tổng dư nợ.
e) Tăng cường sự lãnh đạo của Đảng đối với tín dụng chính sách xã hội; phát huy vai trò giám sát, phản biện xã hội của Ủy ban Mặt trận Tổ quốc và các tổ chức chính trị - xã hội.
g) Xây dựng đội ngũ cán bộ Chi nhánh NHCSXH tỉnh chất lượng cao, có đạo đức nghề nghiệp, có đầy đủ kỹ năng đáp ứng tốt yêu cầu nhiệm vụ; nâng cao chất lượng, hiệu quả công tác kiểm tra, giám sát đảm bảo an toàn và hiệu quả hoạt động tín dụng chính sách xã hội; ứng dụng mạnh mẽ công nghệ thông tin trong điều hành, tác nghiệp; triển khai kịp thời các sản phẩm, dịch vụ của NHCSXH nhằm phục vụ tốt hơn các đối tượng chính sách, góp phần thực hiện Chương trình Chuyển đổi số quốc gia của Chính phủ và Chiến lược công nghệ thông tin ngành ngân hàng Việt Nam đến năm 2025 định hướng đến năm 2030.
III. NHIỆM VỤ, GIẢI PHÁP
1. Tăng cường sự lãnh đạo, chỉ đạo của các cấp ủy đảng, chính quyền, các sở, ban, ngành đối với tín dụng chính sách xã hội
a) Tiếp tục tổ chức nghiên cứu, phổ biến, quán triệt sâu rộng nội dung Chỉ thị số 40-CT/TW ngày 22/11/2014, Kết luận số 06-KL/TW ngày 10/6/2021 của Ban Bí thư Trung ương Đảng; Quyết định số 1630/QĐ-TTg ngày 28/9/2021 của Thủ tướng Chính phủ; Kế hoạch số 49-KH/TU ngày 12/8/2021, Chỉ thị số 14-CT/TU ngày 16/10/2017, Thông báo Kết luận số 84-KL/TU ngày 18/10/2022 của Ban Thường vụ Tỉnh ủy Bắc Kạn và Kế hoạch số 730/KH-UBND ngày 30/11/2021 của UBND tỉnh Bắc Kạn tới 100% các tổ chức, cơ sở đảng trên địa bàn tỉnh nhằm nâng cao nhận thức của cán bộ, đảng viên và Nhân dân về vị trí, vai trò và tính nhân văn sâu sắc của tín dụng chính sách xã hội.
b) Chủ động đề xuất, tham mưu cấp ủy, chính quyền địa phương các cấp, phối hợp chặt chẽ với các tổ chức chính trị - xã hội nhận ủy thác trong việc tổ chức triển khai thực hiện Chỉ thị số 40-CT/TW ngày 22/11/ 2014, Kết luận số 06-KL/TW ngày 10/6/2021 của Ban Bí thư Trung ương Đảng; Quyết định số 1630/QĐ-TTg ngày 28/9/2021 của Thủ tướng Chính phủ; Kế hoạch số 49-KH/TU ngày 12/8/2021, Chỉ thị số 14-CT/TU ngày 16/10/2017, Thông báo Kết luận số 84-KL/TU ngày 18/10/2022 của Ban Thường vụ Tỉnh ủy Bắc Kạn và Kế hoạch số 730/KH-UBND ngày 30/11/2021 của UBND tỉnh Bắc Kạn và các văn bản chỉ đạo của Trung ương, của tỉnh đối với tín dụng chính sách xã hội.
c) Phát huy vai trò, trách nhiệm giám sát, phản biện xã hội của Ủy ban Mặt trận Tổ quốc Việt Nam, các tổ chức chính trị - xã hội trong việc thực hiện tín dụng chính sách xã hội.
2. Hoàn thiện cơ chế, chính sách, các quy định liên quan nhằm thực hiện hiệu quả tín dụng chính sách xã hội
a) Các sở, ban, ngành liên quan thực hiện quản lý nhà nước theo lĩnh vực và thẩm quyền đối với hoạt động tín dụng chính sách xã hội; dẫn chiếu với các quy định hiện hành của pháp luật để rà soát, nghiên cứu, đề xuất sửa đổi, bổ sung, hoàn thiện các văn bản quy phạm pháp luật, các cơ chế, chính sách liên quan đến tín dụng chính sách xã hội, chính sách tín dụng ưu đãi đối với người nghèo và các đối tượng chính sách khác phù hợp điều kiện thực tiễn từng giai đoạn.
b) Nghiên cứu, đề xuất bổ sung lồng ghép cơ chế, chính sách tín dụng ưu đãi khi xây dựng các chương trình, đề án, dự án phát triển kinh tế xã hội; rà soát các chương trình tín dụng chính sách xã hội đang thực hiện, chủ động tham mưu, đề xuất các chương trình tín dụng ưu đãi đặc thù, phù hợp với đối tượng chính sách xã hội tại địa phương và yêu cầu, sự cần thiết, khả năng bố trí nguồn lực vốn.
3. Tập trung huy động nguồn lực để thực hiện có hiệu quả các chương trình tín dụng chính sách xã hội
a) Các sở, ban, ngành, UBND các cấp triển khai các giải pháp cụ thể để thực hiện tốt công tác huy động nguồn lực cho tín dụng chính sách xã hội; tiếp tục tranh thủ nguồn vốn từ trung ương, tích cực huy động vốn từ các tổ chức, cá nhân tại địa phương, đảm bảo bổ sung đủ nguồn vốn thực hiện các chương trình tín dụng chính sách xã hội trên địa bàn.
b) Bố trí nguồn vốn đầu tư công trung hạn và hằng năm trình cấp có thẩm quyền phê duyệt theo quy định của Luật Ngân sách nhà nước và Luật Đầu tư công cho chương trình tín dụng chính sách xã hội theo đề nghị của Chi nhánh NHCSXH tỉnh Bắc Kạnc) Hằng năm, cân đối, ưu tiên bố trí ngân sách địa phương ủy thác qua Chi nhánh NHCSXH tỉnh nhằm bổ sung nguồn vốn cho người nghèo và các đối tượng chính sách khác được vay vốn tín dụng chính sách xã hội. Phấn đấu đến năm 2030, nguồn vốn ủy thác từ ngân sách địa phương chiếm từ 6% đến 8%/tổng nguồn vốn tín dụng chính sách xã hội trên địa bàn d) Tổ chức “các hoạt động chăm lo cho người nghèo” đến các tổ chức xã hội, doanh nghiệp và các cá nhân để huy động bổ sung nguồn vốn cho tín dụng chính sách xã hội. Khuyến khích các tổ chức tài chính, các tổ chức kinh tế... đóng góp vào nguồn vốn tín dụng chính sách xã hội. Tạo điều kiện thuận lợi cho Chi nhánh NHCSXH tỉnh mở rộng huy động nguồn lực từ các tổ chức, cá nhân và xã hội.
4. Triển khai thực hiện tốt các chương trình tín dụng chính sách xã hội trên địa bàn
a) NHCSXH phối hợp chặt chẽ với chính quyền địa phương các cấp, các tổ chức chính trị - xã hội nhận ủy thác tổ chức thực hiện có hiệu quả các chương trình tín dụng chính sách xã hội, đáp ứng kịp thời nhu cầu vốn phục vụ sản xuất kinh doanh, tạo sinh kế, tạo việc làm và nâng cao đời sống cho người nghèo, các đối tượng chính sách khác, góp phần thực hiện mục tiêu giảm nghèo, xây dựng nông thôn mới, phát triển kinh tế - xã hội vùng đồng bào dân tộc thiểu số và miền núi, đảm bảo an sinh xã hội.
b) Các sở, ban, ngành là cơ quan chủ quản của chương trình chủ động phối hợp với NHCSXH rà soát, đánh giá kết quả thực hiện các chính sách tín dụng hiện hành đối với lĩnh vực quản lý, kịp thời đề xuất, sửa đổi, bổ sung cho phù hợp với quy định của pháp luật, thực tiễn hoạt động tín dụng chính sách xã hội trên địa bàn và điều kiện cụ thể của địa phương.
c) Các sở, ban, ngành và các cơ quan, đơn vị liên quan tham mưu cấp ủy, chính quyền địa phương triển khai thực hiện các chương trình mục tiêu quốc gia đảm bảo lồng ghép có hiệu quả tín dụng chính sách xã hội với các hoạt động khuyến công, khuyến nông, khuyến lâm, khuyến ngư, hỗ trợ kỹ thuật, chuyển giao công nghệ, tiêu thụ sản phẩm nhằm phát huy hiệu quả sử dụng vốn tín dụng chính sách xã hội.
d) NHCSXH phối hợp với tổ chức chính trị - xã hội nhận ủy thác tập huấn và hướng dẫn người dân các kiến thức cơ bản về tài chính, ngân hàng, kỹ năng quản lý tài chính cá nhân, sử dụng vốn vay hiệu quả, khuyến khích người vay tham gia xây dựng các mô hình sản xuất, chuỗi liên kết, tổ hợp tác... nhằm phát huy hiệu quả sử dụng vốn tín dụng chính sách xã hội.
5. Tiếp tục duy trì và phát huy hiệu quả mô hình tổ chức và phương thức quản lý tín dụng chính sách đặc thù
a) Phát huy vai trò, trách nhiệm Ban đại diện Hội đồng quản trị NHCSXH các cấp trong việc tham mưu, đề xuất chính sách, chỉ đạo, giám sát thực thi các chính sách tín dụng ưu đãi đảm bảo hiệu lực, hiệu quả hoạt động của Chi nhánh NHCSXH tỉnh.
b) Thực hiện có hiệu quả công tác điều hành từ tỉnh đến cơ sở, chủ động cụ thể hóa và triển khai thực hiện có hiệu quả các chương trình, kế hoạch, Nghị quyết và các nhiệm vụ được giao.
c) Tăng cường vai trò, trách nhiệm của Chủ tịch UBND cấp xã là thành viên Ban đại diện Hội đồng quản trị NHCSXH cấp huyện; tăng cường sự tham gia, giám sát của Trưởng thôn, bản, Tổ trưởng tổ dân phố trong việc quản lý nguồn vốn tín dụng tại cơ sở nhằm phát huy hiệu quả nguồn vốn, nâng cao chất lượng tín dụng chính sách xã hội.
d) Tổ chức chính trị - xã hội các cấp thực hiện tốt các nội dung công việc nhận ủy thác; nâng cao vai trò trong việc thực hiện tín dụng chính sách xã hội, chất lượng hoạt động ủy thác, đảm bảo quản lý tốt hoạt động tín dụng chính sách xã hội, chú trọng làm tốt công tác nhận diện, xác nhận đối tượng vay vốn, kiểm tra, giám sát và hướng dẫn sử dụng vốn vay có hiệu quả.
đ) Thường xuyên kiện toàn, nâng cao chất lượng, hiệu quả hoạt động của Tổ Tiết kiệm và vay vốn và năng lực cho đội ngũ Ban quản lý Tổ Tiết kiệm và vay vốn, thực hiện tốt vai trò, trách nhiệm trong việc thực hiện các nội dung công việc được ủy nhiệm; chú trọng, tăng cường kiểm tra, giám sát, hỗ trợ người vay vốn sử dụng vốn vay đúng mục đích, hiệu quả với phương châm “thấu hiểu lòng dân, tận tâm phục vụ”.
e) Duy trì và nâng cao chất lượng hoạt động giao dịch tại các Điểm giao dịch xã, tập trung nhân lực, trang thiết bị, đẩy mạnh ứng dụng công nghệ thông tin nhằm đảm bảo giao dịch an toàn, hiệu quả. Chú trọng làm tốt công tác tuyên truyền, công khai chủ trương, chính sách và kết quả thực hiện tín dụng chính sách xã hội tại Điểm giao dịch xã nhằm phát huy vai trò giám sát của Nhân dân trong việc thực hiện tín dụng chính sách xã hội.
6. Nâng cao chất lượng, hiệu lực, hiệu quả công tác kiểm tra, giám sát
a) Tăng cường công tác kiểm tra, giám sát của Ban đại diện Hội đồng quản trị NHCSXH các cấp; thường xuyên kiểm tra, giám sát các hoạt động tín dụng chính sách tại cơ sở nhằm phát hiện, ngăn ngừa, chỉnh sửa kịp thời tồn tại, sai sót (nếu có); gắn hiệu quả hoạt động kiểm tra, giám sát với việc nâng cao khả năng cảnh báo sớm đối với những rủi ro tiềm ẩn trong hoạt động tín dụng chính sách xã hội tại địa phương.
b) Nâng cao vai trò, hiệu lực, hiệu quả công tác kiểm tra kiểm soát nội bộ; đảm bảo tính độc lập, phân định rõ chức năng, nhiệm vụ và phối hợp chặt chẽ giữa kiểm tra, kiểm soát và kiểm toán nội bộ; đổi mới phương pháp và kỹ năng kiểm tra, kiểm soát phù hợp với hoạt động của NHCSXH trên địa bàn.
c) Phát huy vai trò giám sát, phản biện xã hội của Ủy ban Mặt trận Tổ quốc và các tổ chức chính trị - xã hội trong thực hiện tín dụng chính sách xã hội; vai trò chủ thể của người dân trong giám sát cộng đồng; các tổ chức chính trị - xã hội nhận ủy thác tăng cường kiểm tra, giám sát tổ chức Hội, đoàn thể cấp dưới; nâng cao chất lượng kiểm tra việc sử dụng vốn vay và giám sát hoạt động của Tổ Tiết kiệm và vay vốn.
7. Triển khai sản phẩm, dịch vụ đối với các tính năng hiện đại, chi phí hợp lý, phù hợp với đối tượng khách hàng của NHCSXH
a) Triển khai các sản phẩm, dịch vụ với các tính năng hiện đại, tiện lợi, dễ sử dụng, chi phí phù hợp với nhu cầu và khả năng chi trả của khách hàng khu vực nông thôn, vùng sâu, vùng xa, người có thu nhập thấp, người yếu thế, các doanh nghiệp nhỏ, các hợp tác xã, nhằm thực hiện tốt Chiến lược tài chính toàn diện quốc gia được Thủ tướng Chính phủ phê duyệt, phù hợp với hoạt động của NHCSXH.
b) Tiêu chuẩn hóa quy trình các sản phẩm, dịch vụ trên cơ sở tuân thủ các quy định của Nhà nước, của ngành ngân hàng, phù hợp với hệ thống đảm bảo phục vụ tốt cho các đối tượng của NHCSXH.
c) Nâng cấp tính năng các sản phẩm, dịch vụ do NHCSXH cung cấp nhằm đảm bảo an ninh, an toàn trong hoạt động, tạo niềm tin cho khách hàng và bảo vệ người sử dụng.
8. Nâng cao năng lực tài chính đảm bảo sự phát triển ổn định, bền vững của NHCSXH
a) Bố trí nguồn lực hỗ trợ các đối tượng thụ hưởng tín dụng chính sách và thực hiện có hiệu quả các chương trình tín dụng chính sách xã hội.
b) Phân bổ và sử dụng hiệu quả các nguồn lực tài chính, sử dụng vốn tiết kiệm, hiệu quả, nâng cao năng suất lao động.
c) Chú trọng phát triển nhằm tăng các khoản thu từ hoạt động dịch vụ.
9. Chú trọng phát triển nguồn nhân lực theo hướng chất lượng đáp ứng yêu cầu nhiệm vụ
a) Tuyển dụng nguồn nhân lực có chất lượng đáp ứng yêu cầu phát triển và ứng dụng khoa học công nghệ, nâng cao chất lượng phục vụ đến khách hàng là đối tượng chính sách. Có chính sách khuyến khích cán bộ về công tác tại các huyện nghèo xa trung tâm thành phố, nơi có điều kiện khó khăn, làm công tác tín dụng tại các huyện nghèo, vùng sâu, vùng xa, vùng đồng bào dân tộc thiểu số và đặc biệt khó khăn.
b) Thực hiện tốt công tác cán bộ, chú trọng công tác quy hoạch, bồi dưỡng, bố trí, sắp xếp cán bộ có đủ trình độ, năng lực, uy tín, sức khỏe nhằm đáp ứng yêu cầu nhiệm vụ; thường xuyên đào tạo, bồi dưỡng, tập huấn nâng cao năng lực, trình độ đội ngũ cán bộ, người lao động của NHCSXH giỏi về chuyên môn, có phẩm chất đạo đức nghề nghiệp, có khả năng ứng dụng công nghệ thông tin, phương thức làm việc tiên tiến, hiện đại, nâng cao chất lượng phục vụ đến khách hàng là đối tượng chính sách.
c) Phối hợp đào tạo, tập huấn nghiệp vụ cho cán bộ kiêm nhiệm, phối hợp thực hiện tín dụng chính sách xã hội (Chủ tịch UBND cấp xã là thành viên Ban đại diện Hội đồng quản trị NHCSXH cấp huyện; cán bộ làm công tác ủy thác; cán bộ Ban giảm nghèo cấp xã; Trưởng thôn, Ban quản lý Tổ Tiết kiệm và vay vốn) nhằm nâng cao kiến thức, kỹ năng triển khai, quản lý tín dụng chính sách xã hội
10. Nâng cao năng lực quản lý và xử lý nợ rủi ro
a) Xây dựng các chỉ tiêu nhận biết, cảnh báo sớm rủi ro tín dụng nhằm ngăn ngừa, hạn chế kịp thời những rủi ro trong quá trình thực hiện tín dụng chính sách xã hội.
b) Thực hiện phân loại nợ, trích lập dự phòng rủi ro theo quy định. Xử lý kịp thời, chính xác, khách quan các khoản nợ bị rủi ro theo đúng quy định, đảm bảo công khai, minh bạch nhằm hỗ trợ các đối tượng kịp thời tháo gỡ khó khăn, phục hồi sản xuất, tạo sinh kế, ổn định cuộc sống.
11. Đẩy mạnh ứng dụng công nghệ thông tin đáp ứng yêu cầu phát triển của NHCSXH
a) Phát triển hệ thống công nghệ thông tin nhằm đáp ứng yêu cầu chuyển đổi số, hiện đại hóa ngành ngân hàng, phù hợp với hoạt động đặc thù của tín dụng chính sách xã hội.
b) Đầu tư, nâng cấp hệ thống công nghệ thông tin nhằm đa dạng hóa sản phẩm, dịch vụ và nâng cao chất lượng hoạt động.
c) Triển khai các giải pháp đảm bảo an ninh, an toàn, bảo mật nhằm đảm bảo hoạt động liên tục của hệ thống thông tin.
d) Nâng cao chất lượng nguồn nhân lực công nghệ thông tin đáp ứng yêu cầu phát triển.
12. Tăng cường và nâng cao hiệu quả công tác truyền thông của Ngân hàng Chính sách xã hội; tiếp tục rà soát, đơn giản hóa thủ tục giải quyết công việc
a) Đẩy mạnh công tác truyền thông, trong đó chú trọng truyền thông đến vùng sâu, vùng xa, vùng đồng bào dân tộc thiểu số và đặc biệt khó khăn nhằm tuyên truyền đầy đủ, kịp thời chủ trương, chính sách của Đảng và Nhà nước về tín dụng chính sách xã hội, góp phần gia tăng niềm tin của Nhân dân đối với Đảng và Nhà nước.
b) Tiếp tục đơn giản hóa thủ tục giải quyết công việc tạo điều kiện thuận lợi cho các đối tượng phục vụ của Ngân hàng Chính sách xã hội, đồng thời tăng cường kiểm tra, giám sát của các cơ quan quản lý nhà nước, Nhân dân đối với hoạt động tín dụng chính sách xã hội.
IV. TỔ CHỨC THỰC HIỆN
1. Các sở, ban, ngành, các đơn vị có liên quan, UBND các huyện, thành phố, NHCSXH, các tổ chức chính trị - xã hội nhận ủy thác
Căn cứ nội dung Quyết định số 05/QĐ-TTg ngày 04/01/2023 của Thủ tướng Chính phủ về việc phê duyệt Chiến lược phát triển NHCSXH đến năm 2030 và Kế hoạch này của UBND tỉnh triển khai thực hiện phù hợp với đặc điểm, điều kiện tình hình thực tiễn của ngành, địa phương, đơn vị.
2. Ủy ban Mặt trận Tổ quốc Việt Nam các cấp
Đề nghị Ủy ban Mặt trận Tổ quốc Việt Nam các cấp tiếp tục thực hiện tốt chức năng giám sát, phản biện xã hội đối với hoạt động tín dụng chính sách xã hội . Tiếp tục tổ chức tốt “các hoạt động chăm lo cho người nghèo”; chỉ đạo, hướng dẫn Ban vận động Quỹ “Vì Người nghèo” các cấp mở tài khoản tiền gửi thanh toán tại NHCSXH để có thêm nguồn lực hỗ trợ, giúp đỡ người nghèo. Tuyên truyền, vận động để huy động sự đóng góp của các tổ chức, cá nhân và các nhà doanh nghiệp bổ sung nguồn vốn cho tín dụng chính sách xã hội bằng hình thức phù hợp; phối hợp với NHCSXH các cấp tuyên truyền, vận động các cơ quan, đơn vị quản lý các quỹ nhân đạo, từ thiện thực hiện mở tài khoản tiền gửi tại NHCSXH các cấp để tăng cường nguồn lực cho thực hiện tín dụng chính sách xã hội.
3. Ban đại diện Hội đồng quản trị NHCSXH các cấp
Căn cứ chức năng, nhiệm vụ tổ chức chỉ đạo và triển khai thực hiện các nội dung Kế hoạch này. Tham mưu UBND cấp tỉnh, cấp huyện, các ngành và chính quyền cơ sở thực hiện tốt các mục tiêu, nhiệm vụ, giải pháp đã đề ra.
4. Sở Nội vụ
Phối hợp với Chi nhánh NHCSXH tỉnh hướng dẫn thực hiện công tác khen thưởng, thẩm định và trình Chủ tịch UBND tỉnh khen thưởng theo quy định.
5. Chi nhánh Ngân hàng Chính sách xã hội tỉnh
- Chủ trì, phối hợp với Sở Nội vụ hướng dẫn thực hiện công tác khen thưởng; tiếp nhận hồ sơ, lựa chọn tập thể, cá nhân có thành tích tiêu biểu xuất sắc đề nghị Chủ tịch UBND tỉnh khen thưởng vào dịp sơ kết, tổng kết.
- Tổ chức sơ kết (vào năm 2025), tổng kết (vào năm 2030) rút kinh nghiệm việc thực hiện các nhiệm vụ, giải pháp và mục tiêu của Chiến lược trong từng giai đoạn.
- Chủ trì, phối hợp với các sở, ban, ngành và các đơn vị có liên quan giúp Chủ tịch UBND tỉnh theo dõi, đôn đốc việc triển khai thực hiện Kế hoạch này; tổng hợp những khó khăn, vướng mắc trong quá trình triển khai thực hiện tại cơ sở (nếu có), báo cáo UBND tỉnh để kịp thời tháo gỡ khó khăn, vướng mắc; định kỳ hằng năm tổng hợp, đánh giá kết quả thực hiện Kế hoạch này, báo cáo Chủ tịch UBND tỉnh./.
.buble_cttd .badge-phan-tich, .buble_cttd .menu-button-phan-tich, .noi_dung_box_chuthich .badge-phan-tich, .noi_dung_box_chuthich .menu-button-phan-tich { display: none !important; }');
// ========== CẤU HÌNH ==========
// Bật/tắt nút 3 chấm dọc (true = hiện trên mọi thiết bị, false = chỉ hiện trên touch device)
const USE_THREE_DOTS_BUTTON = true; // Mặc định: true - luôn hiện nút 3 chấm
let cac_cau_hinh = {
loai_noi_dung: ['docs'],
vb_ids: ['925bd3177672dbbc78f3358613bec0eb']
};
const maxConcurrentRequests = 10;
let pendingRequests = 0;
const requestQueue = [];
let allow_sub_p = false; // Cho phép gửi lồng nhau (bên trong) hay không
const memberID = 0;
const isVIP = false;
const vbID = '925bd3177672dbbc78f3358613bec0eb';
const unlockAllPhanTich = true;
// 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
// Typing effect state
let typingTimerId = null;
let typingCancelled = false;
// Thinking GIF state
let thinkingGifIntervalId = null;
let thinkingGifActive = false;
let thinkingGifCurrent = 0; // chỉ số GIF hiện tại 1..10
// Countdown timer state (cho retry lỗi 500)
let countdownTimerId = null;
// Detect touch device - chỉ true khi thiết bị CHÍNH sử dụng touch (không có mouse chính xác)
const isTouchDevice = () => {
// Nếu USE_THREE_DOTS_BUTTON = true, luôn trả về true (hiện trên mọi thiết bị)
if (USE_THREE_DOTS_BUTTON === true) return true;
// Ưu tiên: Kiểm tra pointer: coarse (thiết bị chính sử dụng touch, không có mouse/trackpad)
if (window.matchMedia) {
// pointer: coarse = thiết bị chính sử dụng touch (mobile/tablet)
// pointer: fine = thiết bị có mouse/trackpad chính xác (desktop/laptop)
const hasCoarsePointer = window.matchMedia('(pointer: coarse)').matches;
if (hasCoarsePointer) return true;
}
// Fallback: Kiểm tra touch support (không chính xác lắm vì laptop cũng có thể có touch)
// Chỉ dùng khi không support matchMedia
if (!window.matchMedia) {
return (('ontouchstart' in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0));
}
return false;
};
const isTouch = isTouchDevice();
// State for dropdown menu on touch devices
let currentOpenDropdown = null;
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;
// Check in_bubble robustly
const in_bubble = ($element.closest('.buble_cttd').length > 0 || $element.closest('.noi_dung_box_chuthich').length > 0 || $element.closest('[id^="chu_thich_bubble_"]').length > 0) ? 1 : 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, vb_ngaybanhanh: '2023-08-11 00:00:00 AM', in_bubble: in_bubble };
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/menu
if (!in_bubble && ((unlockAllPhanTich) || memberID === 4 || memberID === 3 || memberID === 2) && typeof attachPhanTichBadge === 'function') {
setTimeout(function() {
// $element chính là thẻ p, kiểm tra và attach badge/menu trực tiếp
const $parent = $element.closest('phan, chuong, muc, tieumuc, dieu, khoan, diem');
if ($parent.length > 0) {
const address = $parent.attr('address');
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
if (isTouch) {
// Touch device: Thêm nút 3 chấm (append vào body)
if ($('body').find('.menu-button-phan-tich[data-for="' + address + '"]').length === 0) {
const $menuButton = $('
');
$('body').append($menuButton); // Append vào body
$parent.addClass('has-phan-tich-menu');
// Trigger update positions sau khi thêm
setTimeout(function() {
if (typeof window.updateMenuButtonPositions === 'function') {
window.updateMenuButtonPositions();
}
}, 10);
}
} else {
// Desktop: Append badge vào parent
if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) {
$element.attr('data-address', address);
const $badge = $('');
$parent.append($badge);
$parent.addClass('has-phan-tich-badge');
}
}
}
// Xử lý các p con (nếu có sub-p)
attachPhanTichBadge($element);
}, 3); // Đợi 3ms để CTTD render xong
}
},
complete: function() {
$element.removeClass('loading-content');
}
})
);
processQueue();
}
});
} catch(e) {
}
}
$(window).on('scroll resize', function () {
processVisibleParagraphs();
});
processVisibleParagraphs();
// Chức năng phân tích điều luật (mở theo lịch unlockAllPhanTich cho tất cả, nhưng khách click sẽ mở modal đăng nhập/mua gói)
if ((unlockAllPhanTich) || memberID === 4 || memberID === 3 || memberID === 2) {
// 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';
}
// Chuyển Telex -> Unicode cho giá trị (ví dụ: dd->đ, oo->ô, ow->ơ, aa->â, ee->ê, aw->ă, uw->ư)
function telexToUnicode(str) {
if (!str) return str;
// Giữ nguyên số
if (/^\d+$/.test(str)) return str;
let s = String(str);
// dd / ĐĐ
s = s.replace(/dd/g, 'đ');
s = s.replace(/DD/g, 'Đ');
// nguyên âm có mũ/dấu
s = s.replace(/aa/g, 'â').replace(/AA/g, 'Â');
s = s.replace(/ee/g, 'ê').replace(/EE/g, 'Ê');
s = s.replace(/oo/g, 'ô').replace(/OO/g, 'Ô');
s = s.replace(/ow/g, 'ơ').replace(/OW/g, 'Ơ');
s = s.replace(/uw/g, 'ư').replace(/UW/g, 'Ư');
s = s.replace(/aw/g, 'ă').replace(/AW/g, 'Ă');
return s;
}
function attachPhanTichBadge($container) {
const validTags = 'phan, chuong, muc, tieumuc, dieu, khoan, diem';
$container.find('p').each(function() {
const $p = $(this);
// Check if inside buble_cttd robustly
if ($p.closest('.buble_cttd').length > 0 || $p.closest('.noi_dung_box_chuthich').length > 0 || $p.closest('[id^="chu_thich_bubble_"]').length > 0) return;
const $parent = $p.closest(validTags);
if ($parent.length > 0) {
const address = $parent.attr('address');
// Trên touch device: Thêm nút 3 chấm dọc (append vào body vì dùng fixed position)
if (isTouch) {
// Kiểm tra đã có nút 3 chấm chưa (trong body)
if ($('body').find('.menu-button-phan-tich[data-for="' + address + '"]').length === 0) {
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
// Tạo nút 3 chấm với dropdown và append vào body
const $menuButton = $('');
$('body').append($menuButton); // Append vào body, không vào parent
$parent.addClass('has-phan-tich-menu');
}
} else {
// Desktop: Giữ nguyên badge hover như cũ (append vào parent)
if ($parent.find('.badge-phan-tich[data-for="' + address + '"]').length === 0) {
$p.attr('data-address', address);
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
const $badge = $('');
$parent.append($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, '');
// 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);
}
// Stop typing animation nếu đang chạy
stopThinkingTyping();
// Clear countdown timer nếu đang chạy
if (countdownTimerId) {
clearInterval(countdownTimerId);
countdownTimerId = null;
}
// 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
} else {
// KHÔNG có CTTD → SHOW lại rightdocinfo
const $rightdocinfo = $('#rightdocinfo');
if ($rightdocinfo.length > 0) {
$rightdocinfo.show();
}
}
// Reset state
isAnalyzing = false;
currentAnalyzingAddress = null;
currentAnalyzingElement = null;
currentAnalyzingBadge = null;
isPanelOpen = false; // Đánh dấu panel đã đóng
}
// Panel đã song song với rightdocinfo → không cần MutationObserver nữa
// 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();
if ($('#phanTichPanelBody').hasClass('thinking-mode')) {
updateThinkingGifHeight();
}
}
}, 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');
// Mobile: dùng bottom sheet → để CSS điều khiển, bỏ qua reposition bằng JS
if ($(window).width() <= 768) {
return;
}
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'
});
} else {
}
// Restore trạng thái hidden nếu cần
if (wasHidden) {
$reference.hide().css('visibility', '');
}
}
}
// Hiệu ứng typing giả lập đang phân tích trong panel
function stopThinkingTyping() {
typingCancelled = true;
if (typingTimerId) {
clearTimeout(typingTimerId);
typingTimerId = null;
}
// Dừng trình chiếu ảnh khi dừng typing
stopThinkingImages();
}
// Helper GIF: chọn chỉ số ảnh mới 1..10 khác với exclude
function randomGifIndex(exclude) {
let n = exclude;
while (n === exclude) {
n = Math.floor(Math.random() * 10) + 1;
}
return n;
}
// Helper GIF: preload rồi gán src cho img, gọi callback sau khi load xong (hoặc lỗi)
function setGifSrc($img, idx, cb) {
const url = '/assets/images/gif/researching-' + idx + '.gif';
const updateWrapHeight = function(nW, nH){
try {
const $wrap = $img.closest('#thinkingGifWrapper');
if ($wrap.length && nW && nH) {
const wrapW = $wrap.width();
const maxW = wrapW * 0.9; // khớp với CSS max-width:90%
const displayW = Math.min(nW, maxW);
const displayH = nH * (displayW / nW);
$wrap.css('height', displayH + 'px');
}
} catch(e) { /* ignore */ }
};
if ($img.attr('src') === url) {
// Ảnh trùng src -> vẫn cập nhật lại chiều cao wrapper theo kích thước hiển thị hiện tại
const el = $img[0];
if (el && el.naturalWidth && el.naturalHeight) {
updateWrapHeight(el.naturalWidth, el.naturalHeight);
}
if (cb) cb();
return;
}
const pre = new Image();
pre.onload = function() {
$img.attr('src', url);
updateWrapHeight(pre.naturalWidth, pre.naturalHeight);
if (cb) cb();
};
pre.onerror = function() {
$img.attr('src', url);
// Không lấy được kích thước tự nhiên -> để auto
const $wrap = $img.closest('#thinkingGifWrapper');
if ($wrap.length) { $wrap.css('height', 'auto'); }
if (cb) cb();
};
pre.src = url;
}
function updateThinkingGifHeight() {
const $wrap = $('#thinkingGifWrapper');
if ($wrap.length === 0) return;
const $show = $('#thinkingGifA.visible, #thinkingGifB.visible').first();
if ($show.length === 0) return;
const el = $show[0];
if (!el.naturalWidth || !el.naturalHeight) return;
const wrapW = $wrap.width();
const maxW = wrapW * 0.9;
const displayW = Math.min(el.naturalWidth, maxW);
const displayH = el.naturalHeight * (displayW / el.naturalWidth);
$wrap.css('height', displayH + 'px');
}
function startThinkingImages() {
// Nếu body/khung chưa sẵn sàng thì bỏ qua
const $wrap = $('#thinkingGifWrapper');
if ($wrap.length === 0) return;
// Clear trước nếu đang chạy
stopThinkingImages();
thinkingGifActive = true;
const $a = $('#thinkingGifA');
const $b = $('#thinkingGifB');
$a.removeClass('visible');
$b.removeClass('visible');
// Ảnh đầu tiên
thinkingGifCurrent = randomGifIndex(0);
let useA = true; // ảnh A hiển thị trước
setGifSrc($a, thinkingGifCurrent, function(){ $a.addClass('visible'); });
// Mỗi 3s đổi ảnh, crossfade 0.5s qua CSS
thinkingGifIntervalId = setInterval(function(){
if (!thinkingGifActive) return;
const nextIdx = randomGifIndex(thinkingGifCurrent);
const $show = useA ? $b : $a; // show ảnh còn lại
const $hide = useA ? $a : $b;
setGifSrc($show, nextIdx, function(){
// Bắt đầu chuyển ảnh: ẩn ảnh cũ, hiện ảnh mới
$hide.removeClass('visible');
setTimeout(function(){ $show.addClass('visible'); }, 10);
thinkingGifCurrent = nextIdx;
useA = !useA;
});
}, 5000);
}
function stopThinkingImages() {
thinkingGifActive = false;
if (thinkingGifIntervalId) {
clearInterval(thinkingGifIntervalId);
thinkingGifIntervalId = null;
}
}
// Giải quyết address: nếu không có '_' thì decrypt (ưu tiên API, fallback client), ngược lại trả về nguyên vẹn
function clientDecrypt(encrypted, key) {
try {
const bin = atob(encrypted);
let out = '';
for (let i = 0; i < bin.length; i++) {
const ch = bin.charCodeAt(i);
const k = key.charCodeAt(i % key.length);
out += String.fromCharCode(ch ^ k);
}
// Chuẩn hóa tương tự server
out = out.toLowerCase().replace(/[^a-z0-9_]/g, '');
return out || encrypted;
} catch (e) {
return encrypted;
}
}
function resolveAddress(address) {
return new Promise(function(resolve) {
if (!address) { resolve(''); return; }
const addr = String(address);
const lower = addr.toLowerCase();
if (lower === 'trichyeu' || lower === 'cancu' || addr.indexOf('_') !== -1) {
resolve(addr);
return;
}
const randomServer = Math.floor(Math.random() * 10) + 1;
$.ajax({
url: '//tnpl' + randomServer + '.hethongphapluat.com/tien-ich/ajax/decrypt.ndsh.address.php',
type: 'POST',
data: { address_encrypted: addr },
timeout: 10000,
success: function(resp) {
try {
// jQuery sẽ parse JSON theo header, nhưng vẫn fallback nếu là string
if (typeof resp === 'string') { resp = JSON.parse(resp); }
} catch(e) { /* ignore */ }
if (resp && resp.ok && resp.address) {
resolve(resp.address);
} else {
// Fallback client decrypt
resolve(clientDecrypt(addr, 'htpl_noi_dung_vb_address'));
}
},
error: function() {
// Fallback client decrypt
resolve(clientDecrypt(addr, 'htpl_noi_dung_vb_address'));
}
});
});
}
function startThinkingTyping(address) {
// Reset trước khi bắt đầu
stopThinkingTyping();
typingCancelled = false;
const $body = $('#phanTichPanelBody');
if ($body.length === 0) return;
// Đánh dấu chế độ thinking để căn giữa toàn bộ nội dung trong body
$body.addClass('thinking-mode');
// Khởi tạo container nếu chưa có
if ($('#thinkingContainer').length === 0) {
$body.html('\
\
\
\
');
}
$('#thinkingText').html('');
// Khởi động slideshow ảnh thinking
startThinkingImages();
// Chờ resolve address (decrypt nếu cần) rồi mới bắt đầu typing
resolveAddress(address).then(function(addrPlain) {
if (typingCancelled) return;
const displayNameLarge = getElementDisplayNameLargeFirst(addrPlain);
$('.processing-text').text('Đang xử lý phân tích ' + displayNameLarge.toLowerCase() + '...');
// Câu nói đa dạng cho từng bước
const variants = [
[
'Tôi đã nhận được yêu cầu phân tích {name}...',
'Cảm ơn bạn đã gửi yêu cầu phân tích {name}, tôi sẽ bắt đầu...',
'Bạn đã yêu cầu tôi phân tích {name}, hãy chờ tôi lập kế hoạch...',
'Yêu cầu phân tích {name} đã được ghi nhận, tôi đang chuẩn bị...'
],
[
'Tiếp theo, tôi sẽ đọc kỹ nội dung chi tiết của {name}...',
'Bây giờ tôi cần xem xét kỹ nội dung của {name}...',
'Đang mở và duyệt qua nội dung {name}...'
],
[
'Tôi đã đọc xong. Tôi sẽ kiểm tra xem {name} có bị sửa đổi, bổ sung, thay thế hoặc bãi bỏ bởi điều khoản nào không...',
'Tôi sẽ đối chiếu các văn bản để xem {name} có thay đổi hiệu lực nào không...',
'Tiếp tục kiểm tra trạng thái hiệu lực và các lần sửa đổi của {name}...'
],
[
'Tôi cũng cần xem {name} có được hướng dẫn bởi điều luật nào không...',
'Đang tìm các quy định hướng dẫn áp dụng liên quan đến {name}...',
'Kiểm tra các văn bản hướng dẫn có nhắc đến {name}...'
],
[
'Tôi sẽ kiểm tra {name} có viện dẫn/nhắc đến điều luật khác để tham chiếu hay không...',
'Đang rà soát các điều khoản được {name} đề cập đến...',
'Tìm các tham chiếu pháp lý xuất hiện trong {name}...'
],
[
'Tôi sẽ nghiên cứu về phạm vi điều chỉnh và đối tượng áp dụng'
],
[
'Bây giờ tôi cần tìm ví dụ minh họa cho nội dung điều này...'
],
[
'Tôi cũng cần bổ sung vài lưu ý thực tiễn trong bài phân tích của tôi...'
],
[
'Giờ tôi sẽ viết phần kết luận của bài phân tích...'
],
[
'Bây giờ tôi bắt đầu phân tích chi tiết {name}...',
'Bắt đầu tổng hợp và phân tích {name}...',
'Tiến hành phân tích nội dung {name}...'
]
];
const pick = (arr) => arr[Math.floor(Math.random() * arr.length)];
const lines = variants.map(group => pick(group).replace(/\{name\}/g, displayNameLarge));
let lineIndex = 0;
let charIndex = 0;
const speedMin = 12; // ms
const speedMax = 25; // ms
const linePause = 2000; // ms chờ 2s giữa các câu
function typeNextChar() {
if (typingCancelled) return;
const line = lines[lineIndex];
if (charIndex < line.length) {
$('#thinkingText').append(line.charAt(charIndex));
charIndex++;
const delay = Math.floor(Math.random() * (speedMax - speedMin + 1)) + speedMin;
typingTimerId = setTimeout(typeNextChar, delay);
} else {
// Hoàn tất 1 câu
if (lineIndex < lines.length - 1) {
// Chờ 2s rồi chuyển sang câu tiếp theo, thay thế câu cũ (không append)
typingTimerId = setTimeout(function() {
if (typingCancelled) return;
$('#thinkingText').html('');
lineIndex++;
charIndex = 0;
typeNextChar();
}, linePause);
} else {
// Câu cuối cùng -> giữ nguyên, chỉ để caret nhấp nháy; không loop
return;
}
}
}
typeNextChar();
});
}
function openPhanTichPanel(address, vbID) {
// Kiểm tra nếu đang phân tích element khác
if (isAnalyzing && currentAnalyzingAddress && currentAnalyzingAddress !== address) {
// Giải mã địa chỉ hiện đang phân tích trước khi hiển thị trong modal
resolveAddress(currentAnalyzingAddress).then(function(addrPlain) {
const currentName = getElementDisplayNameLargeFirst(addrPlain);
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) {
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
// ẨN rightdocinfo để tiết kiệm không gian
if ($rightdocinfo.length > 0) {
$rightdocinfo.hide();
}
// XÓA highlight persistent của TẤT CẢ elements cũ trước
$('#tab_noi_dung_vb .highlight-border-persistent').removeClass('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;
// 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
// Đả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 = `
`;
// 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;
// Bắt đầu typing
stopThinkingTyping();
startThinkingTyping(address);
}, 10);
} else {
// Khởi tạo giao diện typing khi mở lại panel
$('#phanTichPanelBody').addClass('thinking-mode').html('');
// Update dimensions khi re-open
updatePanelDimensions();
$('#phanTichPanel').addClass('show');
isPanelOpen = true;
// Bắt đầu typing
stopThinkingTyping();
startThinkingTyping(address);
}
// 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');
// Show typing trong panel thay cho loading
$('#phanTichPanelBody').addClass('thinking-mode').html('');
stopThinkingTyping();
startThinkingTyping(address);
// Gọi API xóa cache trước
deletePhanTichCache(address, vbID, function(deleteSuccess) {
if (deleteSuccess) {
// 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 {
$('#phanTichPanelBody').html(`
Lỗi! Không thể xóa cache. Vui lòng thử lại.
`);
$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, attempt) {
attempt = attempt || 1;
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,
member_ID: memberID
}),
success: function(response) {
if (response && response.ok) {
// Thành công -> kết thúc thinking và reset trạng thái
stopThinkingTyping();
if (currentAnalyzingBadge) {
currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
currentAnalyzingBadge.data('analyzing', false);
}
isAnalyzing = false;
// Render kết quả phân tích với hiệu ứng xuất hiện dần từ trên xuống dưới
let html = '';
html += '';
html += '';
html += '
' + markdownToHtml(response.phan_tich) + '
';
// Khuyến cáo thay cho thống kê token
html += '
';
html += 'Nội dung phân tích này chỉ mang tính chất tham khảo, để hiểu rõ hơn, quý khách nên tham vấn ý kiến luật sư và các chuyên gia pháp lý có chuyên môn để được hỗ trợ cụ thể cho trường hợp của mình.';
html += '
';
html += '
';
$('#phanTichPanelBody').removeClass('thinking-mode').html(html);
applyFadeReveal();
} else {
// Không ok -> nếu là quá tải và chưa vượt số lần thử thì retry
const msg = response && response.error ? response.error : '';
if (isOverloadedMessage(msg) && attempt < 50 && isPanelOpen && isAnalyzing && currentAnalyzingAddress === address) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function() { callPhanTichAPI(address, vbID, callback, attempt + 1); }, delay);
return;
}
// Hết số lần thử hoặc không phải quá tải -> hiển thị lỗi
stopThinkingTyping();
if (currentAnalyzingBadge) {
currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
currentAnalyzingBadge.data('analyzing', false);
}
isAnalyzing = false;
if (isOverloadedMessage(msg)) {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainPanel').on('click.tryAgainPanel', '#btnTryAgainPanel', function() {
openPhanTichPanel(address, vbID);
});
} else if (isError500Message(msg, 0)) {
// Lỗi 500 - hiển thị countdown 30s và tự động retry
showError500WithCountdown(address, vbID, msg || 'Lỗi máy chủ (500): Không thể phân tích điều luật.', callback);
return; // Không gọi callback ngay, sẽ gọi sau khi retry
} else {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Lỗi! ${escapeHtml(msg || 'Không thể phân tích điều luật.')}
Vui lòng thử lại sau.
`);
}
}
if (callback) callback();
},
error: function(xhr, status, error) {
// Nếu quá tải và chưa quá 50 lần -> retry, giữ hiệu ứng thinking và trạng thái analyzing
let errorMsg = error;
if (xhr.responseJSON && xhr.responseJSON.error) {
errorMsg = (xhr.responseJSON.error.message || xhr.responseJSON.error) || errorMsg;
} else if (xhr.responseText) {
errorMsg = xhr.responseText;
}
if ((xhr.status === 503 || isOverloadedMessage(errorMsg)) && attempt < 50 && isPanelOpen && isAnalyzing && currentAnalyzingAddress === address) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function() { callPhanTichAPI(address, vbID, callback, attempt + 1); }, delay);
return;
}
// Hết số lần thử hoặc lỗi khác -> hiển thị thông báo phù hợp
stopThinkingTyping();
if (currentAnalyzingBadge) {
currentAnalyzingBadge.text('Phân tích').removeClass('analyzing');
currentAnalyzingBadge.data('analyzing', false);
}
isAnalyzing = false;
if (xhr.status === 503 || isOverloadedMessage(errorMsg)) {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainPanel').on('click.tryAgainPanel', '#btnTryAgainPanel', function() {
openPhanTichPanel(address, vbID);
});
} else if (xhr.status === 500 || isError500Message(errorMsg, xhr.status)) {
// Lỗi 500 - hiển thị countdown 30s và tự động retry
showError500WithCountdown(address, vbID, errorMsg || 'Lỗi máy chủ (500): Không thể kết nối đến server phân tích.', callback);
return; // Không gọi callback ngay, sẽ gọi sau khi retry
} else {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Lỗi! Không thể kết nối đến server phân tích.
Chi tiết: ${escapeHtml(errorMsg)}
`);
}
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) {
if (callback) callback(response.ok || false);
},
error: function(xhr, status, error) {
if (callback) callback(false);
}
});
}
// Helper: Lấy tên hiển thị của element từ address (có chuyển Telex -> Unicode ở phần giá trị)
function getElementDisplayName(address) {
if (!address) return 'nội dung';
const addrStr = String(address).toLowerCase();
// Các trường hợp đặc biệt không có cặp key_value
if (addrStr === 'trichyeu') return 'Trích yếu';
if (addrStr === 'cancu') return 'Căn cứ';
// Parse địa chỉ linh hoạt: hỗ trợ cả dạng thiếu cặp
const parts = addrStr.split('_');
const types = new Set(['phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem']);
const displayParts = [];
for (let i = 0; i < parts.length; i++) {
const key = parts[i];
if (types.has(key)) {
const label = getParentTypeName(key);
const val = (i + 1 < parts.length) ? parts[i + 1] : '';
const valVN = telexToUnicode(val);
displayParts.push(label + (valVN ? ' ' + valVN : ''));
if (val) i++; // bỏ qua value nếu đã dùng
}
}
const title = displayParts.reverse().join(' ');
if (title) return title;
// Fallback: nếu không parse được, trả về address gốc
return address;
}
// Helper: Lấy tên hiển thị theo thứ tự lớn -> nhỏ (Điều > Khoản > Điểm), có chuyển Telex
function getElementDisplayNameLargeFirst(address) {
if (!address) return 'nội dung';
const addrStr = String(address).toLowerCase();
if (addrStr === 'trichyeu') return 'Trích yếu';
if (addrStr === 'cancu') return 'Căn cứ';
const parts = addrStr.split('_');
const types = new Set(['phan', 'chuong', 'muc', 'tieumuc', 'dieu', 'khoan', 'diem']);
const displayParts = [];
for (let i = 0; i < parts.length; i++) {
const key = parts[i];
if (types.has(key)) {
const label = getParentTypeName(key);
const val = (i + 1 < parts.length) ? parts[i + 1] : '';
const valVN = telexToUnicode(val);
displayParts.push(label + (valVN ? ' ' + valVN : ''));
if (val) i++;
}
}
const title = displayParts.join(' ');
return title || address;
}
// Hiệu ứng typing nhanh cho nội dung kết quả (preview text), sau đó thay bằng HTML đầy đủ
let fastTypingTimerId = null;
function stopFastTypingContent() {
if (fastTypingTimerId) {
clearTimeout(fastTypingTimerId);
fastTypingTimerId = null;
}
}
function stripHtmlToText(html) {
const tmp = document.createElement('div');
tmp.innerHTML = html;
const text = (tmp.textContent || tmp.innerText || '') || '';
return text.replace(/\u00A0/g, ' ');
}
function startFastTypingFinalContent(finalHtml) {
stopThinkingTyping();
stopFastTypingContent();
stopThinkingImages();
const $body = $('#phanTichPanelBody');
if ($body.length === 0) return;
$body.removeClass('thinking-mode');
const previewTextFull = stripHtmlToText(finalHtml).trim();
const maxChars = 800; // giới hạn để không quá lâu
const previewText = previewTextFull.slice(0, maxChars);
$body.html('');
let idx = 0;
const speedMin = 2;
const speedMax = 5;
function typeNext() {
if (idx < previewText.length) {
$('#fastTypingText').append(previewText.charAt(idx));
idx++;
const delay = Math.floor(Math.random() * (speedMax - speedMin + 1)) + speedMin;
fastTypingTimerId = setTimeout(typeNext, delay);
} else {
// Khi gõ xong preview → thay bằng HTML đầy đủ
$body.html(finalHtml);
}
}
typeNext();
}
// Áp dụng hiệu ứng xuất hiện dần từ trên xuống dưới
function applyFadeReveal() {
const $container = $('#phanTichPanelBody .fade-reveal-container');
if (!$container.length) return;
// Lấy các block cấp cao và các phần tử con trong nội dung phân tích
const $blocks = $().add($container.children())
.add($container.find('.phan-tich-content').children());
let delayMs = 0;
const stepMs = 60; // ms giữa các phần tử
$blocks.each(function() {
const $el = $(this);
// Bỏ qua các node text trống
if ($el.prop('nodeType') !== 1) return;
$el.addClass('fade-reveal').css('animation-delay', (delayMs/1000) + 's');
delayMs += stepMs;
});
}
// Nhận diện lỗi quá tải model (503/overloaded) - phạm vi toàn cục
function isOverloadedMessage(msg) {
if (!msg) return false;
const s = String(msg).toLowerCase();
return s.includes('overloaded') || s.includes('unavailable') || s.includes('503');
}
// Nhận diện lỗi 500 (Internal Server Error) từ Gemini
function isError500Message(msg, httpStatus) {
if (httpStatus === 500) return true;
if (!msg) return false;
const s = String(msg).toLowerCase();
return s.includes('http error 500') || s.includes('internal') || s.includes('500:');
}
// Hàm hiển thị lỗi 500 với countdown 30s và tự động retry
function showError500WithCountdown(address, vbID, errorMsg, callback) {
let countdown = 30;
// Clear timer cũ nếu có
if (countdownTimerId) {
clearInterval(countdownTimerId);
countdownTimerId = null;
}
const updateCountdownUI = function() {
$('#phanTichPanelBody').removeClass('thinking-mode').html(`
Lỗi từ A.I!
${escapeHtml(errorMsg)}
Hệ thống sẽ tự động thử lại sau ${countdown} giây...
Thử lại ngay
`);
};
updateCountdownUI();
// Hàm thực hiện retry
const doRetry = function() {
if (countdownTimerId) {
clearInterval(countdownTimerId);
countdownTimerId = null;
}
// Reset state và mở lại panel phân tích
isAnalyzing = true;
if (currentAnalyzingBadge) {
currentAnalyzingBadge.text('Đang phân tích...').addClass('analyzing');
}
// Hiển thị lại giao diện thinking
$('#phanTichPanelBody').addClass('thinking-mode').html('');
stopThinkingTyping();
startThinkingTyping(address);
// Gọi lại API
callPhanTichAPI(address, vbID, callback, 1);
};
// Countdown interval
countdownTimerId = setInterval(function() {
countdown--;
if (countdown <= 0) {
clearInterval(countdownTimerId);
countdownTimerId = null;
doRetry();
return;
}
// Update UI
$('#countdownNumber').text(countdown);
$('#countdownProgress').css('width', ((countdown/30)*100) + '%');
}, 1000);
// Bind nút "Thử lại ngay"
$(document).off('click.retryNowPhanTich').on('click.retryNowPhanTich', '#btnRetryNowPhanTich', function() {
doRetry();
});
}
function openPhanTichModal(address, vbID) {
// Tạo modal nếu chưa có
if ($('#modalPhanTich').length === 0) {
const modalHTML = `
Đang phân tích...
Đang phân tích...
`;
$('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 với retry tối đa 50 lần khi quá tải
(function requestModal(attempt) {
attempt = attempt || 1;
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,
member_ID: memberID
}),
success: function(response) {
if (response && response.ok) {
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) + ' ';
html += '
';
html += '' + markdownToHtml(response.phan_tich) + '
';
html += '';
html += 'Nội dung phân tích này chỉ mang tính chất tham khảo, để hiểu rõ hơn, quý khách nên tham vấn ý kiến luật sư và các chuyên gia pháp lý có chuyên môn để được hỗ trợ cụ thể cho trường hợp của mình.';
html += '
';
$('#modalPhanTichBody').html(html);
} else {
const msg = response && response.error ? response.error : '';
if (isOverloadedMessage(msg) && attempt < 50) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function(){ requestModal(attempt + 1); }, delay);
return;
}
if (isOverloadedMessage(msg)) {
$('#modalPhanTichBody').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainModal').on('click.tryAgainModal', '#btnTryAgainModal', function(){
openPhanTichModal(address, vbID);
});
} else {
$('#modalPhanTichBody').html(`
Lỗi! ${escapeHtml(msg || 'Không thể phân tích điều luật.')}
Vui lòng thử lại sau.
`);
}
}
},
error: function(xhr, status, error) {
let errorMsg = error;
if (xhr.responseJSON && xhr.responseJSON.error) {
errorMsg = (xhr.responseJSON.error.message || xhr.responseJSON.error) || errorMsg;
} else if (xhr.responseText) {
errorMsg = xhr.responseText;
}
if ((xhr.status === 503 || isOverloadedMessage(errorMsg)) && attempt < 50) {
const delay = Math.min(1200 + attempt * 100, 5000);
setTimeout(function(){ requestModal(attempt + 1); }, delay);
return;
}
if (xhr.status === 503 || isOverloadedMessage(errorMsg)) {
$('#modalPhanTichBody').html(`
Hiện tại A.I đang bị quá tải , vui lòng thử lại sau ít phút!
Thử lại
`);
$(document).off('click.tryAgainModal').on('click.tryAgainModal', '#btnTryAgainModal', function(){
openPhanTichModal(address, vbID);
});
} else {
$('#modalPhanTichBody').html(`
Lỗi! Không thể kết nối đến server phân tích.
Chi tiết: ${escapeHtml(errorMsg)}
`);
}
}
});
})(1);
}
// 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) {
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 + 8) + 'px',
left: (offset.left + $parent.outerWidth() - badgeWidth - scrollLeft - 4) + 'px' // -5px padding
});
$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;
// Dùng mousemove để track chính xác element nào đang được hover (hiển thị ngay lập tức)
$(document).on('mousemove', '#tab_noi_dung_vb', function(e) {
// Bỏ logic ẩn badge khi hover vào tnpl - bây giờ badge luôn hiển thị
// Badge "Phân tích" sẽ luôn hiện kể cả khi di chuột vào tnpl
// Tìm element gần nhất (phan, chuong, muc, tieumuc, 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;
}
// Element thay đổi → xử lý ngay lập tức (không debounce)
// 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 extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
const $badge = $('');
$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;
});
// Event delegation cho hover ra khỏi #tab_noi_dung_vb
$(document).on('mouseleave', '#tab_noi_dung_vb', function(e) {
// Nếu di chuột sang menu button thì KHÔNG clear currentHoveredElement
if (e.relatedTarget && $(e.relatedTarget).closest('.menu-button-phan-tich').length > 0) {
return;
}
// 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'});
}
});
}
}, 3);
});
// 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');
// Nếu di chuột sang menu button của chính nó thì KHÔNG xử lý mouseleave
if (e.relatedTarget && $(e.relatedTarget).closest('.menu-button-phan-tich[data-for="' + parentAddress + '"]').length > 0) {
return;
}
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')) {
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);
}
}, 3); // 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')) {
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);
}
}, 3);
});
// 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(), 3);
}
});
// Event delegation cho click badge → mở panel
$(document).on('click', '.badge-phan-tich, .badge-phan-tich-container, .badge-phan-tich-fixed', function(e) {
const $badge = $(this);
// Nếu là khách (chưa đăng nhập) sau thời điểm mở khóa → mở modal đăng nhập/mua gói
if (typeof memberID !== 'undefined' && memberID !== 4 && !isVIP) {
e.preventDefault();
e.stopPropagation();
openModal(this, '/ajax/member/m-register/new/1');
return;
}
// Thành viên → mở panel phân tích
e.preventDefault();
e.stopPropagation();
// Nếu badge đang analyzing thì không cho click
if ($badge.hasClass('analyzing') || $badge.data('analyzing')) {
return;
}
// Lấy address từ data-for attribute
const address = $badge.attr('data-for');
if (address && vbID) {
openPhanTichPanel(address, vbID);
} else {
showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!');
}
});
// Xử lý click vào CTTD/DCTD
// Xử lý click vào badge "Hướng dẫn" (.huong-dan-badge) hoặc "Viện dẫn" (.vien-dan-badge) -> coi như click vào CTTD
$(document).on('click', '.huong-dan-badge, .vien-dan-badge', function(e) {
e.preventDefault();
e.stopPropagation();
// Khách (non-VIP): mở modal đăng ký/mua gói cước
if (typeof memberID !== 'undefined' && memberID !== 4 && !isVIP) {
openModal(this, '/ajax/member/m-register/new/1');
return false;
}
var $el = $(this);
// 1. Tìm trong container gần nhất
var $cttd = $el.closest('p, div, li, td, .list-item').find('cttd, dctk, dctd, .chuthichtudong').first();
// 2. Nếu không thấy, tìm trong các sibling
if ($cttd.length === 0) {
$cttd = $el.siblings('cttd, dctk, dctd, .chuthichtudong').first();
}
// 3. Nếu vẫn không thấy, thử tìm ở paragraph liền trước (trường hợp badge nằm ở dòng sau)
if ($cttd.length === 0) {
$cttd = $el.closest('p, div').prev().find('cttd, dctk, dctd, .chuthichtudong').last();
}
if ($cttd.length > 0) {
// Ưu tiên click vào span bên trong nếu có (cho desktop handler trong dan.chieu.buble.v.3.php)
var $span = $cttd.find('span').first();
if ($span.length > 0) {
$span[0].click();
} else {
// Fallback click vào chính thẻ đó (cho mobile hoặc nếu không có span)
$cttd[0].click();
}
} else {
console.warn('Không tìm thấy thẻ CTTD tương ứng cho badge hướng dẫn/viện dẫn');
}
});
$(document).on('click', 'cttd, dctk, dctd, .chuthichtudong', function(e) {
// Khách (non-VIP): mở modal đăng ký
if (typeof memberID !== 'undefined' && memberID !== 4 && !isVIP) {
e.preventDefault();
e.stopImmediatePropagation();
openModal(this, '/ajax/member/m-register/new/1');
return false;
}
// VIP: Đảm bảo các thuộc tính kích hoạt modal có sẵn
var $this = $(this);
if (!$this.attr('data-toggle')) {
$this.attr('data-toggle', 'modal');
$this.attr('data-target', '#ct_modal');
}
// Force mở modal #ct_modal an toàn (Logic từ fallback cũ)
var $ctModal = $('#ct_modal');
if ($ctModal.length > 0) {
if (typeof $ctModal.modal === 'function') {
$ctModal.modal('show');
} else if (window.jQuery && typeof window.jQuery('#ct_modal').modal === 'function') {
window.jQuery('#ct_modal').modal('show');
} else {
// Fallback load bootstrap if missing
console.warn('Bootstrap modal not loaded. Attempting to load local fallback...');
var loadBootstrap = function() {
$.getScript('/libs/jquery/bootstrap/dist/js/bootstrap.js', function() {
if (typeof $('#ct_modal').modal === 'function') {
$('#ct_modal').modal('show');
} else if (window.jQuery && typeof window.jQuery('#ct_modal').modal === 'function') {
window.jQuery('#ct_modal').modal('show');
}
});
};
if (typeof window.Tether === 'undefined') {
$.getScript('https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js', loadBootstrap);
} else {
loadBootstrap();
}
}
}
});
// Ẩn badge khi click vào CTTD
$(document).on('click', 'cttd.chuthichtudong span, dctk span, dctd span', function(e) {
// Ẩ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'});
}
});
});
// 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);
// Function để update vị trí nút 3 chấm (fixed position) - exposed globally
window.updateMenuButtonPositions = function() {
if (!isTouch) return; // Chỉ chạy trên touch device
$('.menu-button-phan-tich').each(function() {
const $menuButton = $(this);
const address = $menuButton.attr('data-for');
const $parent = $('[address="' + address + '"]').first();
if ($parent.length > 0) {
const parentOffset = $parent.offset();
const parentWidth = $parent.outerWidth();
const parentHeight = $parent.outerHeight();
const scrollTop = $(window).scrollTop();
const windowHeight = $(window).innerHeight();
const viewportTop = scrollTop;
const viewportBottom = scrollTop + windowHeight;
// Kiểm tra parent có trong viewport không
const parentTop = parentOffset.top;
const parentBottom = parentOffset.top + parentHeight;
const inViewport = (parentBottom > viewportTop && parentTop < viewportBottom);
if (inViewport) {
const scrollLeft = $(window).scrollLeft();
// Tính vị trí: góc phải của parent element
// Canh chỉnh top để tâm của nút 3 chấm (cao ~36px) ngang hàng với tâm của badge (cao ~21px, top 8px)
// Badge center: 8 + 10.5 = 18.5px
// Button center: Top + 18px
// => Top = 18.5 - 18 = 0.5px -> Lấy tròn 1px
const topOffset = 3;
topPosition = parentOffset.top - scrollTop + topOffset;
// Left = left của parent + width của parent - khoảng 30px (chiều rộng icon + padding)
// Để nút nằm bên trong parent, góc phải
// Trừ scrollLeft vì position: fixed tính theo viewport
const leftPosition = parentOffset.left + parentWidth - 2 - scrollLeft;
$menuButton.css({
top: topPosition + 'px',
left: leftPosition + 'px',
right: 'auto', // Reset right
display: 'block'
});
} else {
// Ẩn nếu parent không trong viewport
$menuButton.css({display: 'none'});
}
}
});
};
// Highlight parent khi hover/touch vào nút 3 chấm
$(document).on('mouseenter touchstart', '.menu-button-phan-tich', function() {
const address = $(this).attr('data-for');
const $parent = $('[address="' + address + '"]').first();
if ($parent.length) {
$parent.addClass('highlight-border');
$parent.data('hovering', true); // Mark as hovering
currentHoveredElement = $parent; // Update global tracker
// Attach badge nếu chưa có (logic tương tự như khi hover vào parent)
if ($parent.find('.badge-phan-tich-container[data-for="' + address + '"]').length === 0) {
const parentType = getParentTypeName($parent.prop('tagName').toLowerCase());
const extraClass = (unlockAllPhanTich && memberID <= 0) ? ' upgrade-require' : '';
const $badge = $('');
$parent.append($badge);
$parent.addClass('has-phan-tich-badge');
}
// Show badge tương ứng
if (typeof showPhanTichBadgeForParent === 'function') {
showPhanTichBadgeForParent($parent);
}
}
});
$(document).on('mouseleave touchend', '.menu-button-phan-tich', function(e) {
const address = $(this).attr('data-for');
const $parent = $('[address="' + address + '"]').first();
// Nếu di chuột sang parent thì không remove highlight
if (e.relatedTarget && $(e.relatedTarget).closest('[address="' + address + '"]').length > 0) {
return;
}
// Nếu di chuột ra ngoài hoàn toàn (không vào parent)
currentHoveredElement = null;
if ($parent.length) {
$parent.removeClass('highlight-border');
$parent.data('hovering', false);
// Hide badge
if (typeof hidePhanTichBadgeForParent === 'function') {
hidePhanTichBadgeForParent($parent);
}
}
});
// ===== Event handlers cho touch device =====
if (isTouch) {
// Update positions khi scroll hoặc resize
$(window).on('scroll resize', function() {
window.updateMenuButtonPositions();
});
// Initial update
setTimeout(window.updateMenuButtonPositions, 500);
// Xử lý click nút Phân tích (badge hoặc dropdown item)
$(document).on('click', '.badge-phan-tich, .dropdown-item-phan-tich[data-action="analyze"]', function(e) {
e.preventDefault();
e.stopPropagation();
if (typeof memberID !== 'undefined' && memberID !== 4 && !isVIP) {
openModal(this, '/ajax/member/m-register/new/1');
return;
}
const $btn = $(this);
let address = $btn.attr('data-for');
// Nếu click từ dropdown item, cần lấy address từ parent menu button
if (!address) {
const $menuBtn = $btn.closest('.menu-button-phan-tich');
address = $menuBtn.attr('data-for');
}
if (address) {
// Đóng dropdown menu nếu đang mở (trên mobile)
if (currentOpenDropdown) {
currentOpenDropdown.removeClass('show');
currentOpenDropdown = null;
}
openPhanTichPanel(address, vbID);
}
});
// Click vào nút 3 chấm -> mở panel phân tích luôn (không cần dropdown)
$(document).on('click', '.btn-three-dots', function(e) {
e.preventDefault();
e.stopPropagation();
const $button = $(this);
const $menuContainer = $button.closest('.menu-button-phan-tich');
const address = $menuContainer.attr('data-for');
// Kiểm tra nếu là khách (chưa đăng nhập)
if (unlockAllPhanTich && memberID <= 0) {
if (!$menuContainer.hasClass('upgrade-require')) {
$menuContainer.addClass('upgrade-require');
}
// Trigger event để modal.content.php bắt và mở modal đăng nhập
$menuContainer.trigger('click');
return;
}
// Thành viên -> mở panel phân tích trực tiếp
if (address && vbID) {
openPhanTichPanel(address, vbID);
} else {
showWarningModal('Không tìm thấy địa chỉ điều luật hoặc ID văn bản!');
}
});
// Update positions khi scroll hoặc resize
$(window).on('scroll resize', function() {
window.updateMenuButtonPositions();
});
}
}
});
Tra cứu thuật ngữ với từ hoặc cụm từ đã chọn?
×
Quyết định 1454/QĐ-UBND năm 2023 thực hiện Quyết định 05/QĐ-TTg về phê duyệt Chiến lược phát triển Ngân hàng Chính sách xã hội đến năm 2030 do tỉnh Bắc Kạn ban hành