UProperty Singapore

UProperty.sg Singapore

Singapore Property Intelligence & Strategy

Policy-aware property planning for HDB upgraders, families, seniors, and investors navigating Singapore’s evolving housing market.

✓

Information provided is general in nature and does not constitute financial, legal, or tax advice. Property decisions should be assessed based on individual circumstances.

Real Estate Intelligence,
Not Sales Pitch

UProperty.sg provides structured property insights grounded in publicly available market data and Singapore’s regulatory and policy framework.

Our focus is on clarity, risk awareness, affordability, and long-term positioning — not hype, pressure, or speculative excitement. Advisory perspectives shared here represent professional observations and educational planning references, not guarantees of outcomes.

Who This Is For

Different property decisions require different levels of planning. UProperty.sg is designed for readers who want clearer numbers, calmer thinking, and a more policy-aware view before making major housing decisions.

⌂

HDB Upgraders

Plan your transition with clarity on MOP, CPF usage, ABSD implications, loan eligibility, resale proceeds, and transaction sequencing.

â–¥

Investors

Assess rental yield, financing, ABSD, LTV, SSD, holding period, tax awareness, and long-term entry risk before committing.

◌

Seniors & Families

Make calmer housing decisions around right-sizing, legacy planning, CPF, housing stability, care needs, and future family circumstances.

How We Work

Our Advisory Framework

UProperty.sg uses a structured, policy-aware approach to help Singapore buyers, sellers, HDB upgraders, seniors, and investors make clearer property decisions with better context, risk awareness, and long-term planning.

01
Market Cycle

Market Cycle Assessment

Understand Singapore’s property market through supply pipeline, demand shifts, interest rates, policy changes, and transaction sentiment.

  • Supply pipeline and new launch trends
  • Cooling measures and policy shifts
  • Price, rental, and transaction signals
02
Asset Strategy

Asset Positioning Strategy

Match the right property type, tenure, location, and holding plan to your household’s financial position and long-term goals.

  • Own-stay versus investment suitability
  • Holding period and exit planning
  • Rental yield, capital growth, and liquidity
03
Financing & Policy

Financing & Risk Alignment

Review affordability and transaction exposure using Singapore’s financing, CPF, stamp duty, and regulatory frameworks.

  • TDSR, LTV, CPF usage, and loan planning
  • ABSD, BSD, SSD, and holding costs
  • Cash flow and safety buffer awareness
04
Professional Standards

Compliance & Responsible Practice

UProperty.sg shares educational property insights with clear boundaries, public-source awareness, and responsible advisory discipline.

  • CEA-aligned professional conduct awareness
  • Reference to public sources where relevant
  • No guarantee of market outcomes

This framework is designed to support clearer decisions — not pressure, hype, or speculative promises.

Explore Property Insights
Market Intelligence Brief

Policy-Grounded Analysis for Better Property Decisions

Explore concise Singapore property insights across HDB upgrading, private market supply, financing conditions, and policy movements — designed for clearer, more responsible decision-making.

HDB
HDB & Upgrading

HDB Resale & Upgrade Pathways

Understand MOP cycles, resale price trends, CPF usage, ABSD implications, loan eligibility, and the sequencing needed for a compliant, cost-efficient upgrade.

Read HDB Insights →
PR
Private Market

Private Supply Pipeline & Pricing

Review new launch supply, regional trends, absorption rates, rental yield signals, holding period risks, and what buyer behaviour may indicate for future positioning.

Read Private Market →
$
Finance & Policy

Financing, Rates & Policy Watch

Track affordability signals such as SORA movements, fixed versus floating loans, TDSR, LTV, CPF usage, ABSD, BSD, SSD, and regulatory changes.

Read Finance Updates →
Compliance & Practice Standards

Professional Standards

UProperty.sg provides general educational property insights based on public information, professional observations, and Singapore’s property policy environment. Content shared here does not constitute financial, legal, tax, or investment advice.

✓

CEA-aligned professional conduct awareness with clear disclosure and responsible communication.

✓

Analysis based on publicly available information, official references, and market observations.

✓

No guarantee of outcomes; property decisions depend on individual circumstances, timing, and risk tolerance.

About UProperty.sg

Built for Clearer Property Decisions in Singapore

UProperty.sg was created to help Singapore households, HDB upgraders, seniors, PRs, and investors make more structured property decisions through policy-aware planning, market context, affordability awareness, and long-term thinking.

The platform is not designed to be another noisy property portal. It is built as a calmer, more educational space for people who want to understand property decisions before they commit.

Learn About UProperty.sg →
UProperty.sg Focus
  • Property intelligence
  • HDB upgrading clarity
  • CPF and affordability awareness
  • Policy-conscious planning
  • Long-term housing strategy
Start With Clarity

Make Better Property Decisions With Structure, Not Noise

Use UProperty.sg’s calculators, insights, and advisory framework to understand your next move before making a major property commitment.

Market Intelligence Brief

Policy-Grounded Analysis for Better Property Decisions

Explore concise Singapore property insights across HDB upgrading, private market supply, financing conditions, and policy movements — designed for clearer, more responsible decision-making.

HDB
HDB & Upgrading

HDB Resale & Upgrade Pathways

Understand MOP cycles, resale price trends, CPF usage, ABSD implications, loan eligibility, and the sequencing needed for a compliant, cost-efficient upgrade.

Read HDB Insights →
PR
Private Market

Private Supply Pipeline & Pricing

Review new launch supply, regional trends, absorption rates, rental yield signals, holding period risks, and what buyer behaviour may indicate for future positioning.

Read Private Market →
$
Finance & Policy

Financing, Rates & Policy Watch

Track affordability signals such as SORA movements, fixed versus floating loans, TDSR, LTV, CPF usage, ABSD, BSD, SSD, and regulatory changes.

Read Finance Updates →
Compliance & Practice Standards

Professional Standards

UProperty.sg provides general educational property insights based on public information, professional observations, and Singapore’s property policy environment. Content shared here does not constitute financial, legal, tax, or investment advice.

✓

CEA-aligned professional conduct awareness with clear disclosure and responsible communication.

✓

Analysis based on publicly available information, official references, and market observations.

✓

No guarantee of outcomes; property decisions depend on individual circumstances, timing, and risk tolerance.

About UProperty.sg

Built for Clearer Property Decisions in Singapore

UProperty.sg was created to help Singapore households, HDB upgraders, seniors, PRs, and investors make more structured property decisions through policy-aware planning, market context, affordability awareness, and long-term thinking.

The platform is not designed to be another noisy property portal. It is built as a calmer, more educational space for people who want to understand property decisions before they commit.

Learn About UProperty.sg →
UProperty.sg Focus
  • Property intelligence
  • HDB upgrading clarity
  • CPF and affordability awareness
  • Policy-conscious planning
  • Long-term housing strategy
Start With Clarity

Make Better Property Decisions With Structure, Not Noise

Use UProperty.sg’s calculators, insights, and advisory framework to understand your next move before making a major property commitment.

from the Elementor HTML block. - Update LAST_VERIFIED and fdData manually whenever you check official bank sources. - This is not a live rate API. It is a manually updated reference calculator. */const CONTACT_URL = "https://uproperty.sg/contact/"; const LAST_VERIFIED = "8 May 2026";const fdData = [ { bank: "DBS", package: "SGD Fixed Deposit board rate", headlineRate: 1.00, effectiveRate: 1.00, tenure: 12, min: 1000, max: 19999, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Online / branch, subject to bank terms", notes: "Board rate sample for 12-month placement in the S$1,000 to S$19,999 tier. DBS states rates are indicative and subject to change.", source: "https://www.dbs.com.sg/personal/rates-online/fixed-deposit-rate-singapore-dollar.page" }, { bank: "DBS", package: "SGD Fixed Deposit board rate", headlineRate: 0.80, effectiveRate: 0.80, tenure: 6, min: 1000, max: 19999, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Online / branch, subject to bank terms", notes: "Board rate sample for 6-month placement in the S$1,000 to S$19,999 tier.", source: "https://www.dbs.com.sg/personal/rates-online/fixed-deposit-rate-singapore-dollar.page" }, { bank: "OCBC", package: "Online SGD Time Deposit", headlineRate: 1.10, effectiveRate: 1.10, tenure: 12, min: 20000, max: 999999, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Internet Banking / OCBC app", notes: "Online promotional rate. Maximum online placement stated by OCBC is S$999,999.", source: "https://www.ocbc.com/personal-banking/deposits/fixed-deposit-account" }, { bank: "OCBC", package: "Online SGD Time Deposit", headlineRate: 1.15, effectiveRate: 1.15, tenure: 18, min: 20000, max: 999999, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Internet Banking / OCBC app", notes: "Online promotional rate. Check the latest OCBC page before placement.", source: "https://www.ocbc.com/personal-banking/deposits/fixed-deposit-account" }, { bank: "UOB", package: "SGD Time / Fixed Deposit Promotion", headlineRate: 1.10, effectiveRate: 1.10, tenure: 6, min: 10000, max: 999999, freshFunds: true, segment: "personal", type: "fresh_funds_fd", channel: "UOB Personal Internet Banking / UOB TMRW", notes: "Fresh funds promotional reference. Verify the active promotion period and eligibility directly with UOB.", source: "https://www.uob.com.sg/personal/online-rates/singapore-dollar-time-fixed-deposit-rates.page" }, { bank: "UOB", package: "SGD Time / Fixed Deposit Promotion", headlineRate: 1.15, effectiveRate: 1.15, tenure: 10, min: 10000, max: 999999, freshFunds: true, segment: "personal", type: "fresh_funds_fd", channel: "UOB Personal Internet Banking / UOB TMRW", notes: "Fresh funds promotional reference. Verify the active promotion period and eligibility directly with UOB.", source: "https://www.uob.com.sg/personal/online-rates/singapore-dollar-time-fixed-deposit-rates.page" }, { bank: "UOB", package: "SGD Time / Fixed Deposit Promotion", headlineRate: 1.15, effectiveRate: 1.15, tenure: 12, min: 10000, max: 999999, freshFunds: true, segment: "personal", type: "fresh_funds_fd", channel: "UOB Personal Internet Banking / UOB TMRW", notes: "Fresh funds promotional reference. Verify the active promotion period and eligibility directly with UOB.", source: "https://www.uob.com.sg/personal/online-rates/singapore-dollar-time-fixed-deposit-rates.page" }, { bank: "UOB", package: "Wealth customer SGD Time / Fixed Deposit Promotion", headlineRate: 1.20, effectiveRate: 1.20, tenure: 10, min: 10000, max: 999999, freshFunds: true, segment: "priority", type: "priority_fd", channel: "Relationship Manager / Client Advisor", notes: "Higher rate may require selected Wealth products held in the same name at placement. Verify conditions directly with UOB.", source: "https://www.uob.com.sg/personal/online-rates/singapore-dollar-time-fixed-deposit-rates.page" }, { bank: "Standard Chartered", package: "Fresh Funds SGD Time Deposit Promotion", headlineRate: 1.10, effectiveRate: 1.10, tenure: 9, min: 25000, max: null, freshFunds: true, segment: "personal", type: "fresh_funds_fd", channel: "Online Banking / SC Mobile", notes: "Fresh funds promotional reference. Verify the active promotion period and eligibility directly with Standard Chartered.", source: "https://www.sc.com/sg/save/time-deposits/singapore-dollar-time-deposit/" }, { bank: "Standard Chartered", package: "Priority Banking Fresh Funds SGD Time Deposit", headlineRate: 1.15, effectiveRate: 1.15, tenure: 9, min: 25000, max: null, freshFunds: true, segment: "priority", type: "priority_fd", channel: "Online Banking / SC Mobile", notes: "Priority Banking promotional reference. Fresh funds may be required. Verify final conditions directly with Standard Chartered.", source: "https://www.sc.com/sg/save/time-deposits/singapore-dollar-time-deposit/" }, { bank: "Standard Chartered", package: "Priority Private Fresh Funds SGD Time Deposit", headlineRate: 1.20, effectiveRate: 1.20, tenure: 9, min: 25000, max: null, freshFunds: true, segment: "private", type: "priority_fd", channel: "Online Banking / SC Mobile", notes: "Priority Private promotional reference. Fresh funds may be required. Verify final conditions directly with Standard Chartered.", source: "https://www.sc.com/sg/save/time-deposits/singapore-dollar-time-deposit/" }, { bank: "Maybank", package: "Standalone SGD Time Deposit Promotion", headlineRate: 1.30, effectiveRate: 1.30, tenure: 6, min: 20000, max: null, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Branches and online", notes: "Standalone time deposit promotional reference. Minimum placement S$20,000. Verify final terms directly with Maybank.", source: "https://www.maybank2u.com.sg/en/promotions/deposits/sgd-time-deposit.page" }, { bank: "Maybank", package: "Standalone SGD Time Deposit Promotion", headlineRate: 1.30, effectiveRate: 1.30, tenure: 9, min: 20000, max: null, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Branches and online", notes: "Standalone time deposit promotional reference. Minimum placement S$20,000. Verify final terms directly with Maybank.", source: "https://www.maybank2u.com.sg/en/promotions/deposits/sgd-time-deposit.page" }, { bank: "Maybank", package: "Deposit Bundle Promotion", headlineRate: 1.45, effectiveRate: 1.32, tenure: 12, min: 20000, max: null, freshFunds: true, segment: "personal", type: "bundle_fd", channel: "Branches and online", notes: "Headline rate and effective rate may differ because part of the placement may need to be earmarked in a savings or current account.", source: "https://www.maybank2u.com.sg/en/promotions/deposits/sgd-time-deposit.page" }, { bank: "Maybank", package: "6-month Deposit Bundle Promotion", headlineRate: 1.55, effectiveRate: 1.41, tenure: 6, min: 20000, max: null, freshFunds: true, segment: "personal", type: "bundle_fd", channel: "Branch only", notes: "Headline rate and effective rate may differ because part of the placement may need to be earmarked in a savings or current account.", source: "https://www.maybank2u.com.sg/en/promotions/deposits/sgd-time-deposit.page" }, { bank: "CIMB", package: "Online SGD Fixed Deposit Promo", headlineRate: 1.25, effectiveRate: 1.25, tenure: 3, min: 10000, max: null, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Online", notes: "Personal Banking online promotional reference for S$10,000 and above. Verify final terms directly with CIMB.", source: "https://www.cimb.com.sg/en/personal/banking-with-us/accounts/fixed-deposit/cimb-sgd-fixed-deposit-account.html" }, { bank: "CIMB", package: "Online SGD Fixed Deposit Promo", headlineRate: 1.30, effectiveRate: 1.30, tenure: 6, min: 10000, max: null, freshFunds: false, segment: "personal", type: "standard_fd", channel: "Online", notes: "Personal Banking online promotional reference for S$10,000 and above. Verify final terms directly with CIMB.", source: "https://www.cimb.com.sg/en/personal/banking-with-us/accounts/fixed-deposit/cimb-sgd-fixed-deposit-account.html" }, { bank: "CIMB", package: "Preferred Banking Online SGD Fixed Deposit Promo", headlineRate: 1.35, effectiveRate: 1.35, tenure: 12, min: 10000, max: null, freshFunds: false, segment: "priority", type: "priority_fd", channel: "Online", notes: "Preferred Banking online promotional reference for S$10,000 and above. Verify final terms directly with CIMB.", source: "https://www.cimb.com.sg/en/personal/banking-with-us/accounts/fixed-deposit/cimb-sgd-fixed-deposit-account.html" } ];function initUPropertyFixedDepositCalculator() { const amountEl = document.getElementById("upfdAmount"); const tenureEl = document.getElementById("upfdTenure"); const freshEl = document.getElementById("upfdFresh"); const segmentEl = document.getElementById("upfdSegment"); const packageTypeEl = document.getElementById("upfdPackageType"); const rateBasisEl = document.getElementById("upfdRateBasis"); const resultEl = document.getElementById("upfdResult"); const tableBody = document.getElementById("upfdTableBody"); const searchEl = document.getElementById("upfdSearch"); const tableTenureEl = document.getElementById("upfdTableTenure"); const tableTypeEl = document.getElementById("upfdTableType"); const sortEl = document.getElementById("upfdSort");if (!amountEl || !tenureEl || !freshEl || !segmentEl || !resultEl || !tableBody) { return; }function money(n) { return "S$" + Number(n || 0).toLocaleString("en-SG", { minimumFractionDigits: 0, maximumFractionDigits: 0 }); }function money2(n) { return "S$" + Number(n || 0).toLocaleString("en-SG", { minimumFractionDigits: 2, maximumFractionDigits: 2 }); }function pct(n) { return Number(n || 0).toFixed(2) + "% p.a."; }function segmentEligible(rowSegment, selected) { if (rowSegment === "personal") return true; if (rowSegment === "priority" && (selected === "priority" || selected === "private")) return true; if (rowSegment === "private" && selected === "private") return true; return false; }function segmentLabel(segment) { if (segment === "private") return "Private / Priority Private"; if (segment === "priority") return "Priority / Premier / Wealth"; return "Personal"; }function typeLabel(type) { if (type === "fresh_funds_fd") return "Fresh funds FD"; if (type === "bundle_fd") return "Bundle / earmarked"; if (type === "priority_fd") return "Priority / wealth"; return "Standard FD"; }function typeBadgeClass(type) { if (type === "fresh_funds_fd") return "gold"; if (type === "bundle_fd") return "red"; if (type === "priority_fd") return "grey"; return "green"; }function selectedPackageType() { return packageTypeEl ? packageTypeEl.value : "all"; }function selectedRateBasis() { return rateBasisEl ? rateBasisEl.value : "effective"; }function selectedTableType() { return tableTypeEl ? tableTypeEl.value : "all"; }function selectedSort() { return sortEl ? sortEl.value : "effectiveDesc"; }function selectedTableTenure() { return tableTenureEl ? tableTenureEl.value : "all"; }function selectedSearch() { return searchEl ? (searchEl.value || "").toLowerCase().trim() : ""; }function rateUsed(row) { return selectedRateBasis() === "headline" ? row.headlineRate : row.effectiveRate; }function isEligible(row, amount, tenure, fresh, segment, packageType) { if (amount < row.min) return false; if (row.max && amount > row.max) return false; if (tenure !== "all" && Number(tenure) !== row.tenure) return false; if (fresh === "no" && row.freshFunds) return false; if (!segmentEligible(row.segment, segment)) return false; if (packageType !== "all" && row.type !== packageType) return false; return true; }function estimatedInterest(amount, rate, tenure) { return amount * (rate / 100) * (tenure / 12); }function getEligible() { const amount = Number(amountEl.value || 0); const tenure = tenureEl.value || "all"; const fresh = freshEl.value || "yes"; const segment = segmentEl.value || "personal"; const packageType = selectedPackageType();return fdData .filter(function (row) { return isEligible(row, amount, tenure, fresh, segment, packageType); }) .sort(function (a, b) { return rateUsed(b) - rateUsed(a) || b.effectiveRate - a.effectiveRate || b.headlineRate - a.headlineRate || a.tenure - b.tenure; }); }function renderResult() { const amount = Number(amountEl.value || 0); const eligible = getEligible();if (!amount || amount < 1000) { resultEl.innerHTML = '
Input needed
' + '
Enter at least S$1,000
' + '
Most banks require a minimum placement amount. Try S$10,000, S$20,000 or S$50,000 for better comparison.
' + '
' + '
Rate used-
' + '
Estimated interest-
' + '
Maturity amount-
' + '
' + '

This calculator compares selected advertised references only.

'; return; }if (!eligible.length) { resultEl.innerHTML = '
No eligible tracked reference found
' + '
Try changing the filters
' + '
Your amount, tenure, fresh funds setting, customer segment or package type may not match the tracked references.
' + '
' + '
Rate used-
' + '
Estimated interest-
' + '
Maturity amount-
' + '
' + '

You may still qualify for other bank packages that are not currently tracked here.

'; return; }const best = eligible[0]; const usedRate = rateUsed(best); const interest = estimatedInterest(amount, usedRate, best.tenure); const maturity = amount + interest;resultEl.innerHTML = '
Highest eligible tracked reference
' + '
' + best.bank + '
' + '
' + best.package + '
' + best.channel + '
' + '
' + '
Rate used' + pct(usedRate) + '
' + '
Estimated interest' + money2(interest) + '
' + '
Maturity amount' + money2(maturity) + '
' + '
' + '
' + '' + best.tenure + ' months' + 'Min ' + money(best.min) + '' + '' + (best.freshFunds ? "Fresh funds required" : "Fresh funds not stated") + '' + '' + typeLabel(best.type) + '' + '
' + '

' + best.notes + ' This is not a recommendation. Always verify directly with the bank before placement.' + '

'; }function renderSummary() { const highestHeadlineEl = document.getElementById("upfdHighestHeadline"); const highestHeadlineNoteEl = document.getElementById("upfdHighestHeadlineNote"); const highestEffectiveEl = document.getElementById("upfdHighestEffective"); const highestEffectiveNoteEl = document.getElementById("upfdHighestEffectiveNote"); const lowestMinEl = document.getElementById("upfdLowestMin"); const lowestMinNoteEl = document.getElementById("upfdLowestMinNote"); const countEl = document.getElementById("upfdCount");const highestHeadline = fdData.slice().sort(function (a, b) { return b.headlineRate - a.headlineRate; })[0];const highestEffective = fdData.slice().sort(function (a, b) { return b.effectiveRate - a.effectiveRate; })[0];const lowest = fdData.slice().sort(function (a, b) { return a.min - b.min; })[0];if (highestHeadlineEl) highestHeadlineEl.textContent = pct(highestHeadline.headlineRate); if (highestHeadlineNoteEl) highestHeadlineNoteEl.textContent = highestHeadline.bank + " - " + highestHeadline.package;if (highestEffectiveEl) highestEffectiveEl.textContent = pct(highestEffective.effectiveRate); if (highestEffectiveNoteEl) highestEffectiveNoteEl.textContent = highestEffective.bank + " - " + highestEffective.package;if (lowestMinEl) lowestMinEl.textContent = money(lowest.min); if (lowestMinNoteEl) lowestMinNoteEl.textContent = lowest.bank + " - " + lowest.package;if (countEl) countEl.textContent = fdData.length; }function renderTable() { const q = selectedSearch(); const tenureFilter = selectedTableTenure(); const typeFilter = selectedTableType(); const sort = selectedSort();let rows = fdData.filter(function (row) { const text = [ row.bank, row.package, row.tenure + " months", row.channel, row.notes, row.freshFunds ? "fresh funds" : "no fresh funds", segmentLabel(row.segment), typeLabel(row.type) ].join(" ").toLowerCase();if (q && text.indexOf(q) === -1) return false; if (tenureFilter !== "all" && Number(tenureFilter) !== row.tenure) return false; if (typeFilter !== "all" && typeFilter !== row.type) return false;return true; });rows.sort(function (a, b) { if (sort === "headlineDesc") return b.headlineRate - a.headlineRate || b.effectiveRate - a.effectiveRate; if (sort === "tenureAsc") return a.tenure - b.tenure || b.effectiveRate - a.effectiveRate; if (sort === "minAsc") return a.min - b.min || b.effectiveRate - a.effectiveRate; if (sort === "bankAsc") return a.bank.localeCompare(b.bank) || a.tenure - b.tenure; return b.effectiveRate - a.effectiveRate || b.headlineRate - a.headlineRate; });tableBody.innerHTML = rows.map(function (row) { const maxText = row.max ? " to " + money(row.max) : " and above"; const effectiveText = row.effectiveRate !== row.headlineRate ? 'Effective: ' + pct(row.effectiveRate) + '' : "";return ( '' + '' + row.bank + '' + '' + row.package + '' + '' + pct(row.headlineRate) + '' + effectiveText + '' + '' + row.tenure + ' months' + '' + money(row.min) + maxText + '' + '' + '' + (row.freshFunds ? "Fresh funds" : "Fresh funds not stated") + '' + '' + segmentLabel(row.segment) + '' + '' + '' + typeLabel(row.type) + '' + '' + row.notes + '' + 'Official' + '' ); }).join(""); }function scenarioText() { const amount = Number(amountEl.value || 0); const eligible = getEligible();if (!eligible.length) { return [ "Fixed Deposit Scenario", "Amount: " + money(amount), "No eligible tracked reference found based on selected filters.", "Last checked: " + LAST_VERIFIED, "Note: Please verify latest fixed deposit terms directly with the bank." ].join("\n"); }const best = eligible[0]; const usedRate = rateUsed(best); const interest = estimatedInterest(amount, usedRate, best.tenure);return [ "Fixed Deposit Scenario", "Amount: " + money(amount), "Highest eligible tracked reference: " + best.bank + " - " + best.package, "Tenure: " + best.tenure + " months", "Rate used: " + pct(usedRate), "Estimated interest: " + money2(interest), "Estimated maturity amount: " + money2(amount + interest), "Fresh funds: " + (best.freshFunds ? "Required" : "Not stated"), "Package type: " + typeLabel(best.type), "Last checked: " + LAST_VERIFIED, "Note: This is not financial advice or a bank recommendation. Please verify final terms directly with the bank." ].join("\n"); }function copyScenario(callback) { const text = scenarioText();if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(text).then(function () { alert("Scenario copied. You can paste it into your enquiry or notes."); if (typeof callback === "function") callback(); }).catch(function () { alert(text); if (typeof callback === "function") callback(); }); } else { alert(text); if (typeof callback === "function") callback(); } }const calculateBtn = document.getElementById("upfdCalculate"); const resetBtn = document.getElementById("upfdReset"); const copyBtn = document.getElementById("upfdCopy"); const discussBtn = document.getElementById("upfdDiscuss");if (calculateBtn) { calculateBtn.addEventListener("click", function () { renderResult(); }); }if (resetBtn) { resetBtn.addEventListener("click", function () { amountEl.value = 50000; tenureEl.value = "all"; freshEl.value = "yes"; segmentEl.value = "personal";if (packageTypeEl) packageTypeEl.value = "all"; if (rateBasisEl) rateBasisEl.value = "effective"; if (searchEl) searchEl.value = ""; if (tableTenureEl) tableTenureEl.value = "all"; if (tableTypeEl) tableTypeEl.value = "all"; if (sortEl) sortEl.value = "effectiveDesc";renderResult(); renderTable(); }); }if (copyBtn) { copyBtn.addEventListener("click", function () { copyScenario(); }); }if (discussBtn) { discussBtn.addEventListener("click", function () { copyScenario(function () { window.open(CONTACT_URL, "_blank", "noopener"); }); }); }[searchEl, tableTenureEl, tableTypeEl, sortEl].forEach(function (el) { if (!el) return; el.addEventListener("input", renderTable); el.addEventListener("change", renderTable); });[amountEl, tenureEl, freshEl, segmentEl, packageTypeEl, rateBasisEl].forEach(function (el) { if (!el) return; el.addEventListener("input", renderResult); el.addEventListener("change", renderResult); });renderSummary(); renderResult(); renderTable(); }if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initUPropertyFixedDepositCalculator); } else { initUPropertyFixedDepositCalculator(); } })();