nguyenthanhasia's picture
Upload app.py with huggingface_hub
273591e verified
import gradio as gr
from datetime import datetime, timedelta
# Hàm tính thời hiệu khởi kiện
def calculate_statute_of_limitations(start_date, case_type):
if not start_date or not case_type:
return "Vui lòng nhập đầy đủ thông tin"
try:
start = datetime.strptime(start_date, "%Y-%m-%d")
# Thời hiệu theo BLDS 2015
time_limits = {
"Tranh chấp hợp đồng": 3,
"Bồi thường thiệt hại": 3,
"Tranh chấp đất đai": 3,
"Thừa kế - chia di sản (BĐS)": 30,
"Thừa kế - chia di sản (ĐS)": 10,
"Xác nhận quyền thừa kế": 10,
"Tuyên bố giao dịch vô hiệu": 2
}
years = time_limits.get(case_type, 3)
end_date = start + timedelta(days=years*365)
today = datetime.now()
if today > end_date:
return f"""
⚠️ **ĐÃ HẾT THỜI HIỆU**
📅 **Thời hiệu hết hạn:** {end_date.strftime('%d/%m/%Y')}
⏰ **Thời gian:** {years} năm
📋 **Căn cứ pháp lý:** {get_legal_basis(case_type)}
⚖️ **Lưu ý:** Tòa án chỉ áp dụng thời hiệu theo yêu cầu của đương sự (Điều 149 BLDS 2015)
"""
else:
days_left = (end_date - today).days
return f"""
✅ **CÒN THỜI HIỆU**
📅 **Thời hiệu hết hạn:** {end_date.strftime('%d/%m/%Y')}
⏰ **Còn lại:** {days_left} ngày ({years} năm từ ngày phát sinh)
📋 **Căn cứ pháp lý:** {get_legal_basis(case_type)}
⚖️ **Lưu ý:** Thời hiệu được tính từ ngày biết hoặc phải biết quyền bị xâm phạm (Điều 154 BLDS 2015)
"""
except:
return "Lỗi: Vui lòng nhập đúng định dạng ngày"
def get_legal_basis(case_type):
legal_basis = {
"Tranh chấp hợp đồng": "Điều 429 BLDS 2015",
"Bồi thường thiệt hại": "Điều 588 BLDS 2015",
"Tranh chấp đất đai": "Điều 154 BLDS 2015",
"Thừa kế - chia di sản (BĐS)": "Điều 623 BLDS 2015",
"Thừa kế - chia di sản (ĐS)": "Điều 623 BLDS 2015",
"Xác nhận quyền thừa kế": "Điều 623 BLDS 2015",
"Tuyên bố giao dịch vô hiệu": "Điều 132 BLDS 2015"
}
return legal_basis.get(case_type, "Điều 154 BLDS 2015")
# Hàm tính án phí
def calculate_court_fee(asset_value):
if not asset_value or asset_value <= 0:
return "Vui lòng nhập giá trị tài sản hợp lệ"
# Theo Nghị quyết 326/2016/UBTVQH14
if asset_value <= 6000000:
fee = 300000
elif asset_value <= 400000000:
fee = asset_value * 0.05
elif asset_value <= 800000000:
fee = 20000000 + (asset_value - 400000000) * 0.04
elif asset_value <= 2000000000:
fee = 36000000 + (asset_value - 800000000) * 0.03
elif asset_value <= 4000000000:
fee = 72000000 + (asset_value - 2000000000) * 0.02
else:
fee = 112000000 + (asset_value - 4000000000) * 0.001
advance_fee = fee * 0.5 # Tạm ứng 50%
return f"""
💰 **KẾT QUẢ TÍNH ÁN PHÍ**
📊 **Giá trị tài sản:** {asset_value:,.0f} VNĐ
⚖️ **Án phí:** {fee:,.0f} VNĐ
💳 **Tạm ứng án phí:** {advance_fee:,.0f} VNĐ
📋 **Căn cứ pháp lý:** Nghị quyết 326/2016/UBTVQH14
📝 **Ghi chú:** Tạm ứng án phí bằng 50% mức án phí dự tính
"""
# Hàm tính lãi suất chậm trả
def calculate_late_interest(principal, interest_rate, days):
if not all([principal, interest_rate, days]) or any(x <= 0 for x in [principal, interest_rate, days]):
return "Vui lòng nhập đầy đủ thông tin hợp lệ"
if interest_rate > 20:
return "⚠️ Lãi suất không được vượt quá 20%/năm theo Điều 468 BLDS 2015"
# Tính lãi chậm trả
daily_rate = interest_rate / 100 / 365
interest_amount = principal * daily_rate * days
total_amount = principal + interest_amount
return f"""
💰 **KẾT QUẢ TÍNH LÃI CHẬM TRẢ**
💵 **Số tiền gốc:** {principal:,.0f} VNĐ
📈 **Lãi suất:** {interest_rate}%/năm
📅 **Số ngày chậm trả:** {days} ngày
💸 **Tiền lãi chậm trả:** {interest_amount:,.0f} VNĐ
💰 **Tổng số tiền phải trả:** {total_amount:,.0f} VNĐ
📋 **Căn cứ pháp lý:**
- Điều 357 BLDS 2015: Trách nhiệm do chậm thực hiện nghĩa vụ trả tiền
- Điều 468 BLDS 2015: Lãi suất tối đa 20%/năm
📝 **Ghi chú:** Nếu không thỏa thuận lãi suất, áp dụng 10%/năm (50% mức giới hạn)
"""
# Hàm tính thù lao luật sư
def calculate_lawyer_fee(hourly_rate, hours):
if not all([hourly_rate, hours]) or any(x <= 0 for x in [hourly_rate, hours]):
return "Vui lòng nhập đầy đủ thông tin hợp lệ"
max_rate = 702000 # Mức tối đa theo quy định mới
if hourly_rate > max_rate:
return f"⚠️ Thù lao không được vượt quá {max_rate:,.0f} VNĐ/giờ theo quy định hiện hành"
total_fee = hourly_rate * hours
return f"""
💼 **KẾT QUẢ TÍNH THÙ LAO LUẬT SƯ**
💰 **Mức thù lao/giờ:** {hourly_rate:,.0f} VNĐ
⏰ **Số giờ làm việc:** {hours} giờ
💵 **Tổng thù lao:** {total_fee:,.0f} VNĐ
📋 **Căn cứ pháp lý:** Nghị định 73/2024/NĐ-CP
📝 **Ghi chú:**
- Mức lương cơ sở: 2.340.000 VNĐ/tháng (từ 01/7/2024)
- Thù lao tối đa: 702.000 VNĐ/giờ (0,3 lần mức lương cơ sở)
"""
# Tạo giao diện Gradio
with gr.Blocks(
title="Luật Sư Calculator - Công cụ tính toán pháp lý",
theme=gr.themes.Soft(),
css="""
.main-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 30px;
border-radius: 15px;
text-align: center;
margin-bottom: 20px;
}
.feature-card {
background: rgba(102, 126, 234, 0.1);
border-left: 4px solid #667eea;
padding: 15px;
margin: 10px 0;
border-radius: 8px;
}
.step-box {
background: rgba(255, 255, 255, 0.8);
border-radius: 8px;
padding: 15px;
margin: 10px 0;
border-left: 4px solid #667eea;
}
.footer {
text-align: center;
padding: 20px;
color: #666;
border-top: 1px solid #eee;
margin-top: 30px;
}
/* Dark theme support */
.dark .main-header {
background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);
}
.dark .feature-card {
background: rgba(74, 85, 104, 0.3);
border-left-color: #90cdf4;
color: #e2e8f0;
}
.dark .step-box {
background: rgba(45, 55, 72, 0.8);
border-left-color: #90cdf4;
color: #e2e8f0;
}
.dark .footer {
color: #a0aec0;
border-top-color: #4a5568;
}
"""
) as app:
with gr.Column():
gr.HTML("""
<div class="main-header">
<h1>⚖️ Luật Sư Calculator</h1>
<p>Công cụ tính toán pháp lý tổng hợp cho luật sư Việt Nam</p>
</div>
""")
with gr.Tabs():
with gr.Tab("📖 Giới thiệu"):
gr.HTML("""
<div style="padding: 20px;">
<h2>🎯 Tại sao cần công cụ này?</h2>
<div class="feature-card">
<h3>⏱️ Tiết kiệm thời gian:</h3>
<p>Không cần tra cứu và tính toán thủ công</p>
</div>
<div class="feature-card">
<h3>✅ Tránh sai sót:</h3>
<p>Công thức được lập trình theo quy định pháp luật</p>
</div>
<div class="feature-card">
<h3>⚡ Tư vấn chính xác:</h3>
<p>Cung cấp thông tin nhanh chóng cho khách hàng</p>
</div>
<div class="feature-card">
<h3>📱 Miễn phí:</h3>
<p>Sử dụng mọi lúc, mọi nơi</p>
</div>
<h2>🛠️ Tính năng chính</h2>
<div style="display: grid; gap: 15px; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));">
<div style="padding: 15px; background: rgba(40, 167, 69, 0.1); border-radius: 8px;">
<h3>⏰ Tính thời hiệu khởi kiện</h3>
<p>Theo từng loại vụ án: hợp đồng, bất động sản, thừa kế...</p>
</div>
<div style="padding: 15px; background: rgba(255, 193, 7, 0.1); border-radius: 8px;">
<h3>💰 Tính án phí dân sự</h3>
<p>Theo giá trị tài sản tranh chấp, bao gồm tạm ứng</p>
</div>
<div style="padding: 15px; background: rgba(220, 53, 69, 0.1); border-radius: 8px;">
<h3>📈 Tính lãi suất chậm trả</h3>
<p>Theo quy định BLDS 2015, tối đa 20%/năm</p>
</div>
<div style="padding: 15px; background: rgba(111, 66, 193, 0.1); border-radius: 8px;">
<h3>💼 Tính thù lao luật sư</h3>
<p>Theo giờ làm việc, tối đa 702.000 VNĐ/giờ</p>
</div>
</div>
</div>
""")
with gr.Tab("⏰ Thời hiệu khởi kiện"):
with gr.Row():
with gr.Column():
statute_date = gr.Textbox(
label="Ngày phát sinh quyền yêu cầu",
info="Định dạng: YYYY-MM-DD (ví dụ: 2024-01-01)",
placeholder="2024-01-01"
)
case_type = gr.Dropdown(
choices=[
"Tranh chấp hợp đồng",
"Bồi thường thiệt hại",
"Tranh chấp đất đai",
"Thừa kế - chia di sản (BĐS)",
"Thừa kế - chia di sản (ĐS)",
"Xác nhận quyền thừa kế",
"Tuyên bố giao dịch vô hiệu"
],
label="Loại vụ án",
info="Chọn loại vụ án để áp dụng thời hiệu phù hợp"
)
statute_btn = gr.Button("Tính thời hiệu", variant="primary")
with gr.Column():
statute_result = gr.Markdown(label="Kết quả")
statute_btn.click(
fn=calculate_statute_of_limitations,
inputs=[statute_date, case_type],
outputs=statute_result
)
with gr.Tab("💰 Án phí dân sự"):
with gr.Row():
with gr.Column():
asset_value = gr.Number(
label="Giá trị tài sản tranh chấp (VNĐ)",
info="Ví dụ: 500000000"
)
fee_btn = gr.Button("Tính án phí", variant="primary")
with gr.Column():
fee_result = gr.Markdown(label="Kết quả")
fee_btn.click(
fn=calculate_court_fee,
inputs=asset_value,
outputs=fee_result
)
with gr.Tab("📈 Lãi suất chậm trả"):
with gr.Row():
with gr.Column():
principal = gr.Number(
label="Số tiền gốc (VNĐ)",
info="Ví dụ: 100000000"
)
interest_rate = gr.Number(
label="Lãi suất (%/năm)",
info="Tối đa 20%/năm, mặc định 10%/năm"
)
delay_days = gr.Number(
label="Số ngày chậm trả",
info="Ví dụ: 90"
)
interest_btn = gr.Button("Tính lãi chậm trả", variant="primary")
with gr.Column():
interest_result = gr.Markdown(label="Kết quả")
interest_btn.click(
fn=calculate_late_interest,
inputs=[principal, interest_rate, delay_days],
outputs=interest_result
)
with gr.Tab("💼 Thù lao luật sư"):
with gr.Row():
with gr.Column():
hourly_rate = gr.Number(
label="Mức thù lao/giờ (VNĐ)",
info="Tối đa 702.000 VNĐ/giờ"
)
working_hours = gr.Number(
label="Số giờ làm việc",
info="Ví dụ: 20"
)
lawyer_btn = gr.Button("Tính thù lao", variant="primary")
with gr.Column():
lawyer_result = gr.Markdown(label="Kết quả")
lawyer_btn.click(
fn=calculate_lawyer_fee,
inputs=[hourly_rate, working_hours],
outputs=lawyer_result
)
with gr.Tab("📖 Hướng dẫn"):
gr.HTML("""
<div style="padding: 20px;">
<h2>📋 Hướng dẫn sử dụng</h2>
<div style="display: grid; gap: 15px;">
<div style="padding: 15px; border-left: 4px solid #007bff; background: rgba(0, 123, 255, 0.1);" class="step-box">
<h3>Bước 1: Chọn tính năng</h3>
<p>Click vào tab tương ứng với tính năng bạn cần sử dụng</p>
</div>
<div style="padding: 15px; border-left: 4px solid #28a745; background: rgba(40, 167, 69, 0.1);" class="step-box">
<h3>Bước 2: Nhập thông tin</h3>
<p>Điền đầy đủ các thông tin cần thiết vào form</p>
</div>
<div style="padding: 15px; border-left: 4px solid #ffc107; background: rgba(255, 193, 7, 0.1);" class="step-box">
<h3>Bước 3: Tính toán</h3>
<p>Click nút tính toán để xem kết quả</p>
</div>
<div style="padding: 15px; border-left: 4px solid #6f42c1; background: rgba(111, 66, 193, 0.1);" class="step-box">
<h3>Bước 4: Sử dụng kết quả</h3>
<p>Copy kết quả để sử dụng trong công việc</p>
</div>
</div>
<h2>❓ Câu hỏi thường gặp</h2>
<div style="margin: 20px 0;">
<details class="step-box" style="margin: 10px 0; padding: 10px; cursor: pointer;">
<summary style="font-weight: bold;">Kết quả có chính xác không?</summary>
<p style="margin: 10px 0;">Có, công cụ được lập trình dựa trên các quy định pháp luật hiện hành với căn cứ pháp lý cụ thể được ghi rõ trong mỗi kết quả tính toán.</p>
</details>
<details class="step-box" style="margin: 10px 0; padding: 10px; cursor: pointer;">
<summary style="font-weight: bold;">Có cần đăng ký tài khoản?</summary>
<p style="margin: 10px 0;">Không, công cụ hoàn toàn miễn phí và không cần đăng ký.</p>
</details>
<details class="step-box" style="margin: 10px 0; padding: 10px; cursor: pointer;">
<summary style="font-weight: bold;">Dữ liệu có được lưu trữ?</summary>
<p style="margin: 10px 0;">Không, tất cả tính toán được thực hiện trên server và không lưu trữ dữ liệu cá nhân.</p>
</details>
<details class="step-box" style="margin: 10px 0; padding: 10px; cursor: pointer;">
<summary style="font-weight: bold;">Căn cứ pháp lý được cập nhật khi nào?</summary>
<p style="margin: 10px 0;">Công cụ được cập nhật theo các quy định pháp luật mới nhất. Hiện tại áp dụng BLDS 2015, Nghị quyết 326/2016/UBTVQH14 và Nghị định 73/2024/NĐ-CP.</p>
</details>
</div>
</div>
""")
gr.HTML("""
<div class="footer">
<p>© 2024 Luật Sư Calculator - Phát triển bởi AI Assistant cho cộng đồng luật sư Việt Nam</p>
<p>Căn cứ pháp lý: BLDS 2015 | Nghị quyết 326/2016/UBTVQH14 | Nghị định 73/2024/NĐ-CP</p>
</div>
""")
if __name__ == "__main__":
app.launch(server_name="0.0.0.0", server_port=7860)