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()