zenityx's picture
Create app.py
23769a5 verified
raw
history blame
7.34 kB
import gradio as gr
VAT_RATE = 0.07 # อัตรา VAT 7%
WITHHOLD_RATE = 0.03 # อัตราหัก ณ ที่จ่าย 3%
def calculate_price(calculation_type, wht_type, input_amount):
"""
calculation_type: เลือก "Forward" (Base -> Net) หรือ "Reverse" (Net -> Base)
wht_type: เลือก "WHT from Base" หรือ "WHT from Total"
input_amount: จำนวนเงินที่ใส่เข้ามา
"""
# เตรียมตัวแปรผลลัพธ์ (เก็บเป็น dict เพื่อส่งกลับไปแสดง)
result = {
"ราคาเริ่มต้น (Base)": 0.0,
"VAT 7%": 0.0,
"ยอดรวม (รวม VAT)": 0.0,
"หัก ณ ที่จ่าย": 0.0,
"ยอดสุทธิที่ได้รับ (Net)": 0.0
}
# ------------------------------------------------
# 1) กรณีหัก ณ ที่จ่ายจาก "Base"
# ------------------------------------------------
if wht_type == "WHT จากฐาน (Base)":
if calculation_type == "Forward (รู้ Base -> หา Net)":
base = input_amount
vat_amount = base * VAT_RATE
total_with_vat = base + vat_amount
wht_amount = base * WITHHOLD_RATE
net_amount = total_with_vat - wht_amount
result["ราคาเริ่มต้น (Base)"] = base
result["VAT 7%"] = vat_amount
result["ยอดรวม (รวม VAT)"] = total_with_vat
result["หัก ณ ที่จ่าย"] = wht_amount
result["ยอดสุทธิที่ได้รับ (Net)"] = net_amount
elif calculation_type == "Reverse (รู้ Net -> หา Base)":
# Net = base * 1.07 - base * 0.03 = base * 1.04
# base = Net / 1.04
net = input_amount
base = net / (1 + VAT_RATE - WITHHOLD_RATE) # 1.07 - 0.03 = 1.04
vat_amount = base * VAT_RATE
total_with_vat = base + vat_amount
wht_amount = base * WITHHOLD_RATE
result["ราคาเริ่มต้น (Base)"] = base
result["VAT 7%"] = vat_amount
result["ยอดรวม (รวม VAT)"] = total_with_vat
result["หัก ณ ที่จ่าย"] = wht_amount
result["ยอดสุทธิที่ได้รับ (Net)"] = net
# ------------------------------------------------
# 2) กรณีหัก ณ ที่จ่ายจาก "Total (base+VAT)"
# ------------------------------------------------
elif wht_type == "WHT จากยอดรวม (Total)":
if calculation_type == "Forward (รู้ Base -> หา Net)":
base = input_amount
vat_amount = base * VAT_RATE
total_with_vat = base + vat_amount
wht_amount = total_with_vat * WITHHOLD_RATE
net_amount = total_with_vat - wht_amount
result["ราคาเริ่มต้น (Base)"] = base
result["VAT 7%"] = vat_amount
result["ยอดรวม (รวม VAT)"] = total_with_vat
result["หัก ณ ที่จ่าย"] = wht_amount
result["ยอดสุทธิที่ได้รับ (Net)"] = net_amount
elif calculation_type == "Reverse (รู้ Net -> หา Base)":
# Net = (base * (1+VAT_RATE)) - ( (base*(1+VAT_RATE)) * WITHHOLD_RATE )
# Net = (base * (1+VAT_RATE)) * (1 - WITHHOLD_RATE)
# base = Net / [ (1+VAT_RATE)*(1 - WITHHOLD_RATE) ]
net = input_amount
base = net / ((1 + VAT_RATE) * (1 - WITHHOLD_RATE))
vat_amount = base * VAT_RATE
total_with_vat = base + vat_amount
wht_amount = total_with_vat * WITHHOLD_RATE
result["ราคาเริ่มต้น (Base)"] = base
result["VAT 7%"] = vat_amount
result["ยอดรวม (รวม VAT)"] = total_with_vat
result["หัก ณ ที่จ่าย"] = wht_amount
result["ยอดสุทธิที่ได้รับ (Net)"] = net
# จัดรูปแบบเลขให้อ่านง่ายขึ้น (เช่น ปัดทศนิยม 2 ตำแหน่ง)
for k, v in result.items():
result[k] = f"{v:,.2f}"
# สร้างข้อความสรุป หรือจะส่งออกเป็น dict เพื่อให้ Gradio แสดงก็ได้
output_text = (
f"ราคาเริ่มต้น (Base): {result['ราคาเริ่มต้น (Base)']} บาท\n"
f"VAT 7%: {result['VAT 7%']} บาท\n"
f"ยอดรวม (รวม VAT): {result['ยอดรวม (รวม VAT)']} บาท\n"
f"หัก ณ ที่จ่าย: {result['หัก ณ ที่จ่าย']} บาท\n"
f"ยอดสุทธิที่ได้รับ (Net): {result['ยอดสุทธิที่ได้รับ (Net)']} บาท\n"
)
return output_text
# -------------------------------------------------------
# สร้าง UI ด้วย Gradio
# -------------------------------------------------------
with gr.Blocks() as demo:
gr.Markdown(
"""
# โปรแกรมคำนวณราคา (VAT 7% และ หัก ณ ที่จ่าย 3%)
เลือกเงื่อนไขและกรอกตัวเลขเพื่อดูผลการคำนวณได้ทั้งแบบ "เดินหน้า" (รู้ Base -> หา Net)
หรือ "ถอยหลัง" (รู้ Net -> หา Base) และยังเลือกวิธีการคำนวณหัก ณ ที่จ่ายได้
ว่าจะหักจาก "Base" หรือจาก "Total (Base+VAT)"
"""
)
with gr.Box():
calculation_type = gr.Radio(
label="ประเภทการคำนวณ",
choices=["Forward (รู้ Base -> หา Net)", "Reverse (รู้ Net -> หา Base)"],
value="Forward (รู้ Base -> หา Net)"
)
wht_type = gr.Radio(
label="วิธีการหัก ณ ที่จ่าย",
choices=["WHT จากฐาน (Base)", "WHT จากยอดรวม (Total)"],
value="WHT จากฐาน (Base)"
)
input_amount = gr.Number(
label="กรอกจำนวนเงิน (บาท)",
value=6990.00,
precision=2
)
calc_button = gr.Button("คำนวณ")
output_area = gr.Textbox(
label="ผลลัพธ์การคำนวณ",
lines=6
)
calc_button.click(
fn=calculate_price,
inputs=[calculation_type, wht_type, input_amount],
outputs=output_area
)
demo.launch()