<html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Spain vs UK Tax Comparison</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f9f9f9;
color: #333;
}
header {
background-color: white;
border-bottom: 2px solid #ddd;
padding: 10px 20px;
display: flex;
justify-content: space-between;
align-items: center;
font-family: Arial, sans-serif;
}
.branding {
display: flex;
align-items: center;
}
.logo-container {
display: flex;
align-items: center;
font-size: 1.5rem;
font-weight: bold;
}
.logo-text {
background-color: #4cffb5;
padding: 5px 10px;
color: black;
border-radius: 5px 0 0 5px;
}
.logo-highlight {
background-color: #333;
padding: 5px 10px;
color: #4cffb5;
border-radius: 0 5px 5px 0;
}
.nav-links {
margin-left: 20px;
display: flex;
gap: 15px;
}
.nav-links a {
text-decoration: none;
color: black;
font-size: 1rem;
transition: color 0.3s;
}
.nav-links a:hover {
color: #4cffb5;
}
.cta-button {
background-color: #4cffb5;
color: black;
text-decoration: none;
padding: 10px 15px;
font-weight: bold;
border-radius: 5px;
font-size: 1rem;
transition: background-color 0.3s;
}
.cta-button:hover {
background-color: #3ae09d;
}
header h1 {
margin: 0;
font-size: 2rem;
}
.form-container {
max-width: 900px;
margin: 30px auto;
padding: 20px;
background: #fff;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.form-container form {
display: flex;
flex-wrap: wrap;
gap: 20px;
justify-content: center;
align-items: center;
}
.form-container label {
font-size: 1rem;
}
.form-container input[type="number"],
.form-container button {
padding: 10px;
border: 1px solid #ddd;
border-radius: 5px;
font-size: 1rem;
}
.form-container button {
background-color: #2c3e50;
color: #fff;
cursor: pointer;
transition: background-color 0.3s;
}
.form-container button:hover {
background-color: #1a252f;
}
.results-container {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
gap: 20px;
margin: 20px auto;
max-width: 1200px;
}
.box {
background: #fff;
border-radius: 10px;
padding: 20px;
width: calc(50% - 20px);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.box h2 {
font-size: 1.5rem;
color: #2c3e50;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 15px;
}
table th, table td {
border: 1px solid #ddd;
padding: 10px;
text-align: center;
}
table th {
background-color: #f4f4f4;
color: #333;
font-weight: bold;
}
.highlight-section {
max-width: 900px;
margin: 40px auto;
text-align: center;
}
.highlight-section h2 {
font-size: 1.8rem;
margin-bottom: 20px;
color: #2c3e50;
}
.highlight-container {
display: flex;
justify-content: space-around;
gap: 10px;
}
.highlight-box {
border: 2px solid transparent;
border-radius: 10px;
padding: 20px;
width: 200px;
font-size: 1.2rem;
font-weight: bold;
text-align: center;
}
.better-off {
border-color: #4cffb5;
background-color: #4cffb5;
color: green;
}
.worse-off {
border-color: red;
background-color: #fbeaea;
color: red;
}
footer {
background-color: #f9f9f9;
text-align: center;
padding: 20px;
border-top: 2px solid #ddd;
font-size: 0.9rem;
color: #333;
font-family: Arial, sans-serif;
}
</style>
</head>
<body>
<header>
<div class="branding">
<div class="logo-container">
<span class="logo-text">SPAIN vs UK</span>
<span class="logo-highlight">TAX</span>
</div>
</div>
<nav class="nav-links">
<a href="#">Beckham Law</a>
<a href="#">Moving to Spain?</a>
<a href="#">Living in Spain?</a>
</nav>
<a href="#" class="cta-button">Request Free Consultation</a>
</header>
<div class="form-container">
<form id="tax-form">
<label for="salary">Enter Salary (£):</label>
<input type="number" id="salary" placeholder="e.g., 50000" required>
<label>
<input type="checkbox" id="beckham-law">
Apply Beckham Law (Spain)
</label>
<button type="submit">Compare Taxes</button>
</form>
</div>
</div>
<div class="highlight-section">
<h2>Total Tax Difference</h2>
<div id="total-difference" style="font-size: 2rem; font-weight: bold; margin-bottom: 20px;"></div>
<div class="highlight-container">
<div id="highlight-week" class="highlight-box"></div>
<div id="highlight-month" class="highlight-box"></div>
<div id="highlight-year" class="highlight-box"></div>
<div id="highlight-five-years" class="highlight-box"></div>
</div>
<div class="results-container">
<div class="box">
<h2>Spain Tax Breakdown</h2>
<div id="spain-results"></div>
</div>
<div class="box">
<h2>UK Tax Breakdown</h2>
<div id="uk-results"></div>
</div>
</div>
<div class="results-container">
<div class="box" style="width: 100%;">
<h2>Comparison Table</h2>
<div id="comparison-results"></div>
</div>
</div>
</div>
<footer>
<p>© 2024 Compare Tax Spain. All rights reserved.</p>
</footer>
<script>
let euroConversionRate = 1.17; // Default rate (fallback)
async function fetchConversionRate() {
const apiKey = "fca_live_Cw4QAexNPp5N5VKdbPFHq8bdYtcRoigNwCr0Rsg1";
const url = `https://api.freecurrencyapi.com/v1/latest?apikey=${apiKey}¤cies=EUR&base_currency=GBP`;
try {
const response = await fetch(url);
const data = await response.json();
if (data && data.data && data.data.EUR) {
euroConversionRate = data.data.EUR;
console.log("Updated Conversion Rate:", euroConversionRate);
} else {
throw new Error("Invalid response format");
}
} catch (error) {
console.error("Error fetching conversion rate:", error);
}
}
document.addEventListener("DOMContentLoaded", fetchConversionRate);
document.getElementById("tax-form").addEventListener("submit", function (event) {
event.preventDefault();
const salaryGBP = parseFloat(document.getElementById("salary").value);
if (isNaN(salaryGBP) || salaryGBP <= 0) {
alert("Please enter a valid salary.");
return;
}
const salaryEUR = salaryGBP * euroConversionRate;
const applyBeckhamLaw = document.getElementById("beckham-law").checked;
const spainTaxes = calculateSpainTaxes(salaryEUR, applyBeckhamLaw);
const ukTaxes = calculateUKTaxes(salaryGBP);
displayResults("spain-results", spainTaxes, salaryGBP, salaryEUR);
displayResults("uk-results", ukTaxes, salaryGBP, salaryEUR);
displayComparison(spainTaxes, ukTaxes, salaryGBP, salaryEUR, euroConversionRate);
displayHighlights(spainTaxes, ukTaxes, euroConversionRate);
});
function calculateSpainTaxes(incomeEUR, beckhamLaw) {
const taxRates = beckhamLaw ? { incomeTaxRate: 0.24, socialSecurityCap: 4500 } : {
incomeTaxRate: incomeEUR <= 12450 ? 0.19 :
incomeEUR <= 20200 ? 0.24 :
incomeEUR <= 35200 ? 0.3 :
incomeEUR <= 60000 ? 0.37 : 0.45,
socialSecurityRate: 0.0635,
socialSecurityCap: 4500,
};
const socialSecurityTax = Math.min(incomeEUR * (taxRates.socialSecurityRate || 0.0635), taxRates.socialSecurityCap);
const incomeTax = incomeEUR * taxRates.incomeTaxRate;
const totalTax = incomeTax + socialSecurityTax;
const netIncome = incomeEUR - totalTax;
return {
taxableIncome: incomeEUR,
incomeTax: incomeTax,
socialSecurityTax: socialSecurityTax,
totalTax: totalTax,
annualNetIncome: netIncome,
monthlyNetIncome: netIncome / 12,
weeklyNetIncome: netIncome / 52,
};
}
function calculateUKTaxes(incomeGBP) {
const incomeTaxRate = incomeGBP <= 12570 ? 0 :
incomeGBP <= 50270 ? 0.2 :
incomeGBP <= 150000 ? 0.4 : 0.45;
const incomeTax = incomeGBP <= 12570 ? 0 :
incomeGBP <= 50270 ? (incomeGBP - 12570) * 0.2 :
incomeGBP <= 150000 ? (incomeGBP - 50270) * 0.4 + 7540 :
(incomeGBP - 150000) * 0.45 + 7540 + 39892;
const nationalInsuranceRate = incomeGBP <= 12570 ? 0 :
incomeGBP <= 50270 ? 0.12 : 0.02;
const nationalInsurance = incomeGBP <= 50270 ? (incomeGBP - 12570) * 0.12 :
(50270 - 12570) * 0.12 + (incomeGBP - 50270) * 0.02;
const totalTax = incomeTax + nationalInsurance;
const netIncome = incomeGBP - totalTax;
return {
taxableIncome: incomeGBP,
incomeTax: incomeTax,
socialSecurityTax: nationalInsurance,
totalTax: totalTax,
annualNetIncome: netIncome,
monthlyNetIncome: netIncome / 12,
weeklyNetIncome: netIncome / 52,
};
}
function displayResults(containerId, data, salaryGBP, salaryEUR) {
const container = document.getElementById(containerId);
container.innerHTML = `
<table>
<thead>
<tr>
<th>Concept</th>
<th>Amount (GBP)</th>
<th>Amount (EUR)</th>
</tr>
</thead>
<tbody>
<tr><td>Taxable Income</td><td>£${salaryGBP.toFixed(2)}</td><td>€${salaryEUR.toFixed(2)}</td></tr>
<tr><td>Total Income Tax</td><td>£${(data.incomeTax / euroConversionRate).toFixed(2)}</td><td>€${data.incomeTax.toFixed(2)}</td></tr>
<tr><td>Social Security Tax</td><td>£${(data.socialSecurityTax / euroConversionRate).toFixed(2)}</td><td>€${data.socialSecurityTax.toFixed(2)}</td></tr>
<tr><td>Total Tax</td><td>£${(data.totalTax / euroConversionRate).toFixed(2)}</td><td>€${data.totalTax.toFixed(2)}</td></tr>
<tr><td>Year Net Income</td><td>£${(data.annualNetIncome / euroConversionRate).toFixed(2)}</td><td>€${data.annualNetIncome.toFixed(2)}</td></tr>
<tr><td>Month Net Income</td><td>£${(data.monthlyNetIncome / euroConversionRate).toFixed(2)}</td><td>€${data.monthlyNetIncome.toFixed(2)}</td></tr>
</tbody>
</table>
`;
}
function displayComparison(spainData, ukData, salaryGBP, salaryEUR, euroConversionRate) {
const comparisonContainer = document.getElementById("comparison-results");
comparisonContainer.innerHTML = `
<table>
<thead>
<tr>
<th>Concept</th>
<th>Spain (GBP / EUR)</th>
<th>UK (GBP / EUR)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Taxable Income</td>
<td>£${(spainData.taxableIncome / euroConversionRate).toFixed(2)} / €${spainData.taxableIncome.toFixed(2)}</td>
<td>£${ukData.taxableIncome.toFixed(2)} / €${(ukData.taxableIncome * euroConversionRate).toFixed(2)}</td>
</tr>
<tr>
<td>Total Income Tax</td>
<td>£${(spainData.incomeTax / euroConversionRate).toFixed(2)} / €${spainData.incomeTax.toFixed(2)}</td>
<td>£${ukData.incomeTax.toFixed(2)} / €${(ukData.incomeTax * euroConversionRate).toFixed(2)}</td>
</tr>
<tr>
<td>Social Security Tax</td>
<td>£${(spainData.socialSecurityTax / euroConversionRate).toFixed(2)} / €${spainData.socialSecurityTax.toFixed(2)}</td>
<td>£${ukData.socialSecurityTax.toFixed(2)} / €${(ukData.socialSecurityTax * euroConversionRate).toFixed(2)}</td>
</tr>
<tr>
<td>Total Tax</td>
<td>£${(spainData.totalTax / euroConversionRate).toFixed(2)} / €${spainData.totalTax.toFixed(2)}</td>
<td>£${ukData.totalTax.toFixed(2)} / €${(ukData.totalTax * euroConversionRate).toFixed(2)}</td>
</tr>
<tr>
<td>Year Net Income</td>
<td>£${(spainData.annualNetIncome / euroConversionRate).toFixed(2)} / €${spainData.annualNetIncome.toFixed(2)}</td>
<td>£${ukData.annualNetIncome.toFixed(2)} / €${(ukData.annualNetIncome * euroConversionRate).toFixed(2)}</td>
</tr>
<tr>
<td>Month Net Income</td>
<td>£${(spainData.monthlyNetIncome / euroConversionRate).toFixed(2)} / €${spainData.monthlyNetIncome.toFixed(2)}</td>
<td>£${ukData.monthlyNetIncome.toFixed(2)} / €${(ukData.monthlyNetIncome * euroConversionRate).toFixed(2)}</td>
</tr>
</tbody>
</table>
`;
}
function displayHighlights(spainData, ukData, euroConversionRate) {
const spainTotalTax = spainData.totalTax;
const ukTotalTax = ukData.totalTax;
const taxDifferenceGBP = ukTotalTax - (spainTotalTax / euroConversionRate);
const weeklyDifference = taxDifferenceGBP / 52;
const monthlyDifference = taxDifferenceGBP / 12;
const yearlyDifference = taxDifferenceGBP;
const fiveYearDifference = taxDifferenceGBP * 5;
function formatHighlightBox(title, value) {
const isBetter = value >= 0;
return `
<div>
<div style="font-size: 1.5rem; font-weight: bold;">£${Math.abs(value.toFixed(2))}</div>
<div style="font-size: 1rem; margin-top: 5px;">${isBetter ? "Better off" : "Worse off"}</div>
</div>
<div style="margin-top: 10px; font-weight: bold;">${title}</div>
`;
}
const setHighlightBoxStyle = (elementId, title, value) => {
const element = document.getElementById(elementId);
const isBetter = value >= 0;
element.className = `highlight-box ${isBetter ? "better-off" : "worse-off"}`;
element.innerHTML = formatHighlightBox(title, value);
};
setHighlightBoxStyle("highlight-week", "Per Week", weeklyDifference);
setHighlightBoxStyle("highlight-month", "Per Month", monthlyDifference);
setHighlightBoxStyle("highlight-year", "Per Year", yearlyDifference);
setHighlightBoxStyle("highlight-five-years", "Per 5 Years", fiveYearDifference);
}
</script>
</body>
</html>