/** * VAT Withholding Calculator * For Overseas Chinese Users in Hong Kong and Macao */ (function() { 'use strict'; const VAT_RATES = { 'transportation': { rate: 9, name: 'Transportation, Postal, Telecom Services' }, 'construction': { rate: 9, name: 'Construction & Real Estate' }, 'modern': { rate: 6, name: 'Modern Services (Consulting, IT, etc.)' }, 'financial': { rate: 6, name: 'Financial & Insurance Services' }, 'lifestyle': { rate: 6, name: 'Lifestyle & Cultural Services' }, 'intangible': { rate: 6, name: 'Intangible Assets' }, 'goods': { rate: 13, name: 'Goods / Tangible Assets' }, 'processing': { rate: 13, name: 'Processing, Repair & Replacement' }, 'rental': { rate: 13, name: 'Tangible Asset Leasing' } }; const SURTAX_RATES = { 'urban': { urbanMaintenance: 7, education: 3, localEducation: 2 }, 'county': { urbanMaintenance: 5, education: 3, localEducation: 2 }, 'other': { urbanMaintenance: 1, education: 3, localEducation: 2 } }; const EIT_RATE = 10; function formatCurrency(value) { return new Intl.NumberFormat('zh-CN', { style: 'currency', currency: 'CNY', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value); } function getServiceTypeName(value) { return VAT_RATES[value] ? VAT_RATES[value].name : 'Other Services'; } function getVATRate(value) { return VAT_RATES[value] ? VAT_RATES[value].rate : 6; } function calculateWithholding(params) { const { amount = 0, serviceType = 'modern', locationType = 'urban', hasEstablishment = false, includeEIT = true, eitRate = EIT_RATE } = params; const amountNum = parseFloat(amount) || 0; if (amountNum <= 0) { return null; } const vatRate = getVATRate(serviceType); const surtax = SURTAX_RATES[locationType] || SURTAX_RATES.urban; const vatAmount = amountNum / (1 + vatRate / 100) * (vatRate / 100); const taxInclusiveTotal = amountNum; const vatExclusiveAmount = amountNum - vatAmount; const urbanTax = vatAmount * (surtax.urbanMaintenance / 100); const eduSurcharge = vatAmount * (surtax.education / 100); const localEduSurcharge = vatAmount * (surtax.localEducation / 100); const totalSurtax = urbanTax + eduSurcharge + localEduSurcharge; let eitAmount = 0; if (includeEIT && !hasEstablishment) { eitAmount = vatExclusiveAmount * (eitRate / 100); } const totalTaxes = vatAmount + totalSurtax + eitAmount; const netPayment = taxInclusiveTotal - totalTaxes; return { inputAmount: amountNum, serviceName: getServiceTypeName(serviceType), vatRate: vatRate, vatExclusiveAmount: vatExclusiveAmount, vatAmount: vatAmount, surtaxDetails: { urbanMaintenance: { rate: surtax.urbanMaintenance, amount: urbanTax }, education: { rate: surtax.education, amount: eduSurcharge }, localEducation: { rate: surtax.localEducation, amount: localEduSurcharge } }, totalSurtax: totalSurtax, includeEIT: includeEIT, eitRate: eitRate, eitAmount: eitAmount, totalTaxes: totalTaxes, netPayment: netPayment }; } function setText(id, value) { const el = document.getElementById(id); if (el) el.textContent = value; } function displayResults(result) { const resultBox = document.getElementById('result-box'); if (!resultBox) return; const placeholder = document.getElementById('placeholder-text'); const details = document.getElementById('result-details'); if (placeholder) placeholder.style.display = 'none'; if (details) details.style.display = 'block'; setText('result-service-type', result.serviceName); setText('result-amount', formatCurrency(result.inputAmount)); setText('result-vat-rate', result.vatRate + '%'); setText('result-vat-exclusive', formatCurrency(result.vatExclusiveAmount)); setText('result-vat-amount', formatCurrency(result.vatAmount)); setText('result-urban-rate', result.surtaxDetails.urbanMaintenance.rate + '%'); setText('result-urban-amount', formatCurrency(result.surtaxDetails.urbanMaintenance.amount)); setText('result-edu-rate', result.surtaxDetails.education.rate + '%'); setText('result-edu-amount', formatCurrency(result.surtaxDetails.education.amount)); setText('result-local-edu-rate', result.surtaxDetails.localEducation.rate + '%'); setText('result-local-edu-amount', formatCurrency(result.surtaxDetails.localEducation.amount)); setText('result-total-surtax', formatCurrency(result.totalSurtax)); const eitSection = document.getElementById('eit-section'); if (eitSection) { if (result.includeEIT) { eitSection.style.display = 'block'; setText('result-eit-rate', result.eitRate + '%'); setText('result-eit-amount', formatCurrency(result.eitAmount)); } else { eitSection.style.display = 'none'; } } setText('result-total-taxes', formatCurrency(result.totalTaxes)); setText('result-net-payment', formatCurrency(result.netPayment)); resultBox.classList.add('show'); resultBox.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } function performCalculation() { const form = document.getElementById('vat-calculator-form'); if (!form) return; const formData = new FormData(form); const params = { amount: formData.get('amount'), serviceType: formData.get('service_type'), locationType: formData.get('location_type'), hasEstablishment: formData.get('has_establishment') === 'yes', includeEIT: formData.get('include_eit') === 'yes', eitRate: parseFloat(formData.get('eit_rate')) || EIT_RATE }; const result = calculateWithholding(params); if (!result) { alert('Please enter a valid amount greater than zero.'); return; } displayResults(result); } function initCalculator() { const calculatorForm = document.getElementById('vat-calculator-form'); if (!calculatorForm) return; calculatorForm.addEventListener('submit', function(e) { e.preventDefault(); performCalculation(); }); } function initMobileMenu() { const toggle = document.querySelector('.mobile-toggle'); const navLinks = document.querySelector('.nav-links'); if (toggle && navLinks) { toggle.addEventListener('click', function() { navLinks.classList.toggle('show'); }); } } document.addEventListener('DOMContentLoaded', function() { initCalculator(); initMobileMenu(); window.vatCalculator = { calculate: calculateWithholding, getServiceTypeName: getServiceTypeName, getVATRate: getVATRate, formatCurrency: formatCurrency }; }); })();