salary-calculator/scratch.html
2022-12-06 12:26:00 +02:00

167 lines
9.3 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div class="row">
<div class="col">
<h1>Hello, world!</h1>
<form class="row">
<div class="mb-3 col-sm-6 col-md-4">
<label for="idBruttoInput" class="form-label text-bold">Brutto salary*:</label>
<div class="input-group">
<span class="input-group-text"></span>
<input type="number" class="form-control" id="idBruttoInput" placeholder="700" min="700"
step="1">
<span class="input-group-text">.00</span>
</div>
<label for="idDependentsInput" class="form-label text-bold">Dependents:</label>
<select id="idDependentsInput" class="form-select">
<option value="0" selected>0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
<label><input type="checkbox" id="idTaxBookSubmitted" checked> Salary tax book has been submitted to
the employer</label>
<label for="idExtraTaxDiscount" class="form-label text-bold">Extra tax-free amount:</label>
<div class="input-group">
<span class="input-group-text"></span>
<input type="number" class="form-control" id="idExtraTaxDiscount" placeholder="0" min="0"
step="0.01">
</div>
</div>
<div class="col col-md-5">
<ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto">
<div class="fw-bold">Brutto salary</div>
</div>
<span id="idBruttoSalaryDisplay">1300,00€</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto">
<div class="fw-bold">Social security tax</div>
</div>
<span id="idSocialSecurityTaxDisplay" class="text-danger">969,26€</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto">
<div class="fw-bold">Income tax</div>
</div>
<span id="idIncomeTaxDisplay" class="text-danger">969,26€</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto">
<div class="fw-bold">Net salary</div>
</div>
<span id="idNetSalaryDisplay" class="text-primary">969,26€</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto">
<div class="fw-bold">Employer tax</div>
</div>
<span id="idEmployerTaxDisplay" class="text-warning">306.67€</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-start">
<div class="ms-2 me-auto">
<div class="fw-bold">Employer total cost</div>
</div>
<span id="idEmployerTotalCostDisplay">1606,67€</span>
</li>
</ul>
</div>
</form>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4"
crossorigin="anonymous"></script>
<script>
// document.addEventListener("load", _ => {
const yearlySalaryLimit_1 = 20004,
yearlySalaryLimit_2 = 78100,
minTaxable = 500,
maxTaxable = 1800,
diffTaxable = minTaxable - maxTaxable,
minTaxFree = 0,
maxTaxFree = 500,
diffTaxFree = minTaxFree - maxTaxFree,
dependentsDiscount = 250,
halfPercent = 5 / 1000,
socialInsurancePercent = 105 / 1000;
const bruttoInput = document.getElementById("idBruttoInput"),
dependentInput = document.getElementById("idDependentsInput"),
taxBookSubmittedInput = document.getElementById("idTaxBookSubmitted"),
extraTaxDiscountInput = document.getElementById("idExtraTaxDiscount");
const displayEuro = amount => `${parseFloat(amount).toFixed(2)}`.replace(".", ",")
const updateCalculatedNetSalary = _ => {
const bruttoSalary = parseFloat(bruttoInput.value),
dependentCount = parseInt(dependentInput.value),
taxDiscount = parseFloat(extraTaxDiscountInput.value),
taxBookSubmitted = !!taxBookSubmittedInput.checked,
socialSecurityTax = calculateSocialInsuranceAmount(bruttoSalary),
incomeTax = calculateIncomeTax(bruttoSalary, socialSecurityTax, taxDiscount, dependentCount, taxBookSubmitted),
netSalary = calculateNetSalary(bruttoSalary, socialSecurityTax, incomeTax),
employersSocialTax = calculateEmployersSocialInsuranceAmount(bruttoSalary),
employersTotalCost = bruttoSalary + employersSocialTax,
bruttoDisplay = document.getElementById("idBruttoSalaryDisplay"),
socialSecurityDisplay = document.getElementById("idSocialSecurityTaxDisplay"),
incomeTaxDisplay = document.getElementById("idIncomeTaxDisplay"),
netSalaryDisplay = document.getElementById("idNetSalaryDisplay"),
employerTaxDisplay = document.getElementById("idEmployerTaxDisplay"),
employerTotalCostDisplay = document.getElementById("idEmployerTotalCostDisplay");
bruttoDisplay.textContent = displayEuro(bruttoSalary);
socialSecurityDisplay.textContent = displayEuro(socialSecurityTax);
incomeTaxDisplay.textContent = displayEuro(incomeTax);
netSalaryDisplay.textContent = displayEuro(netSalary);
employerTaxDisplay.textContent = displayEuro(employersSocialTax);
employerTotalCostDisplay.textContent = displayEuro(employersTotalCost);
}
const calculateSocialInsuranceAmount = (bruttoSalary) => {
if (isNaN(bruttoSalary))
return 0.00;
return Math.min(bruttoSalary * socialInsurancePercent, yearlySalaryLimit_2 / 12 * (socialInsurancePercent - halfPercent) + (bruttoSalary * halfPercent))
}
const calculateIncomeTax = (bruttoSalary, socialInsuranceAmount, extraDiscount = 0, dependentCount = 0, taxBookSubmitted = true) => {
const taxRelief = taxBookSubmitted ? dependentCount * dependentsDiscount : 0,
actualTaxFreeAmount = (!taxBookSubmitted ? 0 : (bruttoSalary > maxTaxable ? minTaxFree : (bruttoSalary <= minTaxable ? maxTaxFree : (maxTaxFree - ((diffTaxFree / diffTaxable) * (bruttoSalary - minTaxable)))))),
incomeTaxBaseLow = Math.min(yearlySalaryLimit_1 / 12, bruttoSalary),
incomeTaxBaseMid = Math.max(Math.min(bruttoSalary - incomeTaxBaseLow, yearlySalaryLimit_2 / 12 - incomeTaxBaseLow), 0),
incomeTaxBaseTop = Math.max(bruttoSalary - incomeTaxBaseLow - incomeTaxBaseMid, 0),
incomeTaxLow = (incomeTaxBaseLow - socialInsuranceAmount - extraDiscount - actualTaxFreeAmount - taxRelief) * (20 / 100),
incomeTaxMid = incomeTaxBaseMid * (23 / 100),
incomeTaxTop = incomeTaxBaseTop * (31 / 100);
return Math.max(incomeTaxLow + incomeTaxMid + incomeTaxTop, 0)
}
const calculateNetSalary = (bruttoSalary, socialInsuranceAmount, incomeTax) => {
if (isNaN(bruttoSalary))
return 0.00;
return bruttoSalary - socialInsuranceAmount - incomeTax;
}
const calculateEmployersSocialInsuranceAmount = (bruttoSalary) => (bruttoSalary * 2359 / 10000)
bruttoInput.addEventListener("change", updateCalculatedNetSalary);
dependentInput.addEventListener("change", updateCalculatedNetSalary);
taxBookSubmittedInput.addEventListener("change", updateCalculatedNetSalary);
extraTaxDiscountInput.addEventListener("change", updateCalculatedNetSalary);
// })
</script>
</body>
</html>