Hệ thống pháp luật

BỘ GIAO THÔNG VẬN TẢI
-------

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

Số: 44/VBHN-BGTVT

Hà Nội, ngày 02 tháng 8 năm 2023

 

THÔNG TƯ

QUY ĐỊNH VỀ VIỆC BỒI THƯỜNG ỨNG TRƯỚC KHÔNG HOÀN LẠI TRONG VẬN CHUYỂN HÀNH KHÁCH BẰNG ĐƯỜNG HÀNG KHÔNG

Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không, có hiệu lực kể từ ngày 01 tháng 7 năm 2015, được sửa đổi, bổ sung bởi:

1. Thông tư số 27/2017/TT-BGTVT ngày 25 tháng 8 năm 2017 sửa đổi, bổ sung một số điều của Thông tư số 36/2014/TT-BGTVT ngày 29 tháng 8 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định chất lượng dịch vụ hành khách tại cảng hàng không và Thông tư số 14/2015/TT-BGTVT ngày 27/4/2015 của Bộ trưởng Bộ Giao thông vận tải quy định việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không, có hiệu lực kể từ ngày 01 tháng 11 năm 2017;

2. Thông tư số 21/2020/TT-BGTVT ngày 28 tháng 9 năm 2020 sửa đổi, bổ sung một số điều của Thông tư số 81/2014/TT-BGTVT ngày 30 tháng 12 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định về việc vận chuyển hàng không và hoạt động hàng không chung, Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không và Thông tư số 33/2016/TT-BGTVT ngày 15 tháng 11 năm 2016 của Bộ trưởng Bộ Giao thông vận tải quy định về việc báo cáo hoạt động và báo cáo số liệu trong ngành hàng không dân dụng Việt Nam, có hiệu lực kể từ ngày 15 tháng 11 năm 2020;

3. Thông tư số 19/2023/TT-BGTVT ngày 30 tháng 6 năm 2023 sửa đổi, bổ sung, bãi bỏ một số điều của các Thông tư quy định liên quan đến vận tải hàng không, có hiệu lực kể từ này 01 tháng 9 năm 2023.

Căn cứ Luật Hàng không dân dụng Việt Nam số 66/2006/QH11; Luật sửa đổi, bổ sung Luật Hàng không dân dụng Việt Nam số 61/2014/QH13;

Căn cứ Nghị định số 107/2012/NĐ-CP ngày 20 tháng 12 năm 2012 của Chính phủ quy định chức năng, nhiệm vụ, quyền hạn và cơ cấu tổ chức của Bộ Giao thông vận tải;

Theo đề nghị của Vụ trưởng Vụ Pháp chế và Cục trưởng Cục Hàng không Việt Nam,

Bộ trưởng Bộ Giao thông vận tải ban hành Thông tư quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng khôngChương I

QUY ĐỊNH CHUNG

Điều 1. Phạm vi điều chỉnh và đối tượng áp dụng

1. Thông tư này quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không tại Việt Nam đối với trường hợp hành khách đã được xác nhận chỗ trên chuyến bay nhưng bị từ chối vận chuyển hoặc chuyến bay bị hủy hoặc chuyến bay bị chậm kéo dài do lỗi của người vận chuyển.

2. Thông tư này áp dụng đối với các tổ chức, cá nhân có liên quan đến việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không tại Việt Nam.

Điều 2 Giải thích từ ngữ1. Bồi thường ứng trước không hoàn lại là việc bồi thường bằng tiền hoặc bằng các hình thức phù hợp khác mà người vận chuyển phải trả cho hành khách trong các trường hợp theo quy định của pháp luật không phụ thuộc vào việc xác định mức thiệt hại thực tế của hành khách.

2. Hành khách bị từ chối vận chuyển là hành khách đã có vé và đã được xác nhận chỗ trên chuyến bay nhưng bị người vận chuyển từ chối vận chuyển.

3. Thời gian khởi hành thực tế (Actual Off Block Time-AOBT) là thời gian thực tế tàu bay được đẩy hoặc bắt đầu di chuyển khỏi vị trí đỗ.

4. Chuyến bay bị chậm kéo dài là chuyến bay có thời gian khởi hành thực tế muộn trên 4 tiếng so với thời gian khởi hành theo kế hoạch trong lịch bay căn cứ.

5. Người vận chuyển là hãng hàng không khai thác thực tế các chuyến bay.

6. Xác nhận chỗ là việc người vận chuyển xác nhận hành khách đã có chỗ trên chuyến bay.

7. Lịch bay căn cứ là lịch bay của hãng hàng không được cập nhật đến thời điểm 22 giờ (giờ Hà Nội) vào hệ thống dữ liệu của Người khai thác cảng hàng không của ngày hôm trước ngày dự kiến khai thác.

Điều 3. Nguyên tắc thực hiện

1. Việc bồi thường ứng trước không hoàn lại được thực hiện cho các chuyến bay xuất phát từ Việt Nam trong trường hợp hành khách bị từ chối vận chuyển, bị hủy chuyến bay, chuyến bay bị chậm kéo dài.

2. Việc thực hiện nghĩa vụ bồi thường ứng trước không hoàn lại không ảnh hưởng đến việc thực hiện các nghĩa vụ khác của người vận chuyển khi vận chuyển hành khách theo quy định của pháp luật.

3. Trong trường hợp phải bồi thường thiệt hại theo trách nhiệm dân sự của người vận chuyển thì khoản bồi thường ứng trước không hoàn lại nêu tại Thông tư này được trừ vào khoản tiền bồi thường thiệt hại.

Chương II

NGHĨA VỤ CỦA NGƯỜI VẬN CHUYỂN VÀ QUYỀN CỦA HÀNH KHÁCH

Điều 4. Nghĩa vụ của người vận chuyển1. Bồi thường ứng trước không hoàn lại cho hành khách có vé và đã được xác nhận chỗ trên chuyến bay với mức quy định tại Điều 8 của Thông tư này trong trường hợp từ chối vận chuyển hoặc hủy chuyến bay hoặc chuyến bay bị chậm kéo dài, trừ các trường hợp được miễn trách nhiệm quy định tại Điều 5, Điều 6, Điều 7 của Thông tư này.

2. Công bố công khai trên Trang thông tin điện tử của người vận chuyển, tại cảng hàng không, văn phòng đại diện, văn phòng bán vé và hệ thống đại lý bán vé của người vận chuyển về các trường hợp được bồi thường ứng trước không hoàn lại, mức bồi thường, chi tiết phương thức và thời hạn bồi thường, địa chỉ cụ thể thực hiện việc bồi thường.

3. Cung cấp thông tin cho Cảng vụ hàng không, doanh nghiệp cảng hàng không, doanh nghiệp cung cấp dịch vụ nhà ga hành khách về nguyên nhân hủy chuyến bay, chuyến bay bị chậm kéo dài ngay sau khi có quyết định hủy hoặc sau khi xác định chuyến bay bị chậm kéo dài để thực hiện việc giám sát, cập nhật lên hệ thống thông tin của cảng hàng không, sân bay.

4. Trong vòng 72 giờ kể từ thời điểm chuyến bay dự kiến khởi hànha) Tên báo cáo: Báo cáo về việc bồi thường ứng trước không hoàn lại đối với hành khách bị từ chối vận chuyển, hủy chuyến bay;

b) Nội dung báo cáo: thông tin về chuyến bay của hãng hàng không; thông tin hành khách bị từ chối vận chuyển, bị hủy chuyến bay và giải pháp xử lý của hãng hàng không;

c) Phương thức gửi, nhận báo cáo: báo cáo bằng hình thức văn bản giấy hoặc văn bản điện tử được gửi trực tiếp, qua dịch vụ bưu chính, fax hoặc các hình thức phù hợp khác theo quy định của pháp luật;

d) Mẫu đề cương báo cáo: theo quy định tại Phụ lục I ban hành kèm theo Thông tư này.

5. Tiếp nhận và giải quyết kịp thời khiếu nại của hành khách bị từ chối vận chuyển, bị hủy chuyến hoặc bị chậm kéo dài.

6. Ghi nhận địa chỉ liên hệ được hành khách cung cấp như: số điện thoại di động, số điện thoại cố định, thư điện tử hoặc số điện thoại của người thân trong trường hợp không liên lạc được trực tiếp để cung cấp các thông tin về tình hình hủy chuyến, chuyến bay bị chậm kéo dài trước 24 giờ so với giờ khởi hànhĐiều 5. Miễn trừ nghĩa vụ của người vận chuyển trong trường hợp từ chối vận chuyển

Người vận chuyển được miễn trừ nghĩa vụ bồi thường ứng trước không hoàn lại trong các trường hợp từ chối vận chuyển hành khách có vé và đã được xác nhận chỗ trên chuyến bay hoặc đang trong hành trình theo quy định tại Điều 146 Luật Hàng không dân dụng Việt Nam, cụ thể như sau:

1. Do tình trạng sức khỏe của hành khách mà người vận chuyển nhận thấy việc vận chuyển hoặc vận chuyển tiếp sẽ gây nguy hại cho hành khách đó, cho những người khác trong tàu bay hoặc gây nguy hại cho chuyến bay.

2. Để ngăn ngừa lây lan dịch bệnh.

3. Hành khách không chấp hành quy định về bảo đảm an toàn hàng không, an ninh hàng không, khai thác vận chuyển hàng không, xử phạt vi phạm hành chính về hàng không dân dụng.

4. Hành khách có hành vi làm mất trật tự công cộng, uy hiếp an toàn bay hoặc gây ảnh hưởng đến tính mạng, sức khỏe, tài sản của người khác.

5. Hành khách trong tình trạng say rượu, bia hoặc các chất kích thích khác mà không làm chủ được hành vi.

6. Vì lý do an ninh được cơ quan có thẩm quyền thông báo.

7. Theo yêu cầu của cơ quan nhà nước có thẩm quyền.

Điều 6. Miễn trừ nghĩa vụ của người vận chuyển trong trường hợp hủy chuyến bay hoặc chuyến bay bị chậm kéo dài

Người vận chuyển được miễn trừ nghĩa vụ bồi thường ứng trước không hoàn lại trong trường hợp hủy chuyến bay hoặc chuyến bay bị chậm kéo dài vì một trong các lý do sau đây:

1. Điều kiện thời tiết ảnh hưởng đến khai thác an toàn chuyến bay.

2. Nguy cơ an ninh ảnh hưởng đến khai thác an toàn chuyến bay.

3. Chuyến bay không thể thực hiện hoặc bị chậm kéo dài theo quyết định của cơ quan nhà nước có thẩm quyền.

4. Do những vấn đề về y tế của hành khách (bị ốm nặng hoặc chết sau khi đã lên tàu bay).

5. Tàu bay theo lịch dự kiến để khai thác chuyến bay bị phá hoại hoặc đội tàu bay bị phá hoại.

6. Do xung đột vũ trang, mất ổn định chính trị, đình công làm ảnh hưởng đến chuyến bay.

7. Trong trường hợp kết cấu hạ tầng hàng không, dịch vụ bảo đảm hoạt động bay không đảm bảo cho việc thực hiện chuyến bay.

8. Sự cố kỹ thuật xảy ra trong quá trình khai thác tàu bay, tính từ thời điểm người chỉ huy tàu bay ký tiếp nhận tàu bay sẵn sàng thực hiện chuyến bay cho đến khi kết thúc chuyến bay.

9. Hành khách được bố trí hành trình tới điểm đến theo kế hoạch bằng chuyến bay khác với thời gian đến không quá 4 giờ so với thời gian đến dự kiến của chuyến bay đã được xác nhận chỗ.

10. Hành khách được bố trí tới điểm đến của hành trình với thời gian đến không quá 6 giờ so với thời gian đến dự kiến của chuyến bay nối chuyến trong trường hợp điểm đến theo kế hoạch của chuyến bay là điểm nối chuyến trong hành trình của hành khách.

11. Các trường hợp bất khả kháng khác.

Điều 7. Miễn trừ nghĩa vụ của người vận chuyển trong các trường hợp khác

1. Người vận chuyển được miễn trừ nghĩa vụ bồi thường ứng trước không hoàn lại cho hành khách nếu người vận chuyển chứng minh được một trong các trường hợp sau:

a) Đã thông báo bằng lời nói, tin nhắn, thư điện tử cho hành khách về việc hủy chuyến bay, chuyến bay bị chậm kéo dài ít nhất 24 giờ trước giờ khởi hành dự kiến theo địa chỉ nêu tại khoản 7 Điều 4 của Thông tư này; trường hợp thực hiện cuộc gọi bằng điện thoại, phải thực hiện cuộc gọi trong vòng 7h đến 22h với tần suất là 02 cuộc, cách nhau 20 phút nếu cuộc gọi đầu tiên không liên hệ được;

b) Hành khách không đăng ký thông tin liên lạc theo quy định;

c) Không liên hệ được với hành khách theo thông tin liên lạc đã đăng ký.

2.3. Người vận chuyển được miễn trừ nghĩa vụ trả tiền bồi thường ứng trước không hoàn lại trong trường hợp hành khách không có mặt làm thủ tục hàng không tại cảng hàng không hoặc địa điểm khác theo thỏa thuận với người vận chuyển.

4. Người vận chuyển được miễn trừ nghĩa vụ trả tiền bồi thường ứng trước không hoàn lại trong trường hợp hành khách tự nguyện từ bỏ xác nhận.

Điều 8. Mức bồi thường ứng trước không hoàn lại

1, Mức bồi thường cho mỗi hành khách đối với chuyến bay nội địa như sau:

a) Chuyến bay có độ dài đường bay dưới 500 km: 200.000 VNĐ;

b) Chuyến bay có độ dài đường bay từ 500 km đến dưới 1.000 km: 300.000 VNĐ;

c) Chuyến bay có độ dài đường bay từ 1.000 km trở lên: 400.000 VNĐ.

2. Mức bồi thường cho mỗi hành khách đối với chuyến bay quốc tế như sau:

a) Chuyến bay có độ dài đường bay dưới 1.000 km: 25 USD;

b) Chuyến bay có độ dài đường bay từ 1.000 km đến dưới 2.500 km: 50 USD;

c) Chuyến bay có độ dài đường bay từ 2.500 km đến dưới 5.000 km: 80 USD;

d) Chuyến bay có độ dài đường bay từ 5.000 km trở lên: 150 USD.

3. Người vận chuyển có thể quy định mức bồi thường ứng trước không hoàn lại nhưng không được thấp hơn mức quy định tại khoản 1 và khoản 2 Điều này.

4.Điều 9. Phương thức và thời hạn bồi thường ứng trước không hoàn lại

1. Người vận chuyển có thể bồi thường ứng trước không hoàn lại cho hành khách bằng các phương thức sau đây:

a) Tiền mặt;

b) Chuyển khoản ngân hàng hoặc thông qua các dịch vụ trung gian thanh toán phù hợp khác trong trường hợp hành khách yêu cầu. Đối với phương thức này, người vận chuyển có nghĩa vụ bồi thường ứng trước không hoàn lại trong vòng 14 ngày làm việc kể từ ngày nhận được yêu cầu của hành khách;

c) Vé miễn cước, chứng từ bồi hoàn để sử dụng tiếp dịch vụ của người vận chuyển hoặc các dịch vụ miễn phí khác trong trường hợp hành khách chấp thuận.

2. Trường hợp hành khách bị từ chối vận chuyển do lỗi người vận chuyển, người vận chuyển có nghĩa vụ bồi thường ngay cho hành khách tại một trong các địa điểm sau đây:

a) Cảng hàng không nơi hành khách bị từ chối vận chuyển;

b) Chi nhánh hoặc văn phòng đại diện được người vận chuyển chỉ định theo thỏa thuận với hành khách trong trường hợp hành khách làm thủ tục tại địa điểm khác ngoài cảng hàng không;

c) Vào tài khoản do hành khách cung cấp trong trường hợp lựa chọn phương thức quy định tại điểm b, khoản 1 Điều này.

3. Trường hợp hủy chuyến bay, người vận chuyển có nghĩa vụ bồi thường cho hành khách:

a) Tại cảng hàng không nơi chuyến bay bị hủy;

b) Tại chi nhánh hoặc văn phòng đại diện của người vận chuyển theo yêu cầu của hành khách hoặc được người vận chuyển chỉ định trong thời hạn 14 ngày làm việc kể từ ngày hủy chuyến bay;

c) Vào tài khoản do hành khách cung cấp trong trường hợp lựa chọn phương thức quy định tại điểm b, khoản 1 Điều này.

4. Trường hợp chuyến bay bị chậm kéo dài, người vận chuyển có nghĩa vụ bồi thường cho hành khách:

a) Tại cảng hàng không nơi chuyến bay khởi hànhb) Tại chi nhánh hoặc văn phòng đại diện của người vận chuyển theo yêu cầu của hành khách hoặc được người vận chuyển chỉ định;

c) Vào tài khoản do hành khách cung cấp trong trường hợp lựa chọn phương thức quy định tại điểm b, khoản 1 Điều này.

Điều 10. Quyền của hành khách

1. Được tiếp nhận thông tin về các nội dung quy định tại khoản 3 Điều 4 của Thông tư này.

2. Được nhận bồi thường ứng trước không hoàn lại từ người vận chuyển theo các phương thức và thời hạn quy định tại Thông tư này.

3. Trong trường hợp hành khách không nhận được khoản bồi thường ứng trước không hoàn lại hoặc mức bồi thường ứng trước không hoàn lại chưa phù hợp với các quy định của Thông tư này, hành khách gửi văn bản đề nghị đến người vận chuyển trong thời hạn 90 ngày kể từ ngày chuyến bay dự kiến khởi hành4. Hành khách có thể khởi kiện người vận chuyển về việc bồi thường thiệt hại theo quy định của pháp luật dân sự nếu không đồng ý với quyết định của người vận chuyển nêu tại khoản 3 Điều này.

Điều 11. Nghĩa vụ của hành khách

1. Cung cấp đầy đủ, chính xác các thông tin quy định tại khoản 7 Điều 4 Thông tư này.

2. Lựa chọn và thông báo cho người vận chuyển biết về phương thức nhận bồi thường ứng trước không hoàn lại.

Chương III

TỔ CHỨC THỰC HIỆN

Điều 12. Trách nhiệm của Cục Hàng không Việt Nam

1. Công bố độ dài đường bay nội địa và quốc tế xuất phát từ Việt Nam làm cơ sở cho việc tính mức tiền bồi thường ứng trước không hoàn lại nêu tại Điều 8 của Thông tư này.

2. Kiểm tra, giám sát, xử lý theo thẩm quyền việc thực hiện các quy định về bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không.

Điều 13. Trách nhiệm của Cảng vụ hàng không1. Niêm yết công khai độ dài đường bay và các quy định của Thông tư này tại cảng hàng không.

2. Kiểm tra, giám sát, xử lý theo thẩm quyền việc thực hiện nghĩa vụ người vận chuyển các trường hợp hành khách bị từ chối vận chuyển, chuyến bay bị hủy, chuyến bay bị chậm kéo dài của người vận chuyển theo quy định tại Thông tư này.

3. Báo cáo định kỳ hàng tháng hoặc đột xuất theo yêu cầu cho Cục Hàng không Việt Nam về việc giám sát việc bồi thường ứng trước không hoàn lại của các hãng hàng không.

Báo cáo định kỳ hàng tháng về việc giám sát việc bồi thường ứng trước không hoàn lại của các hãng hàng không theo các nội dung như sau:

a) Tên báo cáo: Báo cáo giám sát về việc bồi thường ứng trước không hoàn lại của các hãng hàng không;

b) Nội dung báo cáo: thông tin về hãng hàng không, chuyến bay (số hiệu, hành trình), ngày thực hiện chuyến bay, số lượng khách nhận bồi thường, hình thức bồi thường, thông tin hành khách nhận bồi thường, các thông tin khác (nếu có);

c) Phương thức gửi, nhận báo cáo: báo cáo bằng hình thức văn bản giấy hoặc văn bản điện tử được gửi trực tiếp, qua dịch vụ bưu chính, fax hoặc các hình thức phù hợp khác theo quy định của pháp luật;

d) Thời hạn gửi báo cáo: trước ngày 10 của tháng kế tiếp;

đ) Thời gian chốt số liệu báo cáo: từ ngày 01 đến ngày cuối cùng của tháng;

e) Mẫu đề cương báo cáo: theo quy định tại Phụ lục II ban hành kèm theo Thông tư này.

Điều 14. Trách nhiệm của doanh nghiệp cảng hàng không, doanh nghiệp cung cấp dịch vụ nhà ga hành kháchDoanh nghiệp cảng hàng không, doanh nghiệp cung cấp dịch vụ nhà ga hành khách có trách nhiệm cập nhật thông tin chuyến bay bị hủy, bị chậm kéo dài lên hệ thống thông tin của cảng hàng không ngay sau khi nhận được thông tin do người vận chuyển cung cấp theo quy định tại khoản 4 Điều 4 Thông tư này.

Điều 15. Hiệu lực thi hành1. Thông tư này có hiệu lực thi hành kể từ ngày 01 tháng 7 năm 2015.

2. Bãi bỏ Quyết định số 10/2007/QĐ-BGTVT ngày 27 tháng 02 năm 2007 của Bộ trưởng Bộ Giao thông vận tải quyết định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không.

3. Chánh Văn phòng Bộ, Chánh Thanh tra Bộ, các Vụ trưởng, Cục trưởng Cục Hàng không Việt Nam, Thủ trưởng các cơ quan, tổ chức và cá nhân có liên quan chịu trách nhiệm thi hành Thông tư này./.

 


Nơi nhận:
- Bộ trưởng (để b/c);
- Văn phòng Chính phủ (để đăng Công báo);
- Cổng Thông tin điện tử Chính phủ;
- Cổng Thông tin điện tử Bộ GTVT (để đăng tải);
- Lưu: VT, PC (02).

XÁC THỰC VĂN BẢN HỢP NHẤT

KT. BỘ TRƯỞNG
THỨ TRƯỞNG




Lê Anh Tuấn

 

Phụ lục(Ban hành kèm theo Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải)

Tên hãng hàng không
-------

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

 

BÁO CÁO

VIỆC BỒI THƯỜNG ỨNG TRƯỚC KHÔNG HOÀN LẠI ĐỐI VỚI
HÀNH KHÁCH BỊ TỪ CHỐI VẬN CHUYỂN, HỦY CHUYẾN BAY

Kính gửi: Cảng vụ hàng không miền........

Thực hiện quy định tại Điều 4 Thông tư số 14/2015/TT-BGTVT của Bộ trưởng Bộ Giao thông vận tải ngày 27 tháng 4 năm 2015 quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không, hãng hàng không…………. báo cáo Cảng vụ hàng không miền... việc bồi thường ứng trước không hoàn lại đối với hành khách bị từ chối vận chuyển, hủy chuyến bay của chúng tôi như sau:

- Chuyến bay: (số hiệu chuyến bay, hành trình, ngày thực hiện);

- Thông tin hành khách bị từ chối vận chuyển, bị hủy chuyến bay; (danh sách hành khách kèm thông tin liên lạc);

- Phương án xử lý bồi thường;

- Các vấn đề phát sinh (nếu có).

Trân trọng./.

 

Tài liệu gửi kèm theo:

-

-

Ngày     tháng     năm
Người đại diện theo pháp luật
(Ký/đóng dấu)

 

 

Phụ lục II(Ban hành kèm theo Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải)

CẢNG VỤ HÀNG KHÔNG....
-------

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

 

BÁO CÁO

GIÁM SÁT VỀ VIỆC BỒI THƯỜNG ỨNG TRƯỚC KHÔNG HOÀN LẠI CỦA CÁC HÃNG HÀNG KHÔNG

THÁNG mm/yyyy

Kính gửi: Cục Hàng không Việt Nam

Thực hiện quy định tại Điều 13 Thông tư số 14/2015/TT-BGTVT của Bộ trưởng Bộ Giao thông vận tải ngày 27 tháng 4 năm 2015 quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không, Cảng vụ hàng không miền ... báo cáo Cục Hàng không Việt Nam việc bồi thường ứng trước không hoàn lại đối với hành khách bị từ chối vận chuyển, hủy chuyến bay của các hãng hàng không tháng mm/yyyy như sau:

1. Hãng hàng không....:

- Chuyến bay (số hiệu chuyến bay, hành trình, ngày thực hiện); số lượng hành khách bị từ chối vận chuyển, bị hủy chuyến bay (danh sách hành khách kèm thông tin liên lạc); Phương án xử lý bồi thường; Các vấn đề phát sinh (nếu có).

- Chuyến bay....

2. Hãng hàng không ....:

- Chuyến bay (số hiệu chuyến bay, hành trình, ngày thực hiện); số lượng hành khách bị từ chối vận chuyển, bị hủy chuyến bay (danh sách hành khách kèm thông tin liên lạc); Phương án xử lý bồi thường; Các vấn đề phát sinh (nếu có).

- Chuyến bay....

 

Tài liệu gửi kèm theo:

-

-

Ngày      tháng      năm
Người đại diện theo pháp luật
(Ký/đóng dấu)

 

 



“Căn cứ Luật Hàng không dân dụng Việt Nam năm 2006 và Luật sửa đổi, bổ sung một số điều của Luật Hàng không dân dụng năm 2014;

Căn cứ Nghị định số 12/2017/NĐ-CP ngày 10 tháng 02 năm 2017 của Chính phủ quy định chức năng, nhiệm vụ, quyền hạn và cơ cấu tổ chức của Bộ Giao thông vận tải;

Căn cứ Thông tư số 36/2014/TT-BGTVT ngày 29 tháng 8 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định chất lượng dịch vụ hành khách tại cảng hàng không;

Căn cứ Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không;

Theo đề nghị của Vụ trưởng Vụ Vận tải và Cục trưởng Cục Hàng không Việt Nam;

Bộ trưởng Bộ Giao thông vận tải ban hành Thông tư sửa đổi, bổ sung một số điều của Thông tư số 36/2014/TT-BGTVT ngày 29 tháng 8 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định chất lượng dịch vụ hành khách tại cảng hàng không và Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không”.

Thông tư số 21/2020/TT-BGTVT ngày 28 tháng 9 năm 2020 sửa đổi, bổ sung một số điều của Thông tư số 81/2014/TT-BGTVT ngày 30 tháng 12 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định về việc vận chuyển hàng không và hoạt động hàng không chung, Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không và Thông tư số 33/2016/TT-BGTVT ngày 15 tháng 11 năm 2016 của Bộ trưởng Bộ Giao thông vận tải quy định về việc báo cáo hoạt động và báo cáo số liệu trong ngành hàng không dân dụng Việt Nam, có hiệu lực kể từ ngày 15 tháng 11 năm 2020, có căn cứ ban hành như sau:

“Căn cứ Luật Hàng không dân dụng Việt Nam số 66/2006/QH11 ngày 29 tháng 6 năm 2006 và Luật sửa đổi, bổ sung một số điều của Luật Hàng không dân dụng Việt Nam số 61/2014/QH13 ngày 21 tháng 11 năm 2014;

Căn cứ Nghị định số 30/2013/NĐ-CP ngày 08 tháng 4 năm 2013 của Chính phủ về kinh doanh vận chuyển hàng không và hoạt động hàng không chung;

Căn cứ Nghị định số 66/2015/NĐ-CP ngày 12 tháng 8 năm 2015 của Chính phủ quy định về Nhà chức trách hàng không;

Căn cứ Nghị định số 92/2016/NĐ-CP ngày 01 tháng 7 năm 2016 của Chính phủ quy định về ngành nghề kinh doanh có điều kiện trong lĩnh vực hàng không dân dụng;

Căn cứ Nghị định số 12/2017/NĐ-CP ngày 10 tháng 02 năm 2017 của Chính phủ quy định chức năng, nhiệm vụ, quyền hạn và cơ cấu tổ chức của Bộ Giao thông vận tải;

Căn cứ Nghị định số 89/2019/NĐ-CP ngày 15 tháng 11 năm 2019 của Chính phủ sửa đổi, bổ sung một số điều của Nghị định số 92/2016/NĐ-CP ngày 01 tháng 7 năm 2016 của Chính phủ quy định về ngành nghề kinh doanh có điều kiện trong lĩnh vực hàng không dân dụng và Nghị định số 30/2013/NĐ-CP ngày 08 tháng 4 năm 2013 của Chính phủ về kinh doanh vận chuyển hàng không và hoạt động hàng không chung;

Theo đề nghị của Vụ trưởng Vụ Vận tải và Cục trưởng Cục Hàng không Việt Nam,

Bộ trưởng Bộ Giao thông vận tải ban hành Thông tư sửa đổi, bổ sung một số điều của Thông tư số 81/2014/TT-BGTVT ngày 30 tháng 12 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định về việc vận chuyển hàng không và hoạt động hàng không chung (sau đây gọi tắt là Thông tư số 81/2014/TT-BGTVT ngày 30 tháng 12 năm 2014), Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không (sau đây gọi tắt là Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015) và Thông tư số 33/2016/TT-BGTVT ngày 15 tháng 11 năm 2016 của Bộ trưởng Bộ Giao thông vận tải quy định về việc báo cáo hoạt động và báo cáo số liệu trong ngành hàng không dân dụng Việt Nam (sau đây gọi tắt là Thông tư số 33/2016/TT-BGTVT ngày 15 tháng 11 năm 2016).”;

Thông tư số 19/2023/TT-BGTVT ngày 30 tháng 6 năm 2023 sửa đổi, bổ sung, bãi bỏ một số điều của các Thông tư quy định liên quan đến vận tải hàng không, có hiệu lực kể từ ngày 01 tháng 9 năm 2023, có căn cứ ban hành như sau:

“Căn cứ Luật Hàng không dân dụng Việt Nam ngày 29 tháng 6 năm 2006 và Luật sửa đổi, bổ sung một số điều của Luật Hàng không dân dụng Việt Nam ngày 21 tháng 11 năm 2014;

Căn cứ Nghị định số 56/2022/NĐ-CP ngày 24 tháng 8 năm 2022 của Chính phủ quy định chức năng, nhiệm vụ, quyền hạn và cơ cấu tổ chức của Bộ Giao thông vận tải;

Căn cứ Nghị định số 66/2015/NĐ-CP ngày 12 tháng 8 năm 2015 của Chính phủ quy định về Nhà chức trách hàng không;

Theo đề nghị của Vụ trưởng Vụ Vận tải và Cục trưởng Cục Hàng không Việt Nam;

Bộ trưởng Bộ Giao thông vận tải ban hành Thông tư sửa đổi, bổ sung, bãi bỏ một số điều của các Thông tư quy định liên quan đến vận tải hàng không”.

“Điều 3. Tổ chức thực hiện

1. Thông tư này có hiệu lực thi hành kể từ ngày 01 tháng 11 năm 2017.

2. Chánh Văn phòng, Chánh Thanh tra, các Vụ trưởng, Cục trưởng Cục Hàng không Việt Nam, Thủ trưởng các cơ quan, tổ chức và cá nhân có liên quan chịu trách nhiệm thi hành Thông tư này./.”

Điều 4 Thông tư số 21/2020/TT-BGTVT sửa đổi, bổ sung một số điều của Thông tư số 81/2014/TT-BGTVT ngày 30 tháng 12 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định về việc vận chuyển hàng không và hoạt động hàng không chung, Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hàng không và Thông tư số 33/2016/TT-BGTVT ngày 15 tháng 11 năm 2016 của Bộ trưởng Bộ Giao thông vận tải quy định về việc báo cáo hoạt động và báo cáo số liệu trong ngành hàng không dân dụng Việt Nam, có hiệu lực kể từ ngày 15 tháng 11 năm 2020, quy định như sau:

“Điều 4. Điều khoản thi hành

1. Thông tư này có hiệu lực thi hành kể từ ngày 15 tháng 11 năm 2020.

2. Thông tư này bãi bỏ:

a) Thông tư số 52/2018/TT-BGTVT ngày 15 tháng 10 năm 2018 của Bộ trưởng Bộ Giao thông vận tải sửa đổi, bổ sung một số điều của Thông tư số 81/2014/TT-BGTVT ngày 30 tháng 12 năm 2014 quy định về việc vận chuyển hàng không và hoạt động hàng không chung;

b) Khoản 2 Điều 2 Thông tư số 27/2017/TT-BGTVT ngày 25 tháng 8 năm 2017 của Bộ trưởng Bộ Giao thông vận tải sửa đổi, bổ sung một số điều của Thông tư số 36/2014/TT-BGTVT ngày 29 tháng 8 năm 2014 của Bộ trưởng Bộ Giao thông vận tải quy định chất lượng dịch vụ hành khách tại cảng hàng không và Thông tư số 14/2015/TT-BGTVT ngày 27 tháng 4 năm 2015 của Bộ trưởng Bộ Giao thông vận tải quy định về việc bồi thường ứng trước không hoàn lại trong vận chuyển hành khách bằng đường hãng không.

3. Chánh Văn phòng Bộ, Chánh Thanh tra, các Vụ trưởng, Cục trưởng Cục Hàng không Việt Nam, Thủ trưởng các cơ quan, tổ chức và cá nhân có liên quan chịu trách nhiệm thi hành Thông tư này./.”.

Điều 5 Thông tư 19/2023/TT-BGTVT sửa đổi, bổ sung, bãi bỏ một số điều của các Thông tư quy định liên quan về vận tải hàng không, có hiệu lực kể từ ngày 01 tháng 9 năm 2023, quy định như sau:

“Điều 5. Hiệu lực thi hành

1. Thông tư này có hiệu lực thi hành kể từ ngày 01 tháng 9 năm 2023.

2. Hồ sơ đề nghị đăng ký xuất vận đơn hàng không thứ cấp đã gửi đến Cục Hàng không Việt Nam trước ngày Thông tư này có hiệu lực thi hành thì tiếp tục thực hiện theo quy định tại Thông tư số 21/2020/TT-BGTVT.

3. Giấy chứng nhận đăng ký xuất vận đơn hàng không thứ cấp đã được cấp trước ngày Thông tư này có hiệu lực tiếp tục có giá trị đến khi Giấy chứng nhận bị thu hồi.

4. Chánh Văn phòng, Chánh Thanh tra, các Vụ trưởng, Cục trưởng Cục Hàng không Việt Nam, Thủ trưởng cơ quan, tổ chức và cá nhân liên quan chịu trách nhiệm thi hành Thông tư này./.”

lồng nhau (bên trong) hay không const memberID = 0; const vbID = '2adfa1d97b94323f23bbdbdfff8cfd1e'; // 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); } });