var wpdm_url = {"home":"https://atotaxrates.info/","site":"https://atotaxrates.info/","ajax":"https://atotaxrates.info/wp-admin/admin-ajax.php"};
var wpdm_js = {"spinner":"\u003Ci class=\"wpdm-icon wpdm-sun wpdm-spin\"\u003E\u003C/i\u003E","client_id":"7d373dc04eb65054fcc060df88d31725"};
var wpdm_strings = {"pass_var":"Password Verified!","pass_var_q":"Please click following button to start download.","start_dl":"Start Download"};
//# sourceURL=wpdm-frontjs-js-extra
Excess Super Contributions: Tax Treatment Explained
Excess contributions are no longer generally subject to a standalone “excess contributions tax” as they once were, before 2013.
There are two types of super contributions caps, concessional and non-concessional. Each contribution type has has different consequences when exceeded.
Concessional excess amounts are included in your assessable income and taxed at your marginal rate, with adjustments.
Non-concessional excess amounts may still attract a penalty tax if not withdrawn.
How much tax is payable on excess super contributions?
Excesses of concessional and non-concessional contributions have differing tax treatments.
Excess Super Contributions Tax Calculator
Calculate the tax consequences of exceeding your concessional or non-concessional super contribution caps.
Unused CC caps carried forward (requires TSB below $500k at prior 30 June). Enter $0 if none.
$
Employer SG + salary sacrifice + personal deductible contributions
$
Your carry-forward NCC amount from prior years (check MyTax or your ATO account). Enter $0 if none available.
$
After-tax contributions (not deductible)
$
ATO determination option
Option 1 is the default if no election is made within 60 days of the ATO determination
Excess Concessional Contributions
The excess tax on concessional super contributions is contained in a notice of assessment sent to you from the Tax Office.
Concessional contributions are those which are tax deductible, and are taxed at a rate of 15% in the super fund. They will include super guarantee, salary sacrifice and personal deductible contributions,
The Tax Office calculates the tax assessment by comparing the data in your tax return with that of the super fund.
The notice of assessment will include the excess contributions as income, so the excess is included in your assessable income and taxed at your marginal tax rate (i.e. potentially up to 47% including medicare).
The assessment will also include:
time-based charges to compensate the Tax Office for the delay in tax collected on the excess contributions; less
a tax offset at the rate of 15% of the excess contributions which recognises the 15% tax paid by the super fund; and
an option to withdraw 85% of the excess contributions. There is a 60-day time limit, and an election is non-revocable.
Withdrawal of the excess contributions provides funds to pay the additional tax assessment should that be required.
Importantly, however, unless the excess concessional contributions are withdrawn, the full amount of the excess will be counted as non-concessional contributions.
Depending on your position, this could result in additional tax of 47% including medicare if non-concessional contributions are pushed over the non-concessional cap limits.
Worked Example: Excess concessional contributions
Assumptions
Concessional cap for the year: $30,000
Alex’s total concessional contributions (employer SG + salary sacrifice): $40,000.
Non-concessional contributions are those for which a tax deduction is not claimable.
When excess contributions are detected, the Tax Office sends a determination which sets out two options, exercisable within 60 days and are non-revocable.
Option 1 is applied by default if you take no action within 60 days, and enables the withdrawal of the excess contributions plus 85% of associated earnings from the super fund (after 15% tax is withheld).
The associated earnings are added to your other income to be taxed at the applicable marginal rate, less a 15% tax offset which recognises the tax paid in the super fund.
For certain defined benefit fund interests, the release option may be limited or unavailable.
Option two allows the excess contributions and associated earnings to remain in the super fund. The excess contributions are taxed at the highest marginal tax rate, currently 45% plus medicare at 2%. The ATO provides authorisation to release sufficient funds from the super fund in order to pay the tax.
If the fund has insufficient funds to pay the tax the obligation to pay falls on the individual.
Worked Example: Excess non‑concessional contributions
Assumptions
Non‑concessional cap for the year: $120,000 (assumed single‑year cap; ignoring bring‑forward).
Priya makes non‑concessional contributions of $150,000.
Tax on excess contributions is avoided by keeping contributions within the caps.
The other way is obtaining the Tax Commissioner’s to disregard or reallocate excess contributions in limited circumstances.
Tax Commissioner’s Discretion To Disregard Or Reallocate Excess Contributions
Commissioner discretion is limited to circumstances where the breach occurred due to factors outside the individual’s control and where it is fair and reasonable to do so.
Examples might include the super fund receiving compensation from a financial services provider; or a contribution allocated by the Fund’s administration to a tax year earlier or later than intended.
The ATO’s form “Application – excess contributions determination” (NAT 71333) is used to apply for a determination to disregard or reallocate contributions where you believe you’ve exceeded a cap due to special circumstances.
The Application requires the taxpayer to explain:
What happened with the contribution.
Why it caused the cap to be exceeded.
Why there were special circumstances and
Why the Commissioner should disregard or reallocate an amount.
Timing of Contributions is Crucial
Contributions are regarded by the Tax Office as being paid at the time they are received by the fund, and the timing of contributions is a critical factor in determining the relevant year for caps calculations.
Employer contributions will most often be received by the fund after a period end. This means that if the period end also happens to be the end of the financial year, the contributions will form part of the later year’s contribution caps calculations.
Salary sacrifice contributions by their nature are attributed to the concessional cap.
Form NAT 74851 is used to notify the Tax Office where concessional contributions in one financial year were not allocated until the following financial year by the Super Fund. This form cannot be used non-concessional contributions.
(function () {
/* ══════════════════════════════════════
YEAR CONFIGURATIONS
Add a new entry here when a new year is released.
══════════════════════════════════════ */
const YEARS = Object.freeze({
'2526': {
label: '2025-26',
cc: {
annualCap: 30000,
maxWithCarry: 167500, // 5-year extreme carry-forward
carryYears: 5,
},
ncc: {
annualCap: 120000,
bringFwdTotal: 360000, // 3 x $120,000
bringFwdYears: 3,
},
/* Tax scales including 2% Medicare levy */
brackets: [
{ floor: 0, base: 0, rate: 0 },
{ floor: 18201, base: 0, rate: 0.16 }, // 2025-26: 16c
{ floor: 45001, base: 4288, rate: 0.30 },
{ floor: 135001, base: 31288, rate: 0.37 },
{ floor: 190001, base: 51638, rate: 0.45 },
],
/* Medicare-inclusive marginal rates for the select */
rateOptions: [
{ label: 'Nil (income $0 to $18,200)', value: 0 },
{ label: '18% incl. Medicare (income $18,201 to $45,000)', value: 0.18 },
{ label: '32% incl. Medicare (income $45,001 to $135,000)', value: 0.32 },
{ label: '39% incl. Medicare (income $135,001 to $190,000)',value: 0.39 },
{ label: '47% incl. Medicare (income over $190,000)', value: 0.47 },
],
defaultRateIdx: 2,
},
'2627': {
label: '2026-27',
cc: {
annualCap: 32500,
maxWithCarry: 175000, // 5-year extreme carry-forward
carryYears: 5,
},
ncc: {
annualCap: 130000,
bringFwdTotal: 390000, // 3 x $130,000
bringFwdYears: 3,
},
/* Tax scales including 2% Medicare levy */
brackets: [
{ floor: 0, base: 0, rate: 0 },
{ floor: 18201, base: 0, rate: 0.15 }, // 2026-27: 15c
{ floor: 45001, base: 4020, rate: 0.30 },
{ floor: 135001, base: 31020, rate: 0.37 },
{ floor: 190001, base: 51370, rate: 0.45 },
],
rateOptions: [
{ label: 'Nil (income $0 to $18,200)', value: 0 },
{ label: '17% incl. Medicare (income $18,201 to $45,000)', value: 0.17 },
{ label: '32% incl. Medicare (income $45,001 to $135,000)', value: 0.32 },
{ label: '39% incl. Medicare (income $135,001 to $190,000)', value: 0.39 },
{ label: '47% incl. Medicare (income over $190,000)', value: 0.47 },
],
defaultRateIdx: 2,
},
});
const FUND_TAX_RATE = 0.15;
const NCC_PENALTY_RATE = 0.47; // always top marginal + Medicare
const RELEASE_PCT = 0.85;
const NCC_EARNINGS_RATE = 0.10; // ATO estimated shortfall interest charge rate for notional earnings
/* ── Formatters ── */
const fmtCur = new Intl.NumberFormat('en-AU', { style: 'currency', currency: 'AUD', maximumFractionDigits: 2 });
const fmtPct = new Intl.NumberFormat('en-AU', { style: 'percent', maximumFractionDigits: 2 });
const c = v => fmtCur.format(v);
const p = v => fmtPct.format(v);
/* ── State ── */
let state = { year: '2526', type: 'cc', nccOption: 1 };
/* ── Helpers ── */
function parseAmount(id) {
const el = document.getElementById(id);
if (!el) return 0;
const n = parseFloat(el.value.replace(/[^0-9.]/g, ''));
return isNaN(n) ? 0 : n;
}
function ycfg() { return YEARS[state.year]; }
function getRate(selectId) {
const el = document.getElementById(selectId);
return el ? parseFloat(el.value) : 0;
}
/* ── Rate select population ── */
function populateRates(selectId, opts, defaultIdx) {
const el = document.getElementById(selectId);
if (!el) return;
const currentVal = parseFloat(el.value);
el.innerHTML = '';
let matched = false;
opts.forEach((o, i) => {
const opt = document.createElement('option');
opt.value = o.value;
opt.textContent = o.label;
// Try to preserve the user's current rate selection across year changes.
// If an exact match exists in the new year's options, keep it selected.
if (!isNaN(currentVal) && o.value === currentVal) {
opt.selected = true;
matched = true;
}
el.appendChild(opt);
});
// No matching rate in the new year — fall back to default.
if (!matched) el.options[defaultIdx].selected = true;
}
/* ── CC Calculation ── */
function calcCC(actual, bringFwd, rate) {
const cfg = ycfg().cc;
const totalCap = cfg.annualCap + bringFwd;
const excess = Math.max(0, actual - totalCap);
if (excess === 0) return { excess: 0, totalCap };
const taxGross = excess * rate;
const offset = excess * FUND_TAX_RATE;
// Net tax floors at zero: if marginal rate < 15%, the offset exceeds gross tax;
// the ATO does not pay the difference — the fund keeps the tax already paid.
const netTax = Math.max(0, taxGross - offset);
// Release option is only meaningful if there is net tax to pay or the user
// wants to prevent the excess counting as NCC. Show it whenever there is excess.
const release = excess * RELEASE_PCT;
const refund = Math.max(0, release - netTax);
return { excess, totalCap, actual, bringFwd, rate, taxGross, offset, netTax, release, refund };
}
/* ── NCC Calculation ── */
function calcNCC(actual, bringFwd, rate, option) {
const cfg = ycfg().ncc;
// The user supplies their carry-forward amount from MyTax.
// Effective cap = annual cap + user-entered carry-forward (clamped to 0..max).
const effectiveCap = cfg.annualCap + bringFwd;
const excess = Math.max(0, actual - effectiveCap);
if (excess === 0) return { excess: 0, effectiveCap };
const earnings = excess * NCC_EARNINGS_RATE; // 10% estimate
if (option === 1) {
const earningsTax = earnings * rate;
const earningsOffset = earnings * FUND_TAX_RATE;
// Floor at zero: marginal rate below 15% cannot produce a negative personal tax liability.
const netEarningsTax = Math.max(0, earningsTax - earningsOffset);
return {
excess, effectiveCap, actual, bringFwd, rate, option,
earnings, earningsTax, earningsOffset, netEarningsTax,
primaryTax: netEarningsTax,
};
} else {
const taxOnExcess = excess * NCC_PENALTY_RATE;
return {
excess, effectiveCap, actual, bringFwd, rate, option,
earnings,
taxOnExcess,
primaryTax: taxOnExcess,
};
}
}
/* ── Render CC ── */
function renderCC(r) {
return `
<div class="exc202526 result-primary">
<span class="r-label">Net extra tax payable on excess concessional contributions</span>
<span class="r-value">${c(r.netTax)}</span>
</div>
<div class="exc202526 results-grid">
<div class="exc202526 stat-card">
<span class="r-label">Excess concessional contributions</span>
<span class="r-value">${c(r.excess)}</span>
<span class="r-sub">Total contributed ${c(r.actual)} vs cap ${c(r.totalCap)}</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Gross tax at ${p(r.rate)} marginal rate</span>
<span class="r-value">${c(r.taxGross)}</span>
<span class="r-sub">${c(r.excess)} x ${p(r.rate)}</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Less: 15% fund tax offset</span>
<span class="r-value">-${c(r.offset)}</span>
<span class="r-sub">Tax already paid by the fund on your contributions</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Max release from super (85%)</span>
<span class="r-value">${c(r.release)}</span>
<span class="r-sub">ATO refunds ${c(r.refund)} after applying tax debt</span>
</div>
</div>
<details class="exc202526 explain">
<summary>How this is calculated</summary>
<ul>
<li>Annual CC cap (${ycfg().label}): ${c(ycfg().cc.annualCap)}</li>
<li>Carry-forward unused CC: ${c(r.bringFwd)}</li>
<li>Your total effective CC cap: ${c(r.totalCap)}</li>
<li>Total concessional contributions: ${c(r.actual)}</li>
<li>Excess: ${c(r.actual)} - ${c(r.totalCap)} = ${c(r.excess)}</li>
<li>Step 1: ATO adds ${c(r.excess)} to your assessable income</li>
<li>Step 2: Tax at ${p(r.rate)}: ${c(r.excess)} x ${p(r.rate)} = ${c(r.taxGross)}</li>
<li>Step 3: 15% tax offset (fund already paid): ${c(r.excess)} x 15% = ${c(r.offset)}</li>
<li>Step 4: Net extra tax = ${c(r.taxGross)} - ${c(r.offset)} = ${c(r.netTax)}</li>
<li>Step 5: Election to release up to 85%: ${c(r.excess)} x 85% = ${c(r.release)}</li>
<li>ATO applies ${c(Math.min(r.release, r.netTax))} to tax debt and refunds ${c(r.refund)}</li>
</ul>
</details>
<div class="exc202526 notice">
<strong>Important:</strong> If the excess concessional contributions (${c(r.excess)}) are NOT released from super, that amount will also count as non-concessional contributions. If you are near the NCC cap (${c(ycfg().ncc.annualCap)} standard), this may trigger additional excess NCC tax at up to 47%. The 60-day election to release is non-revocable.
</div>`;
}
/* ── Render NCC ── */
function renderNCC(r) {
const cfg = ycfg().ncc;
if (r.option === 1) {
return `
<div class="exc202526 result-primary">
<span class="r-label">Net tax on associated earnings - Option 1</span>
<span class="r-value">${c(r.netEarningsTax)}</span>
</div>
<div class="exc202526 results-grid">
<div class="exc202526 stat-card">
<span class="r-label">Excess NCC (returned to you)</span>
<span class="r-value">${c(r.excess)}</span>
<span class="r-sub">Not personally taxed; withdrawn from super</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Notional associated earnings (10% est.)</span>
<span class="r-value">${c(r.earnings)}</span>
<span class="r-sub">Included in your assessable income</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Tax on earnings at ${p(r.rate)}</span>
<span class="r-value">${c(r.earningsTax)}</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Less: 15% fund tax offset on earnings</span>
<span class="r-value">-${c(r.earningsOffset)}</span>
</div>
</div>
<details class="exc202526 explain">
<summary>How this is calculated - Option 1</summary>
<ul>
<li>Annual NCC cap (${ycfg().label}): ${c(cfg.annualCap)}</li>
<li>Carry-forward NCC entered: ${c(r.bringFwd)}</li>
<li>Effective cap this year: ${c(cfg.annualCap)} + ${c(r.bringFwd)} = ${c(r.effectiveCap)}</li>
<li>Total NCC contributed: ${c(r.actual)}</li>
<li>Excess: ${c(r.actual)} - ${c(r.effectiveCap)} = ${c(r.excess)}</li>
<li>Option 1 is applied by default if no election is made within 60 days</li>
<li>The ${c(r.excess)} excess is withdrawn from super - no personal income tax on this amount</li>
<li>Notional associated earnings (estimated at 10% of excess): ${c(r.excess)} x 10% = ${c(r.earnings)}</li>
<li>Tax on earnings at ${p(r.rate)}: ${c(r.earningsTax)}</li>
<li>Less 15% offset on earnings: -${c(r.earningsOffset)}</li>
<li>Net tax on associated earnings: ${c(r.netEarningsTax)}</li>
<li>Fund releases sufficient funds under ATO release authority; ATO keeps tax owing and refunds balance to you</li>
</ul>
</details>
<div class="exc202526 notice">
<strong>Earnings rate note:</strong> The 10% notional earnings rate used here is an estimate only. The ATO calculates the actual rate each year using a prescribed formula. Your ATO determination will show the actual associated earnings figure. Actual tax payable may differ from this estimate.
</div>`;
} else {
return `
<div class="exc202526 result-primary">
<span class="r-label">Penalty tax on excess NCC - Option 2</span>
<span class="r-value">${c(r.taxOnExcess)}</span>
</div>
<div class="exc202526 results-grid">
<div class="exc202526 stat-card">
<span class="r-label">Excess non-concessional contributions</span>
<span class="r-value">${c(r.excess)}</span>
<span class="r-sub">Stays in super fund</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Penalty tax rate</span>
<span class="r-value">47%</span>
<span class="r-sub">Top marginal rate + 2% Medicare</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Tax on excess</span>
<span class="r-value">${c(r.taxOnExcess)}</span>
<span class="r-sub">${c(r.excess)} x 47%</span>
</div>
<div class="exc202526 stat-card">
<span class="r-label">Notional earnings (10% est.)</span>
<span class="r-value">${c(r.earnings)}</span>
<span class="r-sub">Remain in fund; not separately taxed under Option 2</span>
</div>
</div>
<details class="exc202526 explain">
<summary>How this is calculated - Option 2</summary>
<ul>
<li>Annual NCC cap (${ycfg().label}): ${c(cfg.annualCap)}</li>
<li>Carry-forward NCC entered: ${c(r.bringFwd)}</li>
<li>Effective cap this year: ${c(cfg.annualCap)} + ${c(r.bringFwd)} = ${c(r.effectiveCap)}</li>
<li>Total NCC contributed: ${c(r.actual)}</li>
<li>Excess: ${c(r.actual)} - ${c(r.effectiveCap)} = ${c(r.excess)}</li>
<li>Tax on excess at 47% (top marginal + Medicare): ${c(r.excess)} x 47% = ${c(r.taxOnExcess)}</li>
<li>ATO issues a release authority to your fund for ${c(r.taxOnExcess)}</li>
<li>If the fund cannot cover this, you are personally liable for the shortfall</li>
<li>Notional associated earnings estimated at 10% x ${c(r.excess)} = ${c(r.earnings)} (remain in fund under this option)</li>
</ul>
</details>
<div class="exc202526 notice">
<strong>Warning:</strong> Option 2 results in penalty tax of ${c(r.taxOnExcess)}. This is almost always significantly higher than the tax under Option 1. Seek tax advice urgently before the 60-day election deadline expires. This option is non-revocable.
</div>`;
}
}
/* ── Render no excess ── */
function renderNone(label, cap) {
return `<div class="exc202526 notice" style="border-color:var(--border)">
<strong>No excess detected.</strong> Your ${label} contributions are within your effective cap of ${c(cap)}. No excess contributions tax applies.
</div>`;
}
/* ── Main update ── */
function update() {
const cfg = ycfg();
const out = document.getElementById('exc202526-output');
// Update cap notes
const ccNote = document.getElementById('exc202526-ccBringFwdNote');
if (ccNote) ccNote.textContent = `Maximum carry-forward (extreme case, all prior years fully unused): ${c(cfg.cc.maxWithCarry - cfg.cc.annualCap)}`;
const nccNote = document.getElementById('exc202526-nccBringFwdNote');
if (nccNote) nccNote.textContent = `Maximum carry-forward for this year: ${c(cfg.ncc.bringFwdTotal - cfg.ncc.annualCap)}`;
if (state.type === 'cc') {
const bringFwd = parseAmount('exc202526-ccBringFwd');
const actual = parseAmount('exc202526-ccActual');
const rate = getRate('exc202526-ccRate');
if (!actual) { out.innerHTML = emptyState(); return; }
const ccPanel = document.getElementById('exc202526-ccPanel');
if (ccPanel && ccPanel.querySelector('.exc202526.money-input.is-error')) { out.innerHTML = errorState(); return; }
const r = calcCC(actual, bringFwd, rate);
out.innerHTML = r.excess > 0 ? renderCC(r) : renderNone('concessional', r.totalCap);
} else {
const bringFwd = parseAmount('exc202526-nccBringFwd');
const actual = parseAmount('exc202526-nccActual');
const rate = getRate('exc202526-nccRate');
if (!actual) { out.innerHTML = emptyState(); return; }
const nccPanel = document.getElementById('exc202526-nccPanel');
if (nccPanel && nccPanel.querySelector('.exc202526.money-input.is-error')) { out.innerHTML = errorState(); return; }
const r = calcNCC(actual, bringFwd, rate, state.nccOption);
out.innerHTML = r.excess > 0 ? renderNCC(r) : renderNone('non-concessional', r.effectiveCap);
}
}
function errorState() {
return `<div class="exc202526 notice"><strong>Please correct the errors above before calculating.</strong></div>`;
}
function emptyState() {
return `<div class="exc202526 empty-state">Enter your contribution amounts above to see the tax calculation.</div>`;
}
/* ── Year toggle ── */
function setYear(y) {
state.year = y;
document.getElementById('exc202526-btnY2526').setAttribute('aria-pressed', y === '2526' ? 'true' : 'false');
document.getElementById('exc202526-btnY2627').setAttribute('aria-pressed', y === '2627' ? 'true' : 'false');
const cfg = YEARS[y];
populateRates('exc202526-ccRate', cfg.rateOptions, cfg.defaultRateIdx);
populateRates('exc202526-nccRate', cfg.rateOptions, cfg.defaultRateIdx);
// Re-validate all inputs against new year limits
Object.keys(ERR_MAP).forEach(id => {
const el = document.getElementById(id);
if (el && el.value) {
const n = parseFloat(el.value.replace(/[^0-9.]/g, ''));
if (!isNaN(n)) validateInput(id, n);
}
});
update();
}
/* ── Type toggle ── */
function setType(t) {
state.type = t;
document.getElementById('exc202526-btnCC').setAttribute('aria-pressed', t === 'cc' ? 'true' : 'false');
document.getElementById('exc202526-btnNCC').setAttribute('aria-pressed', t === 'ncc' ? 'true' : 'false');
document.getElementById('exc202526-ccPanel').style.display = t === 'cc' ? '' : 'none';
document.getElementById('exc202526-nccPanel').style.display = t === 'ncc' ? '' : 'none';
update();
}
/* ── NCC option toggle ── */
function setOpt(o) {
state.nccOption = o;
document.getElementById('exc202526-btnOpt1').setAttribute('aria-pressed', o === 1 ? 'true' : 'false');
document.getElementById('exc202526-btnOpt2').setAttribute('aria-pressed', o === 2 ? 'true' : 'false');
update();
}
/* ── Input helpers ── */
function clear(id) {
const el = document.getElementById(id);
if (el) {
el.value = '';
const errId = ERR_MAP[id];
if (errId) clearFieldError(id, errId);
el.focus();
update();
}
}
/* Validation rules keyed by input id.
Each returns null (ok) or an error string. */
function getValidationRule(id) {
const cfg = ycfg();
const rules = {
'exc202526-ccBringFwd': {
min: 0,
max: cfg.cc.maxWithCarry - cfg.cc.annualCap,
maxMsg: `Cannot exceed the maximum carry-forward of ${c(cfg.cc.maxWithCarry - cfg.cc.annualCap)} for ${cfg.label}`,
},
'exc202526-ccActual': {
min: 0,
max: cfg.cc.maxWithCarry,
maxMsg: `Cannot exceed the maximum concessional contribution of ${c(cfg.cc.maxWithCarry)} for ${cfg.label}`,
},
'exc202526-nccBringFwd': {
min: 0,
max: cfg.ncc.bringFwdTotal - cfg.ncc.annualCap,
maxMsg: `Cannot exceed the maximum NCC carry-forward of ${c(cfg.ncc.bringFwdTotal - cfg.ncc.annualCap)} for ${cfg.label}`,
},
'exc202526-nccActual': {
min: 0,
max: cfg.ncc.bringFwdTotal,
maxMsg: `Cannot exceed the maximum NCC of ${c(cfg.ncc.bringFwdTotal)} for ${cfg.label}`,
},
};
return rules[id] || null;
}
function setFieldError(inputId, errId, msg) {
const inp = document.getElementById(inputId);
const err = document.getElementById(errId);
if (!inp || !err) return;
if (msg) {
inp.classList.add('is-error');
err.textContent = msg;
err.style.display = 'block';
} else {
inp.classList.remove('is-error');
err.textContent = '';
err.style.display = 'none';
}
}
function clearFieldError(inputId, errId) {
setFieldError(inputId, errId, null);
}
const ERR_MAP = {
'exc202526-ccBringFwd': 'exc202526-ccBringFwdErr',
'exc202526-ccActual': 'exc202526-ccActualErr',
'exc202526-nccBringFwd': 'exc202526-nccBringFwdErr',
'exc202526-nccActual': 'exc202526-nccActualErr',
};
function validateInput(id, n) {
const errId = ERR_MAP[id];
if (!errId) return true;
const rule = getValidationRule(id);
if (!rule) return true;
if (isNaN(n)) { clearFieldError(id, errId); return true; }
if (n < 0) {
setFieldError(id, errId, 'Value cannot be negative');
return false;
}
if (n > rule.max) {
setFieldError(id, errId, rule.maxMsg);
return false;
}
clearFieldError(id, errId);
return true;
}
function blurFmt(el) {
const raw = el.value.replace(/[^0-9.]/g, '');
const n = raw === '' ? NaN : parseFloat(raw);
if (isNaN(n)) {
el.value = '';
const errId = ERR_MAP[el.id];
if (errId) clearFieldError(el.id, errId);
update();
return;
}
const rounded = Math.round(n);
validateInput(el.id, rounded);
el.value = rounded > 0 ? rounded.toLocaleString('en-AU') : rounded === 0 ? '0' : '';
update();
}
function focusFmt(el) {
el.value = el.value.replace(/[^0-9.]/g, '') || '';
}
/* ── Chip helpers ── */
function chipCCCap() {
const cfg = ycfg().cc;
document.getElementById('exc202526-ccActual').value = cfg.annualCap.toLocaleString('en-AU');
update();
}
function chipCCMax() {
const cfg = ycfg().cc;
document.getElementById('exc202526-ccActual').value = cfg.maxWithCarry.toLocaleString('en-AU');
document.getElementById('exc202526-ccBringFwd').value = (cfg.maxWithCarry - cfg.annualCap).toLocaleString('en-AU');
update();
}
function chipNCCCap() {
const cfg = ycfg().ncc;
document.getElementById('exc202526-nccActual').value = cfg.annualCap.toLocaleString('en-AU');
update();
}
function chipNCCMax() {
const cfg = ycfg().ncc;
document.getElementById('exc202526-nccActual').value = cfg.bringFwdTotal.toLocaleString('en-AU');
document.getElementById('exc202526-nccBringFwd').value = '0';
update();
}
/* ── Expose to inline handlers ── */
window.EXC = { update, setYear, setType, setOpt, clear, blurFmt, focusFmt,
chipCCCap, chipCCMax, chipNCCCap, chipNCCMax };
/* ── Init ── */
const cfg0 = YEARS['2526'];
populateRates('exc202526-ccRate', cfg0.rateOptions, cfg0.defaultRateIdx);
populateRates('exc202526-nccRate', cfg0.rateOptions, cfg0.defaultRateIdx);
update();
})();
const abmsg = "We noticed an ad blocker. Consider whitelisting us to support the site ❤️";
const abmsgd = "download";
const iswpdmpropage = 0;
jQuery(function($){
});
var searchwp_live_search_params = [];
searchwp_live_search_params = {"ajaxurl":"https:\/\/atotaxrates.info\/wp-admin\/admin-ajax.php","origin_id":416,"config":{"default":{"engine":"default","input":{"delay":300,"min_chars":3},"results":{"position":"bottom","width":"auto","offset":{"x":0,"y":5}},"spinner":{"lines":12,"length":8,"width":3,"radius":8,"scale":1,"corners":1,"color":"#424242","fadeColor":"transparent","speed":1,"rotate":0,"animation":"searchwp-spinner-line-fade-quick","direction":1,"zIndex":2000000000,"className":"spinner","top":"50%","left":"50%","shadow":"0 0 1px transparent","position":"absolute"}}},"msg_no_config_found":"No valid SearchWP Live Search configuration found!","aria_instructions":"When autocomplete results are available use up and down arrows to review and enter to go to the desired page. Touch device users, explore by touch or with swipe gestures."};;
//# sourceURL=swp-live-search-client-js-extra