<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Free Mortgage Tools &amp; Calculators on Philippe Alexandre - Bilingual Mortgage Agent | Eastern Ontario</title>
    <link>https://new.philippealexandre.ca/tools/</link>
    <description>Recent content in Free Mortgage Tools &amp; Calculators on Philippe Alexandre - Bilingual Mortgage Agent | Eastern Ontario</description>
    <generator>Hugo</generator>
    <language>en</language>
    <atom:link href="https://new.philippealexandre.ca/tools/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Are You Mortgage-Ready? - Credit Readiness Quiz</title>
      <link>https://new.philippealexandre.ca/tools/credit-readiness-quiz/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/credit-readiness-quiz/</guid>
      <description>&lt;div id=&#34;cready-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var step=0, answers={}, feedback=[];&#xA;  var questions=[&#xA;    {q:&#39;What\&#39;s your approximate credit score?&#39;,id:&#39;score&#39;,opts:[&#xA;      {val:&#39;760+&#39;,label:&#39;760+&#39;,color:&#39;green&#39;,fb:&#39;Excellent - you qualify for the best rates.&#39;},&#xA;      {val:&#39;720&#39;,label:&#39;720-759&#39;,color:&#39;green&#39;,fb:&#39;Very good - you\&#39;ll get competitive rates.&#39;},&#xA;      {val:&#39;680&#39;,label:&#39;680-719&#39;,color:&#39;yellow&#39;,fb:&#39;Good, but a small improvement could save you thousands.&#39;},&#xA;      {val:&#39;660&#39;,label:&#39;660-679&#39;,color:&#39;yellow&#39;,fb:&#39;Fair - you\&#39;ll qualify but at a higher rate.&#39;},&#xA;      {val:&#39;620&#39;,label:&#39;620-659&#39;,color:&#39;red&#39;,fb:&#39;Below average - limited options, higher rates.&#39;},&#xA;      {val:&#39;low&#39;,label:&#39;Under 620&#39;,color:&#39;red&#39;,fb:&#39;You may need to improve before applying.&#39;}&#xA;    ]},&#xA;    {q:&#39;Have you missed any payments in the last 2 years?&#39;,id:&#39;missed&#39;,opts:[&#xA;      {val:&#39;no&#39;,label:&#39;No&#39;,color:&#39;green&#39;,fb:&#39;Great - clean payment history is the #1 factor.&#39;},&#xA;      {val:&#39;one&#39;,label:&#39;Yes, once&#39;,color:&#39;yellow&#39;,fb:&#39;One missed payment can drop your score 50-100 points. Time heals this.&#39;},&#xA;      {val:&#39;multiple&#39;,label:&#39;Yes, more than once&#39;,color:&#39;red&#39;,fb:&#39;Multiple missed payments are a red flag for lenders. Focus on 12 months of perfect payments.&#39;}&#xA;    ]},&#xA;    {q:&#39;What percentage of your credit card limits are you using?&#39;,id:&#39;utilization&#39;,opts:[&#xA;      {val:&#39;low&#39;,label:&#39;Under 30%&#39;,color:&#39;green&#39;,fb:&#39;Ideal - this is what lenders want to see.&#39;},&#xA;      {val:&#39;mid&#39;,label:&#39;30-50%&#39;,color:&#39;yellow&#39;,fb:&#39;Getting high. Pay down to under 30% for a quick score boost.&#39;},&#xA;      {val:&#39;high&#39;,label:&#39;50-75%&#39;,color:&#39;red&#39;,fb:&#39;High utilization hurts your score significantly.&#39;},&#xA;      {val:&#39;maxed&#39;,label:&#39;Over 75%&#39;,color:&#39;red&#39;,fb:&#39;Near-maxed cards are a major red flag. Prioritize paying these down.&#39;}&#xA;    ]},&#xA;    {q:&#39;How many active credit accounts do you have?&#39;,id:&#39;accounts&#39;,opts:[&#xA;      {val:&#39;none&#39;,label:&#39;0-1&#39;,color:&#39;yellow&#39;,fb:&#39;Thin file - lenders like to see 2-3 active tradelines.&#39;},&#xA;      {val:&#39;good&#39;,label:&#39;2-3&#39;,color:&#39;green&#39;,fb:&#39;Perfect range for mortgage qualification.&#39;},&#xA;      {val:&#39;many&#39;,label:&#39;4+&#39;,color:&#39;green&#39;,fb:&#39;Fine, as long as they\&#39;re managed well. Don\&#39;t close old ones.&#39;}&#xA;    ]},&#xA;    {q:&#39;Any collections, judgments, or bankruptcies?&#39;,id:&#39;derogatories&#39;,opts:[&#xA;      {val:&#39;none&#39;,label:&#39;None&#39;,color:&#39;green&#39;,fb:&#39;Clean record - no barriers here.&#39;},&#xA;      {val:&#39;old&#39;,label:&#39;Yes, but over 2 years ago&#39;,color:&#39;yellow&#39;,fb:&#39;Older items have less impact. Some lenders may still require explanation.&#39;},&#xA;      {val:&#39;recent&#39;,label:&#39;Yes, within the last 2 years&#39;,color:&#39;red&#39;,fb:&#39;Recent derogatories significantly limit options. We can discuss a timeline for recovery.&#39;}&#xA;    ]},&#xA;    {q:&#39;How long have you had your oldest credit account?&#39;,id:&#39;history&#39;,opts:[&#xA;      {val:&#39;long&#39;,label:&#39;5+ years&#39;,color:&#39;green&#39;,fb:&#39;Established history - very positive for lenders.&#39;},&#xA;      {val:&#39;mid&#39;,label:&#39;2-5 years&#39;,color:&#39;green&#39;,fb:&#39;Adequate history for mortgage qualification.&#39;},&#xA;      {val:&#39;short&#39;,label:&#39;Under 2 years&#39;,color:&#39;yellow&#39;,fb:&#39;Short credit history. Avoid closing any existing accounts.&#39;}&#xA;    ]}&#xA;  ];&#xA;&#xA;  function render(){&#xA;    var el=document.getElementById(&#39;cready-tool&#39;);&#xA;    if(step&lt;questions.length){&#xA;      var q=questions[step];&#xA;      var h=&#39;&lt;div class=&#34;quiz-progress&#34;&gt;Question &#39;+(step+1)+&#39; of &#39;+questions.length+&#39;&lt;/div&gt;&#39;;&#xA;      h+=&#39;&lt;h3&gt;&#39;+q.q+&#39;&lt;/h3&gt;&lt;div class=&#34;quiz-options&#34;&gt;&#39;;&#xA;      q.opts.forEach(function(o){&#xA;        h+=&#39;&lt;button class=&#34;quiz-opt&#34; onclick=&#34;crAnswer(\&#39;&#39;+q.id+&#39;\&#39;,\&#39;&#39;+o.val+&#39;\&#39;,\&#39;&#39;+o.color+&#39;\&#39;,\&#39;&#39;+o.fb.replace(/&#39;/g,&#34;\\&#39;&#34;)+&#39;\&#39;)&#34;&gt;&lt;span&gt;&#39;+o.label+&#39;&lt;/span&gt;&lt;/button&gt;&#39;;&#xA;      });&#xA;      h+=&#39;&lt;/div&gt;&#39;;&#xA;      if(step&gt;0)h+=&#39;&lt;button class=&#34;quiz-back&#34; onclick=&#34;crBack()&#34;&gt;← Back&lt;/button&gt;&#39;;&#xA;      el.innerHTML=h;&#xA;    } else { showReadiness(); }&#xA;  }&#xA;&#xA;  window.crAnswer=function(id,val,color,fb){&#xA;    answers[id]=val;&#xA;    feedback.push({id:id,q:questions[step].q,color:color,fb:fb});&#xA;    step++;render();&#xA;  };&#xA;  window.crBack=function(){step--;feedback.pop();render();};&#xA;&#xA;  function showReadiness(){&#xA;    var greens=feedback.filter(function(f){return f.color===&#39;green&#39;;}).length;&#xA;    var reds=feedback.filter(function(f){return f.color===&#39;red&#39;;}).length;&#xA;    var level, levelClass;&#xA;    if(reds===0&amp;&amp;greens&gt;=4){level=&#39;Ready&#39;;levelClass=&#39;green&#39;;}&#xA;    else if(reds&lt;=1){level=&#39;Almost Ready&#39;;levelClass=&#39;yellow&#39;;}&#xA;    else{level=&#39;Needs Work&#39;;levelClass=&#39;red&#39;;}&#xA;&#xA;    var el=document.getElementById(&#39;cready-tool&#39;);&#xA;    var h=&#39;&lt;div class=&#34;readiness-result&#34;&gt;&lt;div class=&#34;readiness-badge &#39;+levelClass+&#39;&#34;&gt;&#39;+level+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    h+=&#39;&lt;h4&gt;Your Credit Readiness Breakdown&lt;/h4&gt;&lt;div class=&#34;readiness-breakdown&#34;&gt;&#39;;&#xA;    feedback.forEach(function(f){&#xA;      h+=&#39;&lt;div class=&#34;rb-item&#34;&gt;&lt;span class=&#34;rb-dot &#39;+f.color+&#39;&#34;&gt;&lt;/span&gt;&lt;strong&gt;&#39;+f.q+&#39;&lt;/strong&gt;&lt;p&gt;&#39;+f.fb+&#39;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Does Your Full Income Count? - Income Qualification Comparison</title>
      <link>https://new.philippealexandre.ca/tools/income-qualifier/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/income-qualifier/</guid>
      <description>&lt;div id=&#34;inc-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var sources=[&#xA;    {id:&#39;employment&#39;,label:&#39;Employment Income (T4)&#39;,hint:&#39;Salary, wages, regular employment&#39;},&#xA;    {id:&#39;selfemploy&#39;,label:&#39;Self-Employment Income&#39;,hint:&#39;Business income (2-year average typically required)&#39;},&#xA;    {id:&#39;cppd&#39;,label:&#39;CPP Disability / Provincial Disability&#39;,hint:&#39;Canada Pension Plan Disability, ODSP, etc.&#39;},&#xA;    {id:&#39;ccb&#39;,label:&#39;Canada Child Benefit (CCB)&#39;,hint:&#39;Monthly tax-free benefit for families&#39;},&#xA;    {id:&#39;childsupport&#39;,label:&#39;Child Support / Spousal Support&#39;,hint:&#39;Court-ordered support payments received&#39;},&#xA;    {id:&#39;pension&#39;,label:&#39;Pension / CPP / OAS&#39;,hint:&#39;Retirement pension income&#39;},&#xA;    {id:&#39;ei&#39;,label:&#39;EI / Other Government&#39;,hint:&#39;Employment insurance, workers comp, etc.&#39;},&#xA;    {id:&#39;rental&#39;,label:&#39;Rental Income&#39;,hint:&#39;Income from rental properties you own&#39;}&#xA;  ];&#xA;  // Lender treatment rules (simplified for tool)&#xA;  var rules={&#xA;    conservative:{&#xA;      label:&#39;Most Conservative Lender&#39;,sublabel:&#39;Typical Big 6 Bank&#39;,&#xA;      employment:1.0, selfemploy:1.0, cppd:0.50, ccb:0, childsupport:1.0, pension:1.0, ei:0, rental:0.50&#xA;    },&#xA;    moderate:{&#xA;      label:&#39;Moderate Lender&#39;,sublabel:&#39;Credit Union / Some Banks&#39;,&#xA;      employment:1.0, selfemploy:1.0, cppd:1.0, ccb:0.50, childsupport:1.0, pension:1.0, ei:0, rental:0.50&#xA;    },&#xA;    flexible:{&#xA;      label:&#39;Most Flexible Lender&#39;,sublabel:&#39;Monoline / Alt-A Lender&#39;,&#xA;      employment:1.0, selfemploy:1.0, cppd:1.0, ccb:1.0, childsupport:1.0, pension:1.0, ei:0.50, rental:0.80&#xA;    }&#xA;  };&#xA;&#xA;  var html=&#39;&lt;h3&gt;Income Qualification Comparison&lt;/h3&gt;&#39;;&#xA;  html+=&#39;&lt;p class=&#34;tool-intro&#34;&gt;Enter all your income sources. We\&#39;ll show how different lenders treat each one.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Much Do You Know About Mortgages? - Basics Quiz</title>
      <link>https://new.philippealexandre.ca/tools/mortgage-basics-quiz/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/mortgage-basics-quiz/</guid>
      <description>&lt;div id=&#34;basics-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var qIdx=0, score=0, answers=[];&#xA;  var quiz=[&#xA;    {q:&#39;What\&#39;s the minimum down payment to buy a home under $500K in Canada?&#39;,opts:[&#39;5%&#39;,&#39;10%&#39;,&#39;20%&#39;,&#39;25%&#39;],correct:0,&#xA;     explain:&#39;The minimum is 5% for homes up to $500,000. Between $500K and $1,499,999, it\&#39;s 5% on the first $500K and 10% on the rest. At $1.5M+, you need 20%.&#39;},&#xA;    {q:&#39;Who typically pays the mortgage broker\&#39;s fee?&#39;,opts:[&#39;The buyer&#39;,&#39;The seller&#39;,&#39;The lender&#39;,&#39;The government&#39;],correct:2,&#xA;     explain:&#39;In most cases, the lender pays the broker\&#39;s commission when your mortgage funds. My services are free to you.&#39;},&#xA;    {q:&#39;What is the mortgage &#34;stress test&#34;?&#39;,opts:[&#39;A test of your stress levels&#39;,&#39;Qualifying at a higher rate than you\&#39;ll pay&#39;,&#39;A home inspection requirement&#39;,&#39;A credit check&#39;],correct:1,&#xA;     explain:&#39;You must qualify at the higher of your contract rate + 2% or the floor rate (currently 5.25%). This ensures you can handle rate increases.&#39;},&#xA;    {q:&#39;Fixed rate vs. variable - which has historically cost less over time in Canada?&#39;,opts:[&#39;Fixed&#39;,&#39;Variable&#39;,&#39;They\&#39;re about the same&#39;,&#39;It depends on the decade&#39;],correct:1,&#xA;     explain:&#39;Historically, variable rates have saved borrowers money more often than not. However, past performance doesn\&#39;t guarantee future results, and variable rates carry more risk of payment fluctuation.&#39;},&#xA;    {q:&#39;What is CMHC mortgage insurance?&#39;,opts:[&#39;Home insurance against fire/flood&#39;,&#39;Insurance that protects the lender if you default&#39;,&#39;Insurance that protects you if rates rise&#39;,&#39;Health insurance for homeowners&#39;],correct:1,&#xA;     explain:&#39;CMHC insurance protects the lender (not you) if you default. It\&#39;s required when your down payment is less than 20% and is added to your mortgage balance.&#39;},&#xA;    {q:&#39;At renewal, are you required to stay with your current lender?&#39;,opts:[&#39;Yes, it\&#39;s legally binding&#39;,&#39;Only if you have a fixed rate&#39;,&#39;No - you can switch lenders at no cost&#39;,&#39;Only with the bank\&#39;s permission&#39;],correct:2,&#xA;     explain:&#39;You are never locked in at renewal. Switching lenders at maturity is straightforward and typically comes with no legal fees for a standard transfer.&#39;},&#xA;    {q:&#39;What\&#39;s the most common mortgage term in Canada?&#39;,opts:[&#39;1 year&#39;,&#39;3 years&#39;,&#39;5 years&#39;,&#39;25 years&#39;],correct:2,&#xA;     explain:&#39;5 years is by far the most popular term. But &#34;term&#34; (the contract length) is different from &#34;amortization&#34; (the total repayment period, typically 25 years).&#39;},&#xA;    {q:&#39;Can a mortgage broker get you a lower rate than your bank?&#39;,opts:[&#39;Never&#39;,&#39;Sometimes&#39;,&#39;Usually&#39;,&#39;Always&#39;],correct:2,&#xA;     explain:&#39;Brokers typically access better rates than what banks offer directly because they provide volume to lenders and have access to monoline lenders who only sell through brokers. It\&#39;s not guaranteed, but in most cases I can beat your bank\&#39;s rate.&#39;}&#xA;  ];&#xA;&#xA;  function renderQ(){&#xA;    var el=document.getElementById(&#39;basics-tool&#39;);&#xA;    if(qIdx&lt;quiz.length){&#xA;      var q=quiz[qIdx];&#xA;      var h=&#39;&lt;div class=&#34;quiz-progress&#34;&gt;Question &#39;+(qIdx+1)+&#39; of &#39;+quiz.length+&#39;&lt;/div&gt;&#39;;&#xA;      h+=&#39;&lt;h3&gt;&#39;+q.q+&#39;&lt;/h3&gt;&lt;div class=&#34;quiz-options&#34;&gt;&#39;;&#xA;      q.opts.forEach(function(o,i){&#xA;        h+=&#39;&lt;button class=&#34;quiz-opt&#34; onclick=&#34;quizAnswer(&#39;+i+&#39;)&#34;&gt;&lt;span&gt;&#39;+o+&#39;&lt;/span&gt;&lt;/button&gt;&#39;;&#xA;      });&#xA;      h+=&#39;&lt;/div&gt;&#39;;&#xA;      el.innerHTML=h;&#xA;    } else { showScore(); }&#xA;  }&#xA;&#xA;  window.quizAnswer=function(idx){&#xA;    var q=quiz[qIdx];&#xA;    var correct=idx===q.correct;&#xA;    if(correct) score++;&#xA;    answers.push({q:q.q, correct:correct, explain:q.explain, userAnswer:q.opts[idx], rightAnswer:q.opts[q.correct]});&#xA;    // Show feedback briefly&#xA;    var el=document.getElementById(&#39;basics-tool&#39;);&#xA;    var h=&#39;&lt;div class=&#34;quiz-feedback &#39;+(correct?&#39;correct&#39;:&#39;wrong&#39;)+&#39;&#34;&gt;&#39;;&#xA;    h+=&#39;&lt;div class=&#34;qf-icon&#34;&gt;&#39;+(correct?&#39;✅&#39;:&#39;❌&#39;)+&#39;&lt;/div&gt;&#39;;&#xA;    h+=&#39;&lt;div class=&#34;qf-text&#34;&gt;&#39;+(correct?&#39;Correct!&#39;:&#39;Not quite - the answer is &lt;strong&gt;&#39;+q.opts[q.correct]+&#39;&lt;/strong&gt;&#39;)+&#39;&lt;/div&gt;&#39;;&#xA;    h+=&#39;&lt;p class=&#34;qf-explain&#34;&gt;&#39;+q.explain+&#39;&lt;/p&gt;</description>
    </item>
    <item>
      <title>How Much Home Can You Afford? - First-Time Buyer Calculator</title>
      <link>https://new.philippealexandre.ca/tools/first-time-buyer/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/first-time-buyer/</guid>
      <description>&lt;div id=&#34;ftb-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var html = &#39;&lt;h3&gt;Affordability &amp; Readiness Calculator&lt;/h3&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Gross Annual Household Income ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;f-income&#34; value=&#34;85000&#34; min=&#34;10000&#34; step=&#34;1000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Monthly Debt Payments ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;f-debts&#34; value=&#34;400&#34; min=&#34;0&#34; step=&#34;50&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;Car, student loan, credit card mins, etc.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Down Payment Saved ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;f-down&#34; value=&#34;30000&#34; min=&#34;0&#34; step=&#34;1000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Estimated Monthly Property Tax ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;f-tax&#34; value=&#34;250&#34; min=&#34;0&#34; step=&#34;25&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;$250/mo is a safe Eastern Ontario estimate.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;button class=&#34;btn btn-primary btn-block&#34; onclick=&#34;calcAfford()&#34;&gt;Calculate My Buying Power&lt;/button&gt;&#39;;&#xA;  html += &#39;&lt;div id=&#34;f-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;  document.getElementById(&#39;ftb-tool&#39;).innerHTML = html;&#xA;&#xA;  window.calcAfford = function() {&#xA;    var income=parseFloat(document.getElementById(&#39;f-income&#39;).value), debts=parseFloat(document.getElementById(&#39;f-debts&#39;).value);&#xA;    var down=parseFloat(document.getElementById(&#39;f-down&#39;).value), tax=parseFloat(document.getElementById(&#39;f-tax&#39;).value), heat=100;&#xA;    var mo=income/12, bestRate=RATES.insured.fixed[&#39;5yr&#39;], stressRate=Math.max(bestRate+2,RATES.stress_floor);&#xA;    var gdsAvail=mo*0.39-tax-heat, tdsAvail=mo*0.44-tax-heat-debts, maxPmt=Math.max(0,Math.min(gdsAvail,tdsAvail));&#xA;    var semi=Math.pow(1+stressRate/100/2,2), r=Math.pow(semi,1/12)-1, n=25*12;&#xA;    var maxMort=maxPmt*(Math.pow(1+r,n)-1)/(r*Math.pow(1+r,n));&#xA;    function getCMHC(d){if(d&gt;=20)return 0;if(d&gt;=15)return 2.80;if(d&gt;=10)return 3.10;return 4.00;}&#xA;    var dPct=(down/(maxMort+down))*100, cmhc=getCMHC(dPct);&#xA;    var maxPurchase=maxMort/(1+cmhc/100)+down;&#xA;    var fdPct=(down/maxPurchase)*100; cmhc=getCMHC(fdPct);&#xA;    var cmhcCost=(maxPurchase-down)*(cmhc/100), actMort=(maxPurchase-down)+cmhcCost;&#xA;    var actPmt=calcPayment(actMort,bestRate,25);&#xA;    var minDown5=Math.min(maxPurchase,500000)*0.05, minDown10=maxPurchase&gt;500000?(maxPurchase-500000)*0.10:0;&#xA;    var minDown=maxPurchase&gt;=1500000?maxPurchase*0.20:minDown5+minDown10;&#xA;    var gds=((actPmt+tax+heat)/mo)*100, tds=((actPmt+tax+heat+debts)/mo)*100;&#xA;    function ind(v,g,o){return v&gt;=g?&#39;&lt;span class=&#34;ind green&#34;&gt;✅ Strong&lt;/span&gt;&#39;:v&gt;=o?&#39;&lt;span class=&#34;ind yellow&#34;&gt;⚠️ Okay&lt;/span&gt;&#39;:&#39;&lt;span class=&#34;ind red&#34;&gt;❌ Needs Work&lt;/span&gt;&#39;;}&#xA;    function indL(v,g,o){return v&lt;=g?&#39;&lt;span class=&#34;ind green&#34;&gt;✅ Strong&lt;/span&gt;&#39;:v&lt;=o?&#39;&lt;span class=&#34;ind yellow&#34;&gt;⚠️ Tight&lt;/span&gt;&#39;:&#39;&lt;span class=&#34;ind red&#34;&gt;❌ Too High&lt;/span&gt;&#39;;}&#xA;&#xA;    var out=&#39;&lt;div class=&#34;afford-hero&#34;&gt;&lt;div class=&#34;afford-label&#34;&gt;You could afford up to&lt;/div&gt;&lt;div class=&#34;afford-amount&#34;&gt;&#39;+fmtInt(maxPurchase)+&#39;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;afford-sub&#34;&gt;with &#39;+fmtInt(down)+&#39; down at &#39;+bestRate.toFixed(2)+&#39;% (stress tested at &#39;+stressRate.toFixed(2)+&#39;%)&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-grid&#34;&gt;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Est. Monthly Payment&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+fmt(actPmt)+&#39;&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;at &#39;+bestRate.toFixed(2)+&#39;%&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Down Payment&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+fdPct.toFixed(1)+&#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+fmtInt(down)+&#39;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    if(cmhc&gt;0){out+=&#39;&lt;div class=&#34;result-grid&#34;&gt;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;CMHC Insurance&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+fmtInt(cmhcCost)+&#39;&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+cmhc.toFixed(2)+&#39;% premium&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Total Mortgage&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+fmtInt(actMort)+&#39;&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;Incl. CMHC&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#39;;}&#xA;    out+=&#39;&lt;h4&gt;Readiness Checklist&lt;/h4&gt;&lt;div class=&#34;readiness-list&#34;&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Down Payment&lt;/span&gt;&#39;+ind(fdPct,20,10)+&#39;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;GDS Ratio&lt;/span&gt;&#39;+indL(gds,30,39)+&#39;&lt;span class=&#34;ri-val&#34;&gt;&#39;+gds.toFixed(1)+&#39;%&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;TDS Ratio&lt;/span&gt;&#39;+indL(tds,35,44)+&#39;&lt;span class=&#34;ri-val&#34;&gt;&#39;+tds.toFixed(1)+&#39;%&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Min. Down Payment Met&lt;/span&gt;&#39;+(down&gt;=minDown?&#39;&lt;span class=&#34;ind green&#34;&gt;✅ Yes&lt;/span&gt;&#39;:&#39;&lt;span class=&#34;ind red&#34;&gt;❌ Need &#39;+fmtInt(minDown)+&#39;&lt;/span&gt;&#39;)+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;tool-cta&#34;&gt;&lt;p&gt;&lt;strong&gt;Ready to make it official?&lt;/strong&gt; A pre-qualification takes 15 minutes - no credit check, no application, just answers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mortgage Renewal Comparison - Is Your Bank&#39;s Offer Fair?</title>
      <link>https://new.philippealexandre.ca/tools/renewal-comparison/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/renewal-comparison/</guid>
      <description>&lt;div id=&#34;renewal-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var terms = [&#39;1yr&#39;,&#39;2yr&#39;,&#39;3yr&#39;,&#39;4yr&#39;,&#39;5yr&#39;,&#39;7yr&#39;,&#39;10yr&#39;];&#xA;  var termLabels = {&#39;1yr&#39;:&#39;1 Year&#39;,&#39;2yr&#39;:&#39;2 Years&#39;,&#39;3yr&#39;:&#39;3 Years&#39;,&#39;4yr&#39;:&#39;4 Years&#39;,&#39;5yr&#39;:&#39;5 Years&#39;,&#39;7yr&#39;:&#39;7 Years&#39;,&#39;10yr&#39;:&#39;10 Years&#39;};&#xA;&#xA;  var html = &#39;&lt;h3&gt;Compare Your Bank\&#39;s Renewal Offer&lt;/h3&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Mortgage Balance ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;r-balance&#34; value=&#34;300000&#34; min=&#34;10000&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Remaining Amortization (years)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;r-amort&#34; value=&#34;20&#34; min=&#34;1&#34; max=&#34;30&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Bank\&#39;s Offered Rate (%)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;r-bank-rate&#34; value=&#34;4.99&#34; min=&#34;0.5&#34; max=&#34;15&#34; step=&#34;0.01&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Rate Type&lt;/label&gt;&lt;select id=&#34;r-type&#34;&gt;&lt;option value=&#34;fixed&#34;&gt;Fixed&lt;/option&gt;&lt;option value=&#34;variable&#34;&gt;Variable&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Term Length&lt;/label&gt;&lt;select id=&#34;r-term&#34;&gt;&#39;;&#xA;  terms.forEach(function(t){ html += &#39;&lt;option value=&#34;&#39;+t+&#39;&#34;&#39;+(t===&#39;5yr&#39;?&#39; selected&#39;:&#39;&#39;)+&#39;&gt;&#39;+termLabels[t]+&#39;&lt;/option&gt;&#39;; });&#xA;  html += &#39;&lt;/select&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Is Your Mortgage Insured?&lt;/label&gt;&lt;select id=&#34;r-insured&#34;&gt;&lt;option value=&#34;insured&#34;&gt;Yes (down payment was under 20%)&lt;/option&gt;&lt;option value=&#34;uninsured&#34;&gt;No (down payment was 20%+)&lt;/option&gt;&lt;option value=&#34;both&#34;&gt;Not sure&lt;/option&gt;&lt;/select&gt;&#39;;&#xA;  html += &#39;&lt;span class=&#34;tf-hint&#34;&gt;Your mortgage is insured if your original down payment was less than 20%.&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;button class=&#34;btn btn-primary btn-block&#34; onclick=&#34;calcRenewal()&#34;&gt;Compare Rates&lt;/button&gt;&#39;;&#xA;  html += &#39;&lt;div id=&#34;r-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;&#xA;  document.getElementById(&#39;renewal-tool&#39;).innerHTML = html;&#xA;&#xA;  window.calcRenewal = function() {&#xA;    var bal = parseFloat(document.getElementById(&#39;r-balance&#39;).value);&#xA;    var amort = parseInt(document.getElementById(&#39;r-amort&#39;).value);&#xA;    var bankRate = parseFloat(document.getElementById(&#39;r-bank-rate&#39;).value);&#xA;    var rateType = document.getElementById(&#39;r-type&#39;).value;&#xA;    var term = document.getElementById(&#39;r-term&#39;).value;&#xA;    var insStatus = document.getElementById(&#39;r-insured&#39;).value;&#xA;&#xA;    function getRate(ins) {&#xA;      if (rateType === &#39;variable&#39;) return RATES[ins].variable;&#xA;      return RATES[ins].fixed[term] || RATES[ins].fixed[&#39;5yr&#39;];&#xA;    }&#xA;&#xA;    function buildComparison(ins, label) {&#xA;      var brokerRate = getRate(ins);&#xA;      var bankPmt = calcPayment(bal, bankRate, amort);&#xA;      var brokerPmt = calcPayment(bal, brokerRate, amort);&#xA;      var monthlySave = bankPmt - brokerPmt;&#xA;      var termMonths = parseInt(term) * 12;&#xA;      var termSave = monthlySave * termMonths;&#xA;      var totalSave = monthlySave * amort * 12;&#xA;&#xA;      var s = &#39;&#39;;&#xA;      if (label) s += &#39;&lt;h4&gt;&#39; + label + &#39;&lt;/h4&gt;&#39;;&#xA;      s += &#39;&lt;div class=&#34;result-grid&#34;&gt;&#39;;&#xA;      s += &#39;&lt;div class=&#34;result-box bank&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Your Bank\&#39;s Offer&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + bankRate.toFixed(2) + &#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39; + fmt(bankPmt) + &#39;/mo&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;      s += &#39;&lt;div class=&#34;result-box broker&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Best Available Rate&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + brokerRate.toFixed(2) + &#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39; + fmt(brokerPmt) + &#39;/mo&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;      s += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;      if (monthlySave &gt; 0) {&#xA;        s += &#39;&lt;div class=&#34;savings-banner&#34;&gt;&#39;;&#xA;        s += &#39;&lt;div class=&#34;savings-big&#34;&gt;&#39; + fmtInt(termSave) + &#39;&lt;/div&gt;&#39;;&#xA;        s += &#39;&lt;div class=&#34;savings-label&#34;&gt;estimated savings over your &#39; + termLabels[term].toLowerCase() + &#39; term&lt;/div&gt;&#39;;&#xA;        s += &#39;&lt;div class=&#34;savings-detail&#34;&gt;&#39; + fmt(monthlySave) + &#39;/month · &#39; + fmtInt(totalSave) + &#39; over remaining amortization&lt;/div&gt;&#39;;&#xA;        s += &#39;&lt;/div&gt;&#39;;&#xA;      } else {&#xA;        s += &#39;&lt;div class=&#34;savings-banner good&#34;&gt;&lt;div class=&#34;savings-label&#34;&gt;Your bank\&#39;s offer looks competitive! But it\&#39;s still worth a conversation - I may be able to find better terms even at a similar rate.&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;      }&#xA;      return s;&#xA;    }&#xA;&#xA;    var out = &#39;&#39;;&#xA;    if (insStatus === &#39;both&#39;) {&#xA;      out += buildComparison(&#39;insured&#39;, &#39;If Your Mortgage Is Insured&#39;);&#xA;      out += buildComparison(&#39;uninsured&#39;, &#39;If Your Mortgage Is Uninsured&#39;);&#xA;    } else {&#xA;      out += buildComparison(insStatus, &#39;&#39;);&#xA;    }&#xA;&#xA;    out += &#39;&lt;div class=&#34;tool-cta&#34;&gt;&#39;;&#xA;    out += &#39;&lt;p&gt;&lt;strong&gt;Want me to lock in the better rate?&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pre-Approval Sanity Check - Is Your Buying Range Safe?</title>
      <link>https://new.philippealexandre.ca/tools/pre-approval-check/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/pre-approval-check/</guid>
      <description>&lt;div id=&#34;pa-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var html = &#39;&lt;h3&gt;Offer Safety Range Tool&lt;/h3&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Pre-Approved Amount ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;p-preapproval&#34; value=&#34;450000&#34; min=&#34;50000&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Down Payment ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;p-down&#34; value=&#34;50000&#34; min=&#34;0&#34; step=&#34;1000&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Gross Annual Household Income ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;p-income&#34; value=&#34;95000&#34; min=&#34;10000&#34; step=&#34;1000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Monthly Debt Payments ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;p-debts&#34; value=&#34;350&#34; min=&#34;0&#34; step=&#34;50&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Interest Rate on Pre-Approval (%)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;p-rate&#34; value=&#34;4.79&#34; min=&#34;0.5&#34; max=&#34;15&#34; step=&#34;0.01&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Monthly Property Tax Estimate ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;p-tax&#34; value=&#34;275&#34; min=&#34;0&#34; step=&#34;25&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;button class=&#34;btn btn-primary btn-block&#34; onclick=&#34;calcPA()&#34;&gt;Check My Range&lt;/button&gt;&#39;;&#xA;  html += &#39;&lt;div id=&#34;p-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;  document.getElementById(&#39;pa-tool&#39;).innerHTML = html;&#xA;&#xA;  window.calcPA = function() {&#xA;    var preApp=parseFloat(document.getElementById(&#39;p-preapproval&#39;).value);&#xA;    var down=parseFloat(document.getElementById(&#39;p-down&#39;).value);&#xA;    var income=parseFloat(document.getElementById(&#39;p-income&#39;).value);&#xA;    var debts=parseFloat(document.getElementById(&#39;p-debts&#39;).value);&#xA;    var rate=parseFloat(document.getElementById(&#39;p-rate&#39;).value);&#xA;    var tax=parseFloat(document.getElementById(&#39;p-tax&#39;).value), heat=100;&#xA;    var mo=income/12;&#xA;    var mortgage=preApp-down;&#xA;    var pmt=calcPayment(mortgage,rate,25);&#xA;    var totalHousing=pmt+tax+heat;&#xA;    var gds=(totalHousing/mo)*100;&#xA;    var tds=((totalHousing+debts)/mo)*100;&#xA;&#xA;    // Ranges based on GDS&#xA;    var safeMax=mo*0.30; // 30% = comfortable&#xA;    var stretchMax=mo*0.39; // 39% = GDS limit&#xA;    function priceFromHousing(housingBudget){&#xA;      var pmtBudget=housingBudget-tax-heat;&#xA;      if(pmtBudget&lt;=0)return down;&#xA;      var semi=Math.pow(1+rate/100/2,2),r=Math.pow(semi,1/12)-1,n=25*12;&#xA;      var mort=pmtBudget*(Math.pow(1+r,n)-1)/(r*Math.pow(1+r,n));&#xA;      return mort+down;&#xA;    }&#xA;    var safePrice=priceFromHousing(safeMax);&#xA;    var stretchPrice=priceFromHousing(stretchMax);&#xA;    var bestRate=RATES.insured.fixed[&#39;5yr&#39;];&#xA;    var rateHigh=rate&gt;bestRate+0.25;&#xA;&#xA;    var out=&#39;&lt;div class=&#34;range-visual&#34;&gt;&lt;div class=&#34;range-bar&#34;&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;range-zone safe&#34; style=&#34;flex:3&#34;&gt;&lt;span&gt;Safe Zone&lt;/span&gt;&lt;span class=&#34;range-price&#34;&gt;Up to &#39;+fmtInt(safePrice)+&#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;range-zone stretch&#34; style=&#34;flex:1&#34;&gt;&lt;span&gt;Stretch&lt;/span&gt;&lt;span class=&#34;range-price&#34;&gt;Up to &#39;+fmtInt(stretchPrice)+&#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;range-zone danger&#34; style=&#34;flex:1&#34;&gt;&lt;span&gt;Danger&lt;/span&gt;&lt;span class=&#34;range-price&#34;&gt;Above &#39;+fmtInt(stretchPrice)+&#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;/div&gt;&#39;;&#xA;    var markerPos=Math.min(100,Math.max(0,(preApp/stretchPrice)*80));&#xA;    out+=&#39;&lt;div class=&#34;range-marker&#34; style=&#34;left:&#39;+markerPos+&#39;%&#34;&gt;▲ Your pre-approval: &#39;+fmtInt(preApp)+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;&#xA;    out+=&#39;&lt;div class=&#34;result-grid three&#34;&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Your GDS Ratio&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+gds.toFixed(1)+&#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+(gds&lt;=32?&#39;Comfortable&#39;:gds&lt;=39?&#39;Acceptable but tight&#39;:&#39;Over limit&#39;)+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Your TDS Ratio&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+tds.toFixed(1)+&#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+(tds&lt;=38?&#39;Comfortable&#39;:tds&lt;=44?&#39;Acceptable but tight&#39;:&#39;Over limit&#39;)+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Monthly at Pre-Approval&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+fmt(pmt)+&#39;&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;P+I only (add tax + heat)&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;/div&gt;&#39;;&#xA;&#xA;    if(rateHigh){&#xA;      out+=&#39;&lt;div class=&#34;info-note&#34;&gt;⚠️ &lt;strong&gt;Your pre-approval rate (&#39;+rate.toFixed(2)+&#39;%) is above the best currently available rate (&#39;+bestRate.toFixed(2)+&#39;%).&lt;/strong&gt; You may be able to get a better rate - which increases your safe range. Worth a second opinion.&lt;/div&gt;&#39;;&#xA;    }&#xA;&#xA;    out+=&#39;&lt;div class=&#34;tool-cta&#34;&gt;&lt;p&gt;&lt;strong&gt;Want a second set of eyes on your pre-approval?&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick Rental Profitability Check - Is the Cash Flow There?</title>
      <link>https://new.philippealexandre.ca/tools/rental-profitability/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/rental-profitability/</guid>
      <description>&lt;div id=&#34;rp-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;&#xA;  /* ---------- helpers ---------- */&#xA;  function parseNum(id) {&#xA;    var el = document.getElementById(id);&#xA;    if (!el) return 0;&#xA;    return parseFloat(el.value) || 0;&#xA;  }&#xA;  function fmtDollar(n) { return &#39;$&#39; + Math.round(Math.abs(n)).toLocaleString(&#39;en-CA&#39;); }&#xA;  function fmtDollarSigned(n) { return (n &gt;= 0 ? &#39;+&#39; : &#39;\u2212&#39;) + &#39;$&#39; + Math.round(Math.abs(n)).toLocaleString(&#39;en-CA&#39;); }&#xA;&#xA;  /* ---------- build form ---------- */&#xA;  var html = &#39;&#39;;&#xA;&#xA;  /* Tier 1 - Primary fields */&#xA;  html += &#39;&lt;div class=&#34;tf-section-label&#34;&gt;Property Details&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Asking Price ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;rp-price&#34; placeholder=&#34;450000&#34; min=&#34;0&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Number of Units&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;rp-units&#34; placeholder=&#34;2&#34; min=&#34;1&#34; step=&#34;1&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;Defaults to 2 if left blank&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Total Monthly Rent ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;rp-rent&#34; placeholder=&#34;3200&#34; min=&#34;0&#34; step=&#34;100&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;All units combined&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Annual Municipal Taxes ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;rp-taxes&#34; placeholder=&#34;4500&#34; min=&#34;0&#34; step=&#34;100&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;  /* Tier 2 - Optional fields */&#xA;  html += &#39;&lt;div class=&#34;tf-section-label&#34; style=&#34;color:var(--gray-500);font-weight:500&#34;&gt;Optional - if applicable&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Monthly Heating Cost ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;rp-heating&#34; value=&#34;0&#34; min=&#34;0&#34; step=&#34;25&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;If landlord pays. Default 0 = tenant pays.&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Monthly Condo Fees ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;rp-condo&#34; value=&#34;0&#34; min=&#34;0&#34; step=&#34;25&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;If applicable. Default 0 = no condo fees.&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;  /* Button */&#xA;  html += &#39;&lt;button class=&#34;btn btn-primary btn-block&#34; id=&#34;rp-btn&#34; disabled style=&#34;opacity:0.4;cursor:not-allowed&#34; onclick=&#34;calcRental()&#34;&gt;Analyze Profitability&lt;/button&gt;&#39;;&#xA;  html += &#39;&lt;div id=&#34;rp-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;&#xA;  document.getElementById(&#39;rp-tool&#39;).innerHTML = html;&#xA;&#xA;  /* ---------- progressive activation ---------- */&#xA;  var fields = [&#39;rp-price&#39;, &#39;rp-units&#39;, &#39;rp-rent&#39;, &#39;rp-taxes&#39;, &#39;rp-heating&#39;, &#39;rp-condo&#39;];&#xA;  fields.forEach(function(id) {&#xA;    document.getElementById(id).addEventListener(&#39;input&#39;, checkReady);&#xA;  });&#xA;&#xA;  function checkReady() {&#xA;    var price = parseNum(&#39;rp-price&#39;);&#xA;    var rent = parseNum(&#39;rp-rent&#39;);&#xA;    var taxes = parseNum(&#39;rp-taxes&#39;);&#xA;    var btn = document.getElementById(&#39;rp-btn&#39;);&#xA;    if (price &gt; 0 &amp;&amp; rent &gt; 0 &amp;&amp; taxes &gt; 0) {&#xA;      btn.disabled = false;&#xA;      btn.style.opacity = &#39;1&#39;;&#xA;      btn.style.cursor = &#39;pointer&#39;;&#xA;    } else {&#xA;      btn.disabled = true;&#xA;      btn.style.opacity = &#39;0.4&#39;;&#xA;      btn.style.cursor = &#39;not-allowed&#39;;&#xA;    }&#xA;  }&#xA;&#xA;  /* ---------- calculation ---------- */&#xA;  window.calcRental = function() {&#xA;    var btn = document.getElementById(&#39;rp-btn&#39;);&#xA;    if (btn.disabled) return;&#xA;&#xA;    var price = parseNum(&#39;rp-price&#39;);&#xA;    var units = parseInt(document.getElementById(&#39;rp-units&#39;).value) || 2;&#xA;    var monthlyRent = parseNum(&#39;rp-rent&#39;);&#xA;    var taxes = parseNum(&#39;rp-taxes&#39;);&#xA;    var monthlyHeating = parseNum(&#39;rp-heating&#39;);&#xA;    var monthlyCondoFees = parseNum(&#39;rp-condo&#39;);&#xA;&#xA;    /* Revenue */&#xA;    var grossAnnual = monthlyRent * 12;&#xA;    var vacancy = grossAnnual * 0.05;&#xA;&#xA;    /* Expenses */&#xA;    var insurance = units &lt;= 4 ? 1200 : units &lt;= 6 ? 1800 : 2400;&#xA;    var heatingAnnual = monthlyHeating * 12;&#xA;    var condoFeesAnnual = monthlyCondoFees * 12;&#xA;    var management = grossAnnual * 0.03;&#xA;    var maintenance = 500 * units;&#xA;    var totalExpenses = taxes + insurance + heatingAnnual + condoFeesAnnual + vacancy + management + maintenance;&#xA;&#xA;    /* NOI */&#xA;    var noi = grossAnnual - totalExpenses;&#xA;&#xA;    /* Mortgage - Canadian semi-annual compounding */&#xA;    var rateAnnual = units &lt;= 4 ? 0.0655 : 0.0705;&#xA;    var ratePct = (rateAnnual * 100).toFixed(2);&#xA;    var rMonthly = Math.pow(1 + rateAnnual / 2, 1 / 6) - 1;&#xA;    var n = 360;&#xA;&#xA;    /* Scenario 1: 100% Financed */&#xA;    var loan100 = price;&#xA;    var pmt100 = loan100 * (rMonthly * Math.pow(1 + rMonthly, n)) / (Math.pow(1 + rMonthly, n) - 1);&#xA;    var annualDebt100 = pmt100 * 12;&#xA;    var net100 = noi - annualDebt100;&#xA;&#xA;    /* Scenario 2: 80% Financed */&#xA;    var loan80 = price * 0.80;&#xA;    var pmt80 = loan80 * (rMonthly * Math.pow(1 + rMonthly, n)) / (Math.pow(1 + rMonthly, n) - 1);&#xA;    var annualDebt80 = pmt80 * 12;&#xA;    var net80 = noi - annualDebt80;&#xA;&#xA;    /* ---------- build results ---------- */&#xA;    var out = &#39;&#39;;&#xA;&#xA;    /* Verdict cards */&#xA;    out += &#39;&lt;div class=&#34;result-grid&#34; style=&#34;margin-top:1.5rem&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-box &#39; + (net100 &gt;= 0 ? &#39;broker&#39; : &#39;bank&#39;) + &#39;&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rl&#34;&gt;100% Financed (Worst Case)&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div style=&#34;font-size:0.78rem;color:var(--gray-500);margin-bottom:0.5rem&#34;&gt;No down payment credit&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rv&#34;&gt;&#39; + fmtDollarSigned(net100 / 12) + &#39;/mo&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rd&#34;&gt;&#39; + fmtDollarSigned(net100) + &#39;/year&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    out += &#39;&lt;div class=&#34;result-box &#39; + (net80 &gt;= 0 ? &#39;broker&#39; : &#39;bank&#39;) + &#39;&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rl&#34;&gt;80% Financed (20% Down)&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div style=&#34;font-size:0.78rem;color:var(--gray-500);margin-bottom:0.5rem&#34;&gt;Standard investment purchase&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rv&#34;&gt;&#39; + fmtDollarSigned(net80 / 12) + &#39;/mo&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rd&#34;&gt;&#39; + fmtDollarSigned(net80) + &#39;/year&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    /* Shared breakdown: Revenue */&#xA;    out += &#39;&lt;h4 style=&#34;margin-top:1.5rem&#34;&gt;Revenue&lt;/h4&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-list&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Gross Annual Rent&lt;/span&gt;&lt;span class=&#34;ri-val&#34;&gt;&#39; + fmtDollar(grossAnnual) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Vacancy Allowance (5%)&lt;/span&gt;&lt;span class=&#34;ri-val&#34; style=&#34;color:#c0392b&#34;&gt;\u2212&#39; + fmtDollar(vacancy) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    /* Shared breakdown: Operating Expenses */&#xA;    out += &#39;&lt;h4&gt;Operating Expenses&lt;/h4&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-list&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Municipal Taxes&lt;/span&gt;&lt;span class=&#34;ri-val&#34;&gt;&#39; + fmtDollar(taxes) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Insurance (assumed)&lt;/span&gt;&lt;span class=&#34;ri-val&#34;&gt;&#39; + fmtDollar(insurance) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    if (monthlyHeating &gt; 0) {&#xA;      out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Heating (landlord)&lt;/span&gt;&lt;span class=&#34;ri-val&#34;&gt;&#39; + fmtDollar(heatingAnnual) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    }&#xA;    if (monthlyCondoFees &gt; 0) {&#xA;      out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Condo Fees&lt;/span&gt;&lt;span class=&#34;ri-val&#34;&gt;&#39; + fmtDollar(condoFeesAnnual) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    }&#xA;    out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Management (3%)&lt;/span&gt;&lt;span class=&#34;ri-val&#34;&gt;&#39; + fmtDollar(management) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-item&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Maintenance ($500/door)&lt;/span&gt;&lt;span class=&#34;ri-val&#34;&gt;&#39; + fmtDollar(maintenance) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;readiness-item&#34; style=&#34;font-weight:700;border-top:2px solid var(--gray-300)&#34;&gt;&lt;span class=&#34;ri-label&#34;&gt;Total Expenses&lt;/span&gt;&lt;span class=&#34;ri-val&#34; style=&#34;font-weight:700&#34;&gt;&#39; + fmtDollar(totalExpenses) + &#39;&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    /* NOI */&#xA;    out += &#39;&lt;div class=&#34;savings-banner&#39; + (noi &gt;= 0 ? &#39; good&#39; : &#39;&#39;) + &#39;&#34; style=&#34;margin:1.25rem 0&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;savings-label&#34;&gt;Net Operating Income (NOI)&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;savings-big&#34;&gt;&#39; + fmtDollarSigned(noi) + &#39;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;savings-detail&#34;&gt;per year&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    /* Dual debt service comparison */&#xA;    out += &#39;&lt;h4&gt;Debt Service Comparison&lt;/h4&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-grid&#34;&gt;&#39;;&#xA;&#xA;    out += &#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;100% Financed&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div style=&#34;font-size:0.85rem;margin:0.5rem 0&#34;&gt;&lt;span style=&#34;color:var(--gray-500)&#34;&gt;Loan:&lt;/span&gt; &#39; + fmtDollar(loan100) + &#39;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div style=&#34;font-size:0.85rem;margin-bottom:0.5rem&#34;&gt;&lt;span style=&#34;color:var(--gray-500)&#34;&gt;Annual Payment:&lt;/span&gt; &#39; + fmtDollar(annualDebt100) + &#39;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rv&#34; style=&#34;&#39; + (net100 &gt;= 0 ? &#39;color:#27ae60&#39; : &#39;color:#c0392b&#39;) + &#39;&#34;&gt;&#39; + fmtDollarSigned(net100) + &#39;/yr&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    out += &#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;80% Financed&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div style=&#34;font-size:0.85rem;margin:0.5rem 0&#34;&gt;&lt;span style=&#34;color:var(--gray-500)&#34;&gt;Loan:&lt;/span&gt; &#39; + fmtDollar(loan80) + &#39;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div style=&#34;font-size:0.85rem;margin-bottom:0.5rem&#34;&gt;&lt;span style=&#34;color:var(--gray-500)&#34;&gt;Annual Payment:&lt;/span&gt; &#39; + fmtDollar(annualDebt80) + &#39;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;rv&#34; style=&#34;&#39; + (net80 &gt;= 0 ? &#39;color:#27ae60&#39; : &#39;color:#c0392b&#39;) + &#39;&#34;&gt;&#39; + fmtDollarSigned(net80) + &#39;/yr&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div style=&#34;text-align:center;font-size:0.78rem;color:var(--gray-500);margin-top:-0.5rem;margin-bottom:1.25rem&#34;&gt;@ &#39; + ratePct + &#39;% qualifying rate &amp;middot; 30yr amortization &amp;middot; semi-annual compounding&lt;/div&gt;&#39;;&#xA;&#xA;    /* Assumptions box */&#xA;    out += &#39;&lt;div class=&#34;info-note&#34; style=&#34;font-size:0.82rem;margin:1.25rem 0&#34;&gt;&#39;;&#xA;    out += &#39;&lt;strong&gt;Built-in assumptions:&lt;/strong&gt; Qualifying rate &#39; + ratePct + &#39;% (&#39; + (units &lt;= 4 ? &#39;1-4 units&#39; : &#39;5+ units&#39;) + &#39;) &amp;middot; 30-year amortization &amp;middot; Semi-annual compounding &amp;middot; 5% vacancy &amp;amp; bad debt &amp;middot; 3% management fee &amp;middot; $500/door/year maintenance &amp;middot; Insurance $&#39; + insurance.toLocaleString(&#39;en-CA&#39;) + &#39;/yr assumed&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    /* CTA */&#xA;    out += &#39;&lt;div class=&#34;tool-cta&#34; style=&#34;border-top:1px solid var(--gray-200);padding-top:2rem;margin-top:1.5rem&#34;&gt;&#39;;&#xA;    out += &#39;&lt;p&gt;This is a quick approximation using stress-test assumptions.&lt;br&gt;Your actual rate, down payment, and lender will change these numbers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Should You Break Your Mortgage? - Break-or-Wait Analyzer</title>
      <link>https://new.philippealexandre.ca/tools/break-or-wait/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/break-or-wait/</guid>
      <description>&lt;div id=&#34;break-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  // Build lender dropdown with optgroups&#xA;  var lenderOpts = &#39;&#39;;&#xA;  var groups = {};&#xA;  LENDERS.forEach(function(l) {&#xA;    if (!groups[l.group]) groups[l.group] = [];&#xA;    groups[l.group].push(l);&#xA;  });&#xA;  Object.keys(groups).forEach(function(g) {&#xA;    lenderOpts += &#39;&lt;optgroup label=&#34;&#39; + g + &#39;&#34;&gt;&#39;;&#xA;    groups[g].forEach(function(l) {&#xA;      lenderOpts += &#39;&lt;option value=&#34;&#39; + l.name + &#39;&#34;&gt;&#39; + l.name + &#39;&lt;/option&gt;&#39;;&#xA;    });&#xA;    lenderOpts += &#39;&lt;/optgroup&gt;&#39;;&#xA;  });&#xA;&#xA;  var terms = [&#39;1yr&#39;,&#39;2yr&#39;,&#39;3yr&#39;,&#39;4yr&#39;,&#39;5yr&#39;,&#39;7yr&#39;,&#39;10yr&#39;];&#xA;&#xA;  var html = &#39;&lt;h3&gt;Break-or-Wait Analyzer&lt;/h3&gt;&#39;;&#xA;&#xA;  // Step 1: Basic info&#xA;  html += &#39;&lt;div class=&#34;tf-section-label&#34;&gt;Your Current Mortgage&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Current Mortgage Balance ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;b-balance&#34; value=&#34;300000&#34; min=&#34;10000&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Your Current Contract Rate (%)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;b-rate&#34; value=&#34;5.50&#34; min=&#34;0.5&#34; max=&#34;15&#34; step=&#34;0.01&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;The rate you are actually paying (not the posted rate).&lt;/span&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Months Remaining in Term&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;b-months&#34; value=&#34;36&#34; min=&#34;1&#34; max=&#34;120&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Original Term Length&lt;/label&gt;&lt;select id=&#34;b-orig-term&#34;&gt;&#39;;&#xA;  terms.forEach(function(t){ html += &#39;&lt;option value=&#34;&#39;+t+&#39;&#34;&#39;+(t===&#39;5yr&#39;?&#39; selected&#39;:&#39;&#39;)+&#39;&gt;&#39;+t.replace(&#39;yr&#39;,&#39; Year&#39;)+&#39;&lt;/option&gt;&#39;; });&#xA;  html += &#39;&lt;/select&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Your Lender&lt;/label&gt;&lt;select id=&#34;b-lender&#34; class=&#34;lender-select&#34; onchange=&#34;showDiscountField()&#34;&gt;&#39; + lenderOpts + &#39;&lt;/select&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Remaining Amortization (years)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;b-amort&#34; value=&#34;22&#34; min=&#34;1&#34; max=&#34;30&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;  // Big 6 discount field - shown conditionally&#xA;  html += &#39;&lt;div id=&#34;b-discount-section&#34; class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group full&#34;&gt;&#39;;&#xA;  html += &#39;&lt;label&gt;Original Discount Off Posted Rate (%)&lt;/label&gt;&#39;;&#xA;  html += &#39;&lt;input type=&#34;number&#34; id=&#34;b-discount&#34; value=&#34;&#34; min=&#34;0&#34; max=&#34;5&#34; step=&#34;0.01&#34; placeholder=&#34;e.g. 2.50&#34;&gt;&#39;;&#xA;  html += &#39;&lt;span class=&#34;tf-hint&#34; id=&#34;b-discount-hint&#34;&gt;Big 6 banks use a &#34;discounted rate&#34; IRD method. Your discount = the 5-year posted rate at signing minus your contract rate. &lt;strong&gt;Check your mortgage paperwork or ask your bank.&lt;/strong&gt; If unsure, leave blank for a conservative estimate using current posted rates.&lt;/span&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Is Your Mortgage Insured?&lt;/label&gt;&lt;select id=&#34;b-insured&#34;&gt;&lt;option value=&#34;insured&#34;&gt;Yes (down payment was under 20%)&lt;/option&gt;&lt;option value=&#34;uninsured&#34;&gt;No (down payment was 20%+)&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Rate Type for New Mortgage&lt;/label&gt;&lt;select id=&#34;b-new-type&#34;&gt;&lt;option value=&#34;fixed&#34;&gt;Fixed&lt;/option&gt;&lt;option value=&#34;variable&#34;&gt;Variable&lt;/option&gt;&lt;/select&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;button class=&#34;btn btn-primary btn-block&#34; onclick=&#34;calcBreak()&#34;&gt;Analyze&lt;/button&gt;&#39;;&#xA;  html += &#39;&lt;div id=&#34;b-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;&#xA;  document.getElementById(&#39;break-tool&#39;).innerHTML = html;&#xA;&#xA;  // Show/hide discount field based on lender&#xA;  window.showDiscountField = function() {&#xA;    var lenderName = document.getElementById(&#39;b-lender&#39;).value;&#xA;    var lender = LENDERS.find(function(l){ return l.name === lenderName; }) || {};&#xA;    var section = document.getElementById(&#39;b-discount-section&#39;);&#xA;    if (lender.ird === &#39;posted&#39; || lender.ird === &#39;discount&#39;) {&#xA;      section.style.display = &#39;&#39;;&#xA;    } else {&#xA;      section.style.display = &#39;none&#39;;&#xA;    }&#xA;  };&#xA;  showDiscountField();&#xA;&#xA;  window.calcBreak = function() {&#xA;    var bal = parseFloat(document.getElementById(&#39;b-balance&#39;).value);&#xA;    var curRate = parseFloat(document.getElementById(&#39;b-rate&#39;).value);&#xA;    var monthsLeft = parseInt(document.getElementById(&#39;b-months&#39;).value);&#xA;    var origTerm = document.getElementById(&#39;b-orig-term&#39;).value;&#xA;    var lenderName = document.getElementById(&#39;b-lender&#39;).value;&#xA;    var amort = parseInt(document.getElementById(&#39;b-amort&#39;).value);&#xA;    var ins = document.getElementById(&#39;b-insured&#39;).value;&#xA;    var newType = document.getElementById(&#39;b-new-type&#39;).value;&#xA;    var rateType = newType === &#39;variable&#39; ? &#39;variable&#39; : &#39;fixed&#39;;&#xA;    var discountInput = document.getElementById(&#39;b-discount&#39;).value;&#xA;    var hasDiscount = discountInput !== &#39;&#39; &amp;&amp; !isNaN(parseFloat(discountInput));&#xA;    var originalDiscount = hasDiscount ? parseFloat(discountInput) : 0;&#xA;&#xA;    var lender = LENDERS.find(function(l){ return l.name === lenderName; }) || { method: &#39;show_both&#39;, ird: &#39;&#39; };&#xA;&#xA;    // === 3-MONTH INTEREST PENALTY ===&#xA;    var threeMonth = bal * (curRate / 100) / 4;&#xA;&#xA;    // === IRD PENALTY CALCULATION ===&#xA;    var remainYears = monthsLeft / 12;&#xA;&#xA;    // Find the posted rate for the term closest to remaining term&#xA;    var termKeys = [&#39;1yr&#39;,&#39;2yr&#39;,&#39;3yr&#39;,&#39;4yr&#39;,&#39;5yr&#39;,&#39;7yr&#39;,&#39;10yr&#39;];&#xA;    var termNums = [1,2,3,4,5,7,10];&#xA;    var compTermKey = null;&#xA;    for (var i = 0; i &lt; termNums.length; i++) {&#xA;      if (termNums[i] &gt;= remainYears) { compTermKey = termKeys[i]; break; }&#xA;    }&#xA;    if (!compTermKey) compTermKey = &#39;5yr&#39;;&#xA;    var compTermLabel = compTermKey.replace(&#39;yr&#39;, &#39;-year&#39;);&#xA;&#xA;    var irdPenalty, irdMethod, irdExplain;&#xA;&#xA;    if (lender.ird === &#39;posted&#39;) {&#xA;      // ============================================================&#xA;      // BIG 6 BANKS: DISCOUNTED RATE IRD METHOD&#xA;      // Formula: [Contract Rate - (Posted rate for remaining term - Original Discount)] x Balance x Remaining Years&#xA;      //&#xA;      // The &#34;comparison rate&#34; = current posted rate for remaining term MINUS the original discount&#xA;      // Original discount = posted 5yr rate at signing - contract rate at signing&#xA;      //&#xA;      // This is what makes Big 6 penalties so brutal: the discount was large&#xA;      // off the 5yr posted rate, but short-term posted rates have much&#xA;      // smaller discounts, so subtracting the same large discount produces&#xA;      // a very low comparison rate, which widens the differential.&#xA;      // ============================================================&#xA;&#xA;      var postedForRemaining = RATES.posted[compTermKey] || RATES.posted[&#39;5yr&#39;];&#xA;&#xA;      if (hasDiscount) {&#xA;        // User provided their discount - use the exact Discounted Rate method&#xA;        var compRate = postedForRemaining - originalDiscount;&#xA;        if (compRate &lt; 0) compRate = 0;&#xA;        var irdDiff = curRate - compRate;&#xA;        if (irdDiff &lt; 0) irdDiff = 0;&#xA;        irdPenalty = (irdDiff / 100) * bal * remainYears;&#xA;        irdMethod = &#39;Discounted Rate IRD&#39;;&#xA;        irdExplain = &#39;&lt;strong&gt;How &#39; + lenderName + &#39; calculates this:&lt;/strong&gt;&lt;br&gt;&#39; +&#xA;          &#39;Current posted &#39; + compTermLabel + &#39; rate: &#39; + postedForRemaining.toFixed(2) + &#39;%&lt;br&gt;&#39; +&#xA;          &#39;Minus your original discount: -&#39; + originalDiscount.toFixed(2) + &#39;%&lt;br&gt;&#39; +&#xA;          &#39;Comparison rate: &#39; + compRate.toFixed(2) + &#39;%&lt;br&gt;&#39; +&#xA;          &#39;Your contract rate: &#39; + curRate.toFixed(2) + &#39;%&lt;br&gt;&#39; +&#xA;          &#39;Rate differential: &#39; + irdDiff.toFixed(2) + &#39;%&lt;br&gt;&#39; +&#xA;          &#39;x Balance (&#39; + fmtInt(bal) + &#39;) x Remaining (&#39; + remainYears.toFixed(1) + &#39; years) = &lt;strong&gt;&#39; + fmtInt(irdPenalty) + &#39;&lt;/strong&gt;&#39;;&#xA;      } else {&#xA;        // No discount provided - estimate using posted rate directly (conservative/worst case)&#xA;        // This is actually the Posted Rate method (CIBC-style) which will be close to worst case&#xA;        var irdDiff = curRate - (postedForRemaining);&#xA;        // For Big 6, if their posted rate for remaining term is LOWER than contract rate,&#xA;        // the IRD is positive. If posted rate is higher (rare), IRD is 0.&#xA;        // But with Discounted Rate method, the comparison rate is much lower, so&#xA;        // we need to estimate the discount.&#xA;        // Estimate: current 5yr posted - current 5yr actual rate&#xA;        var estDiscount = RATES.posted[&#39;5yr&#39;] - RATES[ins].fixed[&#39;5yr&#39;];&#xA;        var compRate = postedForRemaining - estDiscount;&#xA;        if (compRate &lt; 0) compRate = 0;&#xA;        irdDiff = curRate - compRate;&#xA;        if (irdDiff &lt; 0) irdDiff = 0;&#xA;        irdPenalty = (irdDiff / 100) * bal * remainYears;&#xA;        irdMethod = &#39;Discounted Rate IRD (estimated)&#39;;&#xA;        irdExplain = &#39;&lt;strong&gt;Estimated calculation for &#39; + lenderName + &#39;:&lt;/strong&gt;&lt;br&gt;&#39; +&#xA;          &#39;We estimated your original discount at &#39; + estDiscount.toFixed(2) + &#39;% (current spread between posted and actual 5yr rates). &#39; +&#xA;          &#39;&lt;strong&gt;For a more accurate result, enter your actual discount above&lt;/strong&gt; (check your mortgage paperwork or call your bank).&lt;br&gt;&#39; +&#xA;          &#39;Posted &#39; + compTermLabel + &#39; rate: &#39; + postedForRemaining.toFixed(2) + &#39;% - Estimated discount: &#39; + estDiscount.toFixed(2) + &#39;% = Comparison rate: &#39; + compRate.toFixed(2) + &#39;%&lt;br&gt;&#39; +&#xA;          &#39;Differential: &#39; + irdDiff.toFixed(2) + &#39;% x &#39; + fmtInt(bal) + &#39; x &#39; + remainYears.toFixed(1) + &#39; yrs = &lt;strong&gt;&#39; + fmtInt(irdPenalty) + &#39;&lt;/strong&gt;&#39;;&#xA;      }&#xA;&#xA;    } else if (lender.ird === &#39;discount&#39;) {&#xA;      // ============================================================&#xA;      // LENDERS USING DISCOUNT RATE (e.g., Manulife, Desjardins, Home Trust)&#xA;      // These use actual/discounted rates instead of posted rates&#xA;      // Much more borrower-friendly&#xA;      // Formula: [Contract Rate - Current actual rate for remaining term] x Balance x Remaining Years&#xA;      // ============================================================&#xA;      var compRate = RATES[ins].fixed[compTermKey] || RATES[ins].fixed[&#39;5yr&#39;];&#xA;      var irdDiff = curRate - compRate;&#xA;      if (irdDiff &lt; 0) irdDiff = 0;&#xA;      irdPenalty = (irdDiff / 100) * bal * remainYears;&#xA;      irdMethod = &#39;Standard IRD&#39;;&#xA;      irdExplain = &#39;&lt;strong&gt;How &#39; + lenderName + &#39; calculates this:&lt;/strong&gt;&lt;br&gt;&#39; +&#xA;        &#39;Your contract rate: &#39; + curRate.toFixed(2) + &#39;% - Current &#39; + compTermLabel + &#39; rate: &#39; + compRate.toFixed(2) + &#39;% = Differential: &#39; + irdDiff.toFixed(2) + &#39;%&lt;br&gt;&#39; +&#xA;        &#39;x Balance (&#39; + fmtInt(bal) + &#39;) x Remaining (&#39; + remainYears.toFixed(1) + &#39; years) = &lt;strong&gt;&#39; + fmtInt(irdPenalty) + &#39;&lt;/strong&gt;&lt;br&gt;&#39; +&#xA;        lenderName + &#39; uses actual (discounted) rates, not inflated posted rates - a more borrower-friendly calculation.&#39;;&#xA;&#xA;    } else {&#xA;      // ============================================================&#xA;      // MONOLINE / CREDIT UNION / UNKNOWN - show both scenarios&#xA;      // ============================================================&#xA;      // Standard IRD as a fallback&#xA;      var compRate = RATES[ins].fixed[compTermKey] || RATES[ins].fixed[&#39;5yr&#39;];&#xA;      var irdDiff = curRate - compRate;&#xA;      if (irdDiff &lt; 0) irdDiff = 0;&#xA;      irdPenalty = (irdDiff / 100) * bal * remainYears;&#xA;      irdMethod = &#39;Standard IRD (estimated)&#39;;&#xA;      irdExplain = &#39;We used a standard IRD calculation. Your lender\&#39;s actual method may differ - check your mortgage contract or call them to confirm.&#39;;&#xA;    }&#xA;&#xA;    // === DETERMINE WHICH PENALTY APPLIES ===&#xA;    var penalty, penaltyLabel, penaltyColor;&#xA;    if (lender.method === &#39;three_month&#39;) {&#xA;      penalty = threeMonth;&#xA;      penaltyLabel = &#39;3-Month Interest&#39;;&#xA;    } else if (lender.method === &#39;higher_of&#39;) {&#xA;      penalty = Math.max(threeMonth, irdPenalty);&#xA;      penaltyLabel = penalty === irdPenalty ? &#39;IRD (&#39; + irdMethod + &#39;)&#39; : &#39;3-Month Interest&#39;;&#xA;    } else {&#xA;      penalty = Math.max(threeMonth, irdPenalty);&#xA;      penaltyLabel = &#39;Estimated (higher of both)&#39;;&#xA;    }&#xA;&#xA;    // === NEW RATE &amp; SAVINGS ===&#xA;    var newRate;&#xA;    if (newType === &#39;variable&#39;) {&#xA;      newRate = RATES[ins].variable;&#xA;    } else {&#xA;      newRate = RATES[ins].fixed[&#39;5yr&#39;];&#xA;    }&#xA;&#xA;    var curPmt = calcPayment(bal, curRate, amort);&#xA;    var newPmt = calcPayment(bal, newRate, amort);&#xA;    var monthlySave = curPmt - newPmt;&#xA;    var breakeven = monthlySave &gt; 0 ? Math.ceil(penalty / monthlySave) : 999;&#xA;    var netSave = (monthlySave * monthsLeft) - penalty;&#xA;&#xA;    // === BUILD OUTPUT ===&#xA;    var out = &#39;&lt;div class=&#34;penalty-results&#34;&gt;&#39;;&#xA;&#xA;    // Penalty breakdown&#xA;    out += &#39;&lt;h4&gt;Estimated Penalty&lt;/h4&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-grid three&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;3-Month Interest&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + fmtInt(threeMonth) + &#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;IRD Penalty&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + fmtInt(irdPenalty) + &#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-box highlight&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Your Estimated Penalty&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + fmtInt(penalty) + &#39;&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39; + penaltyLabel + &#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    // Show the detailed calculation breakdown&#xA;    out += &#39;&lt;div class=&#34;info-note&#34;&gt;&#39; + irdExplain + &#39;&lt;/div&gt;&#39;;&#xA;&#xA;    if (lender.method === &#39;three_month&#39;) {&#xA;      out += &#39;&lt;div class=&#34;info-note highlight&#34;&gt;Good news: &#39; + lenderName + &#39; typically charges only a 3-month interest penalty - one of the most borrower-friendly penalty structures available.&lt;/div&gt;&#39;;&#xA;    }&#xA;&#xA;    if (lender.method === &#39;show_both&#39;) {&#xA;      out += &#39;&lt;div class=&#34;info-note&#34;&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Check your mortgage contract or call your lender to confirm which penalty method applies. The difference can be thousands of dollars.&lt;/div&gt;&#39;;&#xA;    }&#xA;&#xA;    // Show lender-specific links&#xA;    var hasCalc = lender.calc &amp;&amp; lender.calc.length &gt; 0;&#xA;    var hasRates = lender.rates &amp;&amp; lender.rates.length &gt; 0;&#xA;    var hasPhone = lender.phone &amp;&amp; lender.phone.length &gt; 0;&#xA;    if (hasCalc || hasRates || hasPhone) {&#xA;      out += &#39;&lt;div class=&#34;lender-links&#34;&gt;&#39;;&#xA;      out += &#39;&lt;h4&gt;Verify With &#39; + lenderName + &#39; Directly&lt;/h4&gt;&#39;;&#xA;      if (hasCalc) {&#xA;        out += &#39;&lt;a href=&#34;&#39; + lender.calc + &#39;&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;lender-link-btn calc-link&#34;&gt;Open &#39; + lenderName + &#39;\&#39;s Penalty Calculator ↗&lt;/a&gt;&#39;;&#xA;      }&#xA;      if (hasRates) {&#xA;        out += &#39;&lt;a href=&#34;&#39; + lender.rates + &#39;&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;lender-link-btn rates-link&#34;&gt;View &#39; + lenderName + &#39;\&#39;s Current Posted Rates ↗&lt;/a&gt;&#39;;&#xA;      }&#xA;      if (hasPhone) {&#xA;        out += &#39;&lt;p class=&#34;lender-phone&#34;&gt;Or call them directly: &lt;a href=&#34;tel:&#39; + lender.phone.replace(/-/g,&#39;&#39;) + &#39;&#34;&gt;&#39; + lender.phone + &#39;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Stress-Test a Rental Before You Commit - Investment Property Analyzer</title>
      <link>https://new.philippealexandre.ca/tools/investor-analyzer/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/investor-analyzer/</guid>
      <description>&lt;div id=&#34;inv-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var html=&#39;&lt;h3&gt;Second-Property Feasibility Calculator&lt;/h3&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-section-label&#34;&gt;Your Current Situation&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Current Home Value ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-homeVal&#34; value=&#34;500000&#34; min=&#34;50000&#34; step=&#34;10000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Current Mortgage Balance ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-homeBal&#34; value=&#34;280000&#34; min=&#34;0&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Gross Annual Income ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-income&#34; value=&#34;110000&#34; min=&#34;10000&#34; step=&#34;1000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Current Monthly Debts ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-debts&#34; value=&#34;500&#34; min=&#34;0&#34; step=&#34;50&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;Car, LOC, credit cards (excl. current mortgage)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-section-label&#34;&gt;The Investment Property&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Target Purchase Price ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-price&#34; value=&#34;350000&#34; min=&#34;50000&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Down Payment ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-down&#34; value=&#34;70000&#34; min=&#34;0&#34; step=&#34;1000&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;Minimum 20% for investment properties&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Expected Monthly Rent ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-rent&#34; value=&#34;2000&#34; min=&#34;0&#34; step=&#34;100&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Est. Monthly Expenses ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;i-expenses&#34; value=&#34;400&#34; min=&#34;0&#34; step=&#34;50&#34;&gt;&lt;span class=&#34;tf-hint&#34;&gt;Property tax, insurance, maintenance&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;button class=&#34;btn btn-primary btn-block&#34; onclick=&#34;calcInv()&#34;&gt;Analyze This Property&lt;/button&gt;&#39;;&#xA;  html+=&#39;&lt;div id=&#34;i-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;  document.getElementById(&#39;inv-tool&#39;).innerHTML=html;&#xA;&#xA;  window.calcInv=function(){&#xA;    var homeVal=parseFloat(document.getElementById(&#39;i-homeVal&#39;).value);&#xA;    var homeBal=parseFloat(document.getElementById(&#39;i-homeBal&#39;).value);&#xA;    var income=parseFloat(document.getElementById(&#39;i-income&#39;).value);&#xA;    var debts=parseFloat(document.getElementById(&#39;i-debts&#39;).value);&#xA;    var price=parseFloat(document.getElementById(&#39;i-price&#39;).value);&#xA;    var down=parseFloat(document.getElementById(&#39;i-down&#39;).value);&#xA;    var rent=parseFloat(document.getElementById(&#39;i-rent&#39;).value);&#xA;    var expenses=parseFloat(document.getElementById(&#39;i-expenses&#39;).value);&#xA;    var mo=income/12;&#xA;    var rate=RATES.uninsured.fixed[&#39;5yr&#39;];&#xA;    var stressRate=Math.max(rate+2,RATES.stress_floor);&#xA;    var invMort=price-down;&#xA;    var downPct=(down/price)*100;&#xA;    var invPmt=calcPayment(invMort,rate,25);&#xA;    var invPmtStress=calcPayment(invMort,stressRate,25);&#xA;    var homePmt=calcPayment(homeBal,rate,25);&#xA;    // Lenders use 50% of rental income for qualification&#xA;    var rentalAdd=rent*0.50;&#xA;    var totalHousing=homePmt+invPmtStress+expenses;&#xA;    var gds=((totalHousing)/mo)*100;&#xA;    var tds=((totalHousing+debts-rentalAdd)/mo)*100;&#xA;    var cashFlow=rent-invPmt-expenses;&#xA;    var annualCF=cashFlow*12;&#xA;    var cashOnCash=(annualCF/down)*100;&#xA;&#xA;    var qualifies=tds&lt;=44&amp;&amp;gds&lt;=44;&#xA;    var tight=tds&gt;38||gds&gt;38;&#xA;&#xA;    var out=&#39;&lt;div class=&#34;result-grid three&#34;&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box &#39;+(cashFlow&gt;=0?&#39;broker&#39;:&#39;bank&#39;)+&#39;&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Monthly Cash Flow&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+fmt(cashFlow)+&#39;&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+(cashFlow&gt;=0?&#39;Positive&#39;:&#39;Negative&#39;)+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Cash-on-Cash Return&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+cashOnCash.toFixed(1)+&#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;Annual return on down payment&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Investment Mortgage Payment&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+fmt(invPmt)+&#39;&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+rate.toFixed(2)+&#39;% over 25yr&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;/div&gt;&#39;;&#xA;&#xA;    out+=&#39;&lt;h4&gt;Qualification Impact&lt;/h4&gt;&lt;div class=&#34;result-grid&#34;&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;GDS with Investment&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+gds.toFixed(1)+&#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+(gds&lt;=39?&#39;Within limit&#39;:&#39;Over 39% limit&#39;)+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;TDS with Investment&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39;+tds.toFixed(1)+&#39;%&lt;/div&gt;&lt;div class=&#34;rd&#34;&gt;&#39;+(tds&lt;=44?&#39;Within limit&#39;:&#39;Over 44% limit&#39;)+&#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out+=&#39;&lt;/div&gt;&#39;;&#xA;&#xA;    if(downPct&lt;20){&#xA;      out+=&#39;&lt;div class=&#34;info-note&#34;&gt;⚠️ &lt;strong&gt;Investment properties require a minimum 20% down payment.&lt;/strong&gt; You\&#39;ve entered &#39;+downPct.toFixed(1)+&#39;%. You\&#39;ll need at least &#39;+fmtInt(price*0.20)+&#39;.&lt;/div&gt;&#39;;&#xA;    }&#xA;&#xA;    out+=&#39;&lt;div class=&#34;verdict-banner &#39;+(qualifies?(tight?&#39;neutral&#39;:&#39;positive&#39;):&#39;negative&#39;)+&#39;&#34;&gt;&#39;;&#xA;    if(qualifies&amp;&amp;!tight){&#xA;      out+=&#39;&lt;div class=&#34;verdict-icon&#34;&gt;✅&lt;/div&gt;&lt;div class=&#34;verdict-text&#34;&gt;&lt;strong&gt;This looks feasible.&lt;/strong&gt; Your ratios are within lending guidelines and the property &#39;+( cashFlow&gt;=0?&#39;generates positive cash flow.&#39;:&#39;has negative cash flow - ensure you can cover the shortfall.&#39;)+&#39;&lt;/div&gt;&#39;;&#xA;    } else if(qualifies&amp;&amp;tight){&#xA;      out+=&#39;&lt;div class=&#34;verdict-icon&#34;&gt;⚖️&lt;/div&gt;&lt;div class=&#34;verdict-text&#34;&gt;&lt;strong&gt;Tight but possible.&lt;/strong&gt; Your ratios are near the limit. A detailed review would confirm your options.&lt;/div&gt;&#39;;&#xA;    } else {&#xA;      out+=&#39;&lt;div class=&#34;verdict-icon&#34;&gt;❌&lt;/div&gt;&lt;div class=&#34;verdict-text&#34;&gt;&lt;strong&gt;This may not qualify&lt;/strong&gt; under current guidelines. Consider a lower purchase price, larger down payment, or restructuring existing debt first.&lt;/div&gt;&#39;;&#xA;    }&#xA;    out+=&#39;&lt;/div&gt;&#39;;&#xA;&#xA;    out+=&#39;&lt;div class=&#34;tool-cta&#34;&gt;&lt;p&gt;&lt;strong&gt;Have a specific listing in mind?&lt;/strong&gt; Bring it to a call and I\&#39;ll run the exact numbers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Could Your Home Equity Do? - Equity Scenarios Dashboard</title>
      <link>https://new.philippealexandre.ca/tools/equity-scenarios/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/equity-scenarios/</guid>
      <description>&lt;div id=&#34;equity-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var html = &#39;&lt;h3&gt;Your Equity Snapshot&lt;/h3&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group full&#34;&gt;&lt;label&gt;Property Address&lt;/label&gt;&lt;input type=&#34;text&#34; id=&#34;e-address&#34; placeholder=&#34;123 Main St, Hawkesbury, ON&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Approximate Property Value ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;e-value&#34; value=&#34;450000&#34; min=&#34;50000&#34; step=&#34;10000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Current Mortgage Balance ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;e-balance&#34; value=&#34;250000&#34; min=&#34;0&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-row&#34;&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Current Mortgage Rate (%)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;e-rate&#34; value=&#34;5.20&#34; min=&#34;0.5&#34; max=&#34;15&#34; step=&#34;0.01&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Remaining Amortization (years)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;e-amort&#34; value=&#34;20&#34; min=&#34;1&#34; max=&#34;30&#34;&gt;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;/div&gt;&#39;;&#xA;  html += &#39;&lt;button class=&#34;btn btn-primary btn-block&#34; onclick=&#34;calcEquity()&#34;&gt;Show My Options&lt;/button&gt;&#39;;&#xA;  html += &#39;&lt;div id=&#34;e-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;  document.getElementById(&#39;equity-tool&#39;).innerHTML = html;&#xA;&#xA;  window.calcEquity = function() {&#xA;    var value = parseFloat(document.getElementById(&#39;e-value&#39;).value);&#xA;    var balance = parseFloat(document.getElementById(&#39;e-balance&#39;).value);&#xA;    var curRate = parseFloat(document.getElementById(&#39;e-rate&#39;).value);&#xA;    var amort = parseInt(document.getElementById(&#39;e-amort&#39;).value);&#xA;    var equity = value - balance;&#xA;    var ltv = (balance / value) * 100;&#xA;    var maxAccess = Math.max(0, (value * 0.80) - balance);&#xA;    var curPmt = calcPayment(balance, curRate, amort);&#xA;    var bestRate = RATES.uninsured.fixed[&#39;5yr&#39;];&#xA;    var restructPmt = calcPayment(balance, bestRate, amort);&#xA;    var restructSave = curPmt - restructPmt;&#xA;    var accessBal = balance + maxAccess;&#xA;    var accessPmt = calcPayment(accessBal, bestRate, amort);&#xA;&#xA;    var out = &#39;&lt;div class=&#34;equity-summary&#34;&gt;&lt;div class=&#34;result-grid three&#34;&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Estimated Equity&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + fmtInt(equity) + &#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Current LTV&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + ltv.toFixed(1) + &#39;%&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;div class=&#34;result-box&#34;&gt;&lt;div class=&#34;rl&#34;&gt;Accessible Equity (80% LTV)&lt;/div&gt;&lt;div class=&#34;rv&#34;&gt;&#39; + fmtInt(maxAccess) + &#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    out += &#39;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;&#xA;    out += &#39;&lt;h4&gt;Your Three Options&lt;/h4&gt;&lt;div class=&#34;scenario-grid&#34;&gt;&#39;;&#xA;&#xA;    out += &#39;&lt;div class=&#34;scenario-card&#34;&gt;&lt;div class=&#34;scenario-num&#34;&gt;1&lt;/div&gt;&lt;h4&gt;Keep As-Is&lt;/h4&gt;&#39;;&#xA;    out += &#39;&lt;p&gt;Your mortgage stays the same. No action needed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Is Your Credit Score Costing You? - Rate Impact Simulator</title>
      <link>https://new.philippealexandre.ca/tools/credit-impact/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/credit-impact/</guid>
      <description>&lt;div id=&#34;credit-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var tiers=[&#xA;    {range:&#39;760+&#39;,label:&#39;Excellent&#39;,spread:0},&#xA;    {range:&#39;720-759&#39;,label:&#39;Very Good&#39;,spread:0.10},&#xA;    {range:&#39;680-719&#39;,label:&#39;Good&#39;,spread:0.25},&#xA;    {range:&#39;660-679&#39;,label:&#39;Fair&#39;,spread:0.50},&#xA;    {range:&#39;620-659&#39;,label:&#39;Below Average&#39;,spread:1.00},&#xA;    {range:&#39;Under 620&#39;,label:&#39;Poor&#39;,spread:1.75}&#xA;  ];&#xA;  var tips={&#xA;    &#39;760+&#39;:[&#xA;      &#39;You\&#39;re in the best tier - you qualify for the absolute lowest rates.&#39;,&#xA;      &#39;Maintain by keeping utilization under 30% and never missing payments.&#39;,&#xA;      &#39;Consider requesting credit limit increases to lower utilization ratio.&#39;&#xA;    ],&#xA;    &#39;720-759&#39;:[&#xA;      &#39;Pay down credit card balances to under 30% of limits.&#39;,&#xA;      &#39;Avoid opening new credit accounts before your mortgage application.&#39;,&#xA;      &#39;A 20-40 point bump could get you into the best rate tier.&#39;&#xA;    ],&#xA;    &#39;680-719&#39;:[&#xA;      &#39;Focus on utilization - get all cards under 30% of their limit.&#39;,&#xA;      &#39;Don\&#39;t close old accounts - length of credit history matters.&#39;,&#xA;      &#39;Check your report for errors and dispute any inaccuracies.&#39;&#xA;    ],&#xA;    &#39;660-679&#39;:[&#xA;      &#39;Prioritize paying down revolving debt (credit cards, lines of credit).&#39;,&#xA;      &#39;Set up automatic payments to avoid any late payments.&#39;,&#xA;      &#39;Consider becoming an authorized user on a family member\&#39;s older account.&#39;&#xA;    ],&#xA;    &#39;620-659&#39;:[&#xA;      &#39;A budget to aggressively pay down credit cards will have the biggest impact.&#39;,&#xA;      &#39;Any collections or judgments should be addressed - sometimes negotiating a pay-for-delete works.&#39;,&#xA;      &#39;Allow 3-6 months of consistent payments before applying.&#39;&#xA;    ],&#xA;    &#39;Under 620&#39;:[&#xA;      &#39;Address any collections or public records first.&#39;,&#xA;      &#39;Secured credit cards can help rebuild if used responsibly.&#39;,&#xA;      &#39;Consider waiting 6-12 months while improving - the rate difference will save you significantly.&#39;&#xA;    ]&#xA;  };&#xA;&#xA;  var html=&#39;&lt;h3&gt;Credit Score to Rate Impact&lt;/h3&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-row&#34;&gt;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Your Credit Score Range&lt;/label&gt;&lt;select id=&#34;c-score&#34;&gt;&#39;;&#xA;  tiers.forEach(function(t){ html+=&#39;&lt;option value=&#34;&#39;+t.range+&#39;&#34;&gt;&#39;+t.range+&#39; (&#39;+t.label+&#39;)&lt;/option&gt;&#39;; });&#xA;  html+=&#39;&lt;/select&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;div class=&#34;tf-group&#34;&gt;&lt;label&gt;Mortgage Amount ($)&lt;/label&gt;&lt;input type=&#34;number&#34; id=&#34;c-amount&#34; value=&#34;350000&#34; min=&#34;50000&#34; step=&#34;5000&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;  html+=&#39;&lt;button class=&#34;btn btn-primary btn-block&#34; onclick=&#34;calcCredit()&#34;&gt;Show My Rate Impact&lt;/button&gt;&#39;;&#xA;  html+=&#39;&lt;div id=&#34;c-results&#34; style=&#34;display:none&#34;&gt;&lt;/div&gt;&#39;;&#xA;  document.getElementById(&#39;credit-tool&#39;).innerHTML=html;&#xA;&#xA;  window.calcCredit=function(){&#xA;    var score=document.getElementById(&#39;c-score&#39;).value;&#xA;    var amount=parseFloat(document.getElementById(&#39;c-amount&#39;).value);&#xA;    var baseRate=RATES.insured.fixed[&#39;5yr&#39;];&#xA;    var myTier=tiers.find(function(t){return t.range===score;});&#xA;    var myRate=baseRate+myTier.spread;&#xA;    var myPmt=calcPayment(amount,myRate,25);&#xA;    var bestPmt=calcPayment(amount,baseRate,25);&#xA;    var monthDiff=myPmt-bestPmt;&#xA;    var fiveYrDiff=monthDiff*60;&#xA;&#xA;    var out=&#39;&lt;div class=&#34;credit-ladder&#34;&gt;&#39;;&#xA;    tiers.forEach(function(t){&#xA;      var r=baseRate+t.spread;&#xA;      var p=calcPayment(amount,r,25);&#xA;      var diff=(p-bestPmt)*60;&#xA;      var isMine=t.range===score;&#xA;      out+=&#39;&lt;div class=&#34;ladder-row&#39;+(isMine?&#39; active&#39;:&#39;&#39;)+&#39;&#34;&gt;&#39;;&#xA;      out+=&#39;&lt;span class=&#34;ladder-score&#34;&gt;&#39;+t.range+&#39;&lt;/span&gt;&#39;;&#xA;      out+=&#39;&lt;span class=&#34;ladder-label&#34;&gt;&#39;+t.label+&#39;&lt;/span&gt;&#39;;&#xA;      out+=&#39;&lt;div class=&#34;ladder-bar-wrap&#34;&gt;&lt;div class=&#34;ladder-bar&#34; style=&#34;width:&#39;+Math.max(5,(t.spread/1.75)*100)+&#39;%&#34;&gt;&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;      out+=&#39;&lt;span class=&#34;ladder-rate&#34;&gt;&#39;+r.toFixed(2)+&#39;%&lt;/span&gt;&#39;;&#xA;      out+=&#39;&lt;span class=&#34;ladder-pmt&#34;&gt;&#39;+fmt(p)+&#39;/mo&lt;/span&gt;&#39;;&#xA;      out+=&#39;&lt;span class=&#34;ladder-cost&#34;&gt;&#39;+(diff&gt;0?&#39;+&#39;+fmtInt(diff)+&#39; over 5yr&#39;:&#39;Best rate&#39;)+&#39;&lt;/span&gt;&#39;;&#xA;      if(isMine) out+=&#39;&lt;span class=&#34;ladder-you&#34;&gt;← You&lt;/span&gt;&#39;;&#xA;      out+=&#39;&lt;/div&gt;&#39;;&#xA;    });&#xA;    out+=&#39;&lt;/div&gt;&#39;;&#xA;&#xA;    if(monthDiff&gt;0){&#xA;      out+=&#39;&lt;div class=&#34;savings-banner&#34;&gt;&lt;div class=&#34;savings-big&#34;&gt;&#39;+fmtInt(fiveYrDiff)+&#39;&lt;/div&gt;&#39;;&#xA;      out+=&#39;&lt;div class=&#34;savings-label&#34;&gt;extra cost over 5 years vs. the best rate tier&lt;/div&gt;&#39;;&#xA;      out+=&#39;&lt;div class=&#34;savings-detail&#34;&gt;&#39;+fmt(monthDiff)+&#39; more per month&lt;/div&gt;&lt;/div&gt;&#39;;&#xA;    }&#xA;&#xA;    out+=&#39;&lt;h4&gt;Your Highest-Impact Actions&lt;/h4&gt;&lt;div class=&#34;tips-list&#34;&gt;&#39;;&#xA;    (tips[score]||[]).forEach(function(tip){&#xA;      out+=&#39;&lt;div class=&#34;tip-item&#34;&gt;→ &#39;+tip+&#39;&lt;/div&gt;&#39;;&#xA;    });&#xA;    out+=&#39;&lt;/div&gt;&#39;;&#xA;&#xA;    out+=&#39;&lt;div class=&#34;tool-cta&#34;&gt;&lt;p&gt;&lt;strong&gt;Want a mortgage-focused credit strategy?&lt;/strong&gt; I\&#39;ll tell you exactly what to fix and how long it takes to move up a tier.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Which Mortgage Features Actually Protect You? - Flexibility Fit Tool</title>
      <link>https://new.philippealexandre.ca/tools/flexibility-fit/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/flexibility-fit/</guid>
      <description>&lt;div id=&#34;flex-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var step=0, answers={};&#xA;  var questions=[&#xA;    {q:&#39;How likely are you to move or sell in the next 3 years?&#39;, id:&#39;move&#39;, opts:[&#xA;      {val:&#39;very&#39;,label:&#39;Very likely&#39;,icon:&#39;🏃&#39;},&#xA;      {val:&#39;possible&#39;,label:&#39;Possible&#39;,icon:&#39;🤔&#39;},&#xA;      {val:&#39;unlikely&#39;,label:&#39;Unlikely&#39;,icon:&#39;🏡&#39;}&#xA;    ]},&#xA;    {q:&#39;Could your income change significantly?&#39;, id:&#39;income&#39;, opts:[&#xA;      {val:&#39;increase&#39;,label:&#39;Expecting increase&#39;,icon:&#39;📈&#39;},&#xA;      {val:&#39;decrease&#39;,label:&#39;Might decrease&#39;,icon:&#39;📉&#39;},&#xA;      {val:&#39;stable&#39;,label:&#39;Stable&#39;,icon:&#39;⚖️&#39;}&#xA;    ]},&#xA;    {q:&#39;Might you rent out this property in the future?&#39;, id:&#39;rental&#39;, opts:[&#xA;      {val:&#39;yes&#39;,label:&#39;Yes, likely&#39;,icon:&#39;🔑&#39;},&#xA;      {val:&#39;maybe&#39;,label:&#39;Maybe&#39;,icon:&#39;🤷&#39;},&#xA;      {val:&#39;no&#39;,label:&#39;No&#39;,icon:&#39;✖️&#39;}&#xA;    ]}&#xA;  ];&#xA;&#xA;  function render() {&#xA;    var el=document.getElementById(&#39;flex-tool&#39;);&#xA;    if(step&lt;questions.length){&#xA;      var q=questions[step];&#xA;      var h=&#39;&lt;div class=&#34;quiz-progress&#34;&gt;Question &#39;+(step+1)+&#39; of &#39;+questions.length+&#39;&lt;/div&gt;&#39;;&#xA;      h+=&#39;&lt;h3&gt;&#39;+q.q+&#39;&lt;/h3&gt;&lt;div class=&#34;quiz-options&#34;&gt;&#39;;&#xA;      q.opts.forEach(function(o){&#xA;        h+=&#39;&lt;button class=&#34;quiz-opt&#34; onclick=&#34;flexAnswer(\&#39;&#39;+q.id+&#39;\&#39;,\&#39;&#39;+o.val+&#39;\&#39;)&#34;&gt;&lt;span class=&#34;quiz-icon&#34;&gt;&#39;+o.icon+&#39;&lt;/span&gt;&lt;span&gt;&#39;+o.label+&#39;&lt;/span&gt;&lt;/button&gt;&#39;;&#xA;      });&#xA;      h+=&#39;&lt;/div&gt;&#39;;&#xA;      if(step&gt;0) h+=&#39;&lt;button class=&#34;quiz-back&#34; onclick=&#34;flexBack()&#34;&gt;← Back&lt;/button&gt;&#39;;&#xA;      el.innerHTML=h;&#xA;    } else { showResults(); }&#xA;  }&#xA;&#xA;  window.flexAnswer=function(id,val){ answers[id]=val; step++; render(); };&#xA;  window.flexBack=function(){ step--; render(); };&#xA;&#xA;  function showResults(){&#xA;    var features=[], avoid=[], termRec=&#39;&#39;;&#xA;    // Move likelihood&#xA;    if(answers.move===&#39;very&#39;){&#xA;      features.push({name:&#39;Portability&#39;,desc:&#39;Transfer your mortgage to a new property without penalty.&#39;,priority:&#39;Critical&#39;});&#xA;      features.push({name:&#39;Blend-and-extend&#39;,desc:&#39;Combine your existing rate with a new rate if you need more funds.&#39;,priority:&#39;Critical&#39;});&#xA;      features.push({name:&#39;Low penalty structure&#39;,desc:&#39;3-month interest penalty (monoline lenders) vs. IRD (big banks).&#39;,priority:&#39;Critical&#39;});&#xA;      avoid.push(&#39;No-frills / restricted mortgages - their low rates come with brutal penalties if you move.&#39;);&#xA;      avoid.push(&#39;Long fixed terms (7-10 year) unless portable.&#39;);&#xA;      termRec=&#39;Consider a shorter term (2-3 years) to align with your likely move timeline.&#39;;&#xA;    } else if(answers.move===&#39;possible&#39;){&#xA;      features.push({name:&#39;Portability&#39;,desc:&#39;Lets you move your mortgage to a new property.&#39;,priority:&#39;Important&#39;});&#xA;      features.push({name:&#39;Reasonable penalty&#39;,desc:&#39;3-month interest is much cheaper than Big 6 IRD.&#39;,priority:&#39;Important&#39;});&#xA;      termRec=&#39;A 3-5 year term gives flexibility without sacrificing rate.&#39;;&#xA;    } else {&#xA;      termRec=&#39;A 5-year fixed term likely gives you the best rate and stability.&#39;;&#xA;    }&#xA;    // Income change&#xA;    if(answers.income===&#39;increase&#39;){&#xA;      features.push({name:&#39;Prepayment privileges&#39;,desc:&#39;Pay down up to 15-20% of your balance per year without penalty.&#39;,priority:&#39;Important&#39;});&#xA;      features.push({name:&#39;Payment increase option&#39;,desc:&#39;Increase your regular payment to pay off faster as income grows.&#39;,priority:&#39;Helpful&#39;});&#xA;    } else if(answers.income===&#39;decrease&#39;){&#xA;      features.push({name:&#39;Payment vacation / skip&#39;,desc:&#39;Some lenders allow payment deferrals in hardship.&#39;,priority:&#39;Important&#39;});&#xA;      features.push({name:&#39;Fixed rate&#39;,desc:&#39;Stable payments protect you if income drops.&#39;,priority:&#39;Critical&#39;});&#xA;      avoid.push(&#39;Variable rate mortgages - payment fluctuations add risk if income is unstable.&#39;);&#xA;    }&#xA;    // Rental&#xA;    if(answers.rental===&#39;yes&#39;||answers.rental===&#39;maybe&#39;){&#xA;      features.push({name:&#39;Rental permission clause&#39;,desc:&#39;Some mortgages restrict renting. Ensure yours allows it.&#39;,priority:answers.rental===&#39;yes&#39;?&#39;Critical&#39;:&#39;Important&#39;});&#xA;      features.push({name:&#39;Assumable mortgage&#39;,desc:&#39;A tenant or buyer can take over your mortgage - adds flexibility.&#39;,priority:&#39;Helpful&#39;});&#xA;      avoid.push(&#39;Mortgages with owner-occupancy restrictions if you plan to rent.&#39;);&#xA;    }&#xA;&#xA;    var el=document.getElementById(&#39;flex-tool&#39;);&#xA;    var h=&#39;&lt;div class=&#34;flex-results&#34;&gt;&#39;;&#xA;    h+=&#39;&lt;h3&gt;Your Mortgage Feature Priority Map&lt;/h3&gt;&#39;;&#xA;    if(termRec) h+=&#39;&lt;div class=&#34;info-note&#34;&gt;💡 &lt;strong&gt;Term recommendation:&lt;/strong&gt; &#39;+termRec+&#39;&lt;/div&gt;&#39;;&#xA;    h+=&#39;&lt;h4&gt;Features That Matter for You&lt;/h4&gt;&lt;div class=&#34;feature-list&#34;&gt;&#39;;&#xA;    features.forEach(function(f){&#xA;      var cls=f.priority===&#39;Critical&#39;?&#39;critical&#39;:f.priority===&#39;Important&#39;?&#39;important&#39;:&#39;helpful&#39;;&#xA;      h+=&#39;&lt;div class=&#34;feature-item &#39;+cls+&#39;&#34;&gt;&lt;span class=&#34;feature-priority&#34;&gt;&#39;+f.priority+&#39;&lt;/span&gt;&lt;strong&gt;&#39;+f.name+&#39;&lt;/strong&gt;&lt;p&gt;&#39;+f.desc+&#39;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Your Personalized Mortgage Checklist - Nothing More, Nothing Less</title>
      <link>https://new.philippealexandre.ca/tools/checklist-generator/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://new.philippealexandre.ca/tools/checklist-generator/</guid>
      <description>&lt;div id=&#34;check-tool&#34;&gt;&lt;/div&gt;&#xA;&lt;script&gt;&#xA;document.addEventListener(&#39;DOMContentLoaded&#39;, function() {&#xA;  var step=0, answers={};&#xA;  var questions=[&#xA;    {q:&#39;What are you doing?&#39;, id:&#39;situation&#39;, opts:[&#xA;      {val:&#39;purchase&#39;,label:&#39;Buying a home&#39;,icon:&#39;🏠&#39;},&#xA;      {val:&#39;renewal&#39;,label:&#39;Renewing my mortgage&#39;,icon:&#39;🔄&#39;},&#xA;      {val:&#39;refinance&#39;,label:&#39;Refinancing&#39;,icon:&#39;💰&#39;}&#xA;    ]},&#xA;    {q:&#39;How are you employed?&#39;, id:&#39;employment&#39;, opts:[&#xA;      {val:&#39;salaried&#39;,label:&#39;Salaried / Hourly&#39;,icon:&#39;💼&#39;},&#xA;      {val:&#39;commission&#39;,label:&#39;Commission / Bonus&#39;,icon:&#39;📊&#39;},&#xA;      {val:&#39;selfemployed&#39;,label:&#39;Self-Employed&#39;,icon:&#39;🏢&#39;},&#xA;      {val:&#39;multiple&#39;,label:&#39;Multiple Income Sources&#39;,icon:&#39;📋&#39;}&#xA;    ]},&#xA;    {q:&#39;Is this your first property?&#39;, id:&#39;firsttime&#39;, opts:[&#xA;      {val:&#39;yes&#39;,label:&#39;Yes&#39;,icon:&#39;🎉&#39;},{val:&#39;no&#39;,label:&#39;No&#39;,icon:&#39;🏡&#39;}&#xA;    ]},&#xA;    {q:&#39;Down payment source? (if purchasing)&#39;, id:&#39;downpayment&#39;, opts:[&#xA;      {val:&#39;savings&#39;,label:&#39;Savings&#39;,icon:&#39;🏦&#39;},&#xA;      {val:&#39;rrsp&#39;,label:&#39;RRSP (HBP)&#39;,icon:&#39;📁&#39;},&#xA;      {val:&#39;gift&#39;,label:&#39;Gift from Family&#39;,icon:&#39;🎁&#39;},&#xA;      {val:&#39;equity&#39;,label:&#39;Equity from Sale&#39;,icon:&#39;🏠&#39;}&#xA;    ],condition:function(){return answers.situation===&#39;purchase&#39;;}},&#xA;    {q:&#39;Property type?&#39;, id:&#39;proptype&#39;, opts:[&#xA;      {val:&#39;primary&#39;,label:&#39;Primary Residence&#39;,icon:&#39;🏠&#39;},&#xA;      {val:&#39;investment&#39;,label:&#39;Investment / Rental&#39;,icon:&#39;📈&#39;},&#xA;      {val:&#39;second&#39;,label:&#39;Cottage / Second Home&#39;,icon:&#39;🏕️&#39;}&#xA;    ]}&#xA;  ];&#xA;&#xA;  function render(){&#xA;    var el=document.getElementById(&#39;check-tool&#39;);&#xA;    // Skip conditional questions&#xA;    while(step&lt;questions.length &amp;&amp; questions[step].condition &amp;&amp; !questions[step].condition()){&#xA;      step++;&#xA;    }&#xA;    if(step&lt;questions.length){&#xA;      var q=questions[step];&#xA;      var h=&#39;&lt;div class=&#34;quiz-progress&#34;&gt;Question &#39;+(step+1)+&#39; of &#39;+questions.length+&#39;&lt;/div&gt;&#39;;&#xA;      h+=&#39;&lt;h3&gt;&#39;+q.q+&#39;&lt;/h3&gt;&lt;div class=&#34;quiz-options&#34;&gt;&#39;;&#xA;      q.opts.forEach(function(o){&#xA;        h+=&#39;&lt;button class=&#34;quiz-opt&#34; onclick=&#34;checkAnswer(\&#39;&#39;+q.id+&#39;\&#39;,\&#39;&#39;+o.val+&#39;\&#39;)&#34;&gt;&lt;span class=&#34;quiz-icon&#34;&gt;&#39;+o.icon+&#39;&lt;/span&gt;&lt;span&gt;&#39;+o.label+&#39;&lt;/span&gt;&lt;/button&gt;&#39;;&#xA;      });&#xA;      h+=&#39;&lt;/div&gt;&#39;;&#xA;      if(step&gt;0)h+=&#39;&lt;button class=&#34;quiz-back&#34; onclick=&#34;checkBack()&#34;&gt;← Back&lt;/button&gt;&#39;;&#xA;      el.innerHTML=h;&#xA;    } else { showChecklist(); }&#xA;  }&#xA;&#xA;  window.checkAnswer=function(id,val){answers[id]=val;step++;render();};&#xA;  window.checkBack=function(){step--;while(step&gt;0&amp;&amp;questions[step].condition&amp;&amp;!questions[step].condition())step--;render();};&#xA;&#xA;  function showChecklist(){&#xA;    var docs=[], notNeeded=[], timeline=&#39;&#39;;&#xA;    // Universal docs&#xA;    docs.push({name:&#39;Government-issued photo ID&#39;,note:&#39;Driver\&#39;s licence or passport&#39;});&#xA;    docs.push({name:&#39;Void cheque or pre-authorized payment form&#39;,note:&#39;For mortgage payment setup&#39;});&#xA;    // Employment-specific&#xA;    if(answers.employment===&#39;salaried&#39;){&#xA;      docs.push({name:&#39;Recent pay stub&#39;,note:&#39;Most recent, showing YTD income&#39;});&#xA;      docs.push({name:&#39;Employment letter&#39;,note:&#39;On company letterhead, confirming position, salary, start date&#39;});&#xA;      docs.push({name:&#39;T4 (most recent)&#39;,note:&#39;Previous year\&#39;s T4 slip&#39;});&#xA;      notNeeded.push(&#39;Business financial statements&#39;);&#xA;      notNeeded.push(&#39;T1 General (unless you have other income sources)&#39;);&#xA;    } else if(answers.employment===&#39;commission&#39;){&#xA;      docs.push({name:&#39;T4 (2 years)&#39;,note:&#39;Last 2 years of T4 slips&#39;});&#xA;      docs.push({name:&#39;T1 General (2 years)&#39;,note:&#39;Last 2 years of tax returns&#39;});&#xA;      docs.push({name:&#39;Notice of Assessment (2 years)&#39;,note:&#39;From CRA - confirms taxes filed&#39;});&#xA;      docs.push({name:&#39;Employment letter&#39;,note:&#39;Must confirm commission structure&#39;});&#xA;      docs.push({name:&#39;Recent pay stub&#39;,note:&#39;Showing YTD earnings&#39;});&#xA;    } else if(answers.employment===&#39;selfemployed&#39;){&#xA;      docs.push({name:&#39;T1 General (2 years)&#39;,note:&#39;Last 2 years of personal tax returns&#39;});&#xA;      docs.push({name:&#39;Notice of Assessment (2 years)&#39;,note:&#39;From CRA&#39;});&#xA;      docs.push({name:&#39;Business financial statements (2 years)&#39;,note:&#39;Or T2 if incorporated&#39;});&#xA;      docs.push({name:&#39;Articles of incorporation or business licence&#39;,note:&#39;Proof of business&#39;});&#xA;      docs.push({name:&#39;6 months business bank statements&#39;,note:&#39;Some lenders use bank statements for stated income programs&#39;});&#xA;      notNeeded.push(&#39;Employment letter&#39;);&#xA;      notNeeded.push(&#39;Pay stubs&#39;);&#xA;    } else {&#xA;      docs.push({name:&#39;T1 General (2 years)&#39;,note:&#39;Covers all income sources&#39;});&#xA;      docs.push({name:&#39;Notice of Assessment (2 years)&#39;,note:&#39;From CRA&#39;});&#xA;      docs.push({name:&#39;Documentation for each income source&#39;,note:&#39;Pay stubs, benefit statements, pension statements, etc.&#39;});&#xA;    }&#xA;    // Situation-specific&#xA;    if(answers.situation===&#39;purchase&#39;){&#xA;      docs.push({name:&#39;Purchase agreement / Offer to Purchase&#39;,note:&#39;Once accepted - not needed for pre-approval&#39;});&#xA;      docs.push({name:&#39;MLS listing of the property&#39;,note:&#39;Your realtor can provide this&#39;});&#xA;      docs.push({name:&#39;Down payment proof&#39;,note:&#39;Bank statements showing savings, or gift letter if applicable&#39;});&#xA;      if(answers.downpayment===&#39;gift&#39;) docs.push({name:&#39;Gift letter&#39;,note:&#39;Signed letter confirming gift is not a loan and no repayment expected&#39;});&#xA;      if(answers.downpayment===&#39;rrsp&#39;) docs.push({name:&#39;RRSP statement&#39;,note:&#39;Showing available balance for Home Buyers\&#39; Plan withdrawal&#39;});&#xA;      if(answers.firsttime===&#39;yes&#39;){&#xA;        docs.push({name:&#39;First-Time Home Buyer declaration&#39;,note:&#39;I\&#39;ll provide the form&#39;});&#xA;        timeline=&#39;Pre-approval: 1-2 days. Full approval after accepted offer: 3-7 business days. Closing: typically 30-90 days from offer.&#39;;&#xA;      } else { timeline=&#39;Pre-approval: 1-2 days. Full approval: 3-7 business days. Closing: 30-90 days.&#39;; }&#xA;    } else if(answers.situation===&#39;renewal&#39;){&#xA;      docs.push({name:&#39;Current mortgage statement&#39;,note:&#39;Most recent, showing balance, rate, maturity date&#39;});&#xA;      docs.push({name:&#39;Renewal offer from current lender&#39;,note:&#39;If you\&#39;ve received one&#39;});&#xA;      docs.push({name:&#39;Property tax bill&#39;,note:&#39;Most recent annual bill&#39;});&#xA;      notNeeded.push(&#39;Purchase agreement&#39;);&#xA;      notNeeded.push(&#39;Down payment proof&#39;);&#xA;      timeline=&#39;Renewal review: same day. Switch to new lender (if applicable): 2-4 weeks before maturity.&#39;;&#xA;    } else {&#xA;      docs.push({name:&#39;Current mortgage statement&#39;,note:&#39;Balance, rate, maturity, lender&#39;});&#xA;      docs.push({name:&#39;Property tax bill&#39;,note:&#39;Most recent&#39;});&#xA;      docs.push({name:&#39;Home insurance policy&#39;,note:&#39;Current policy details&#39;});&#xA;      timeline=&#39;Application: 1-2 days. Approval: 5-10 business days. Closing: 2-4 weeks.&#39;;&#xA;    }&#xA;    if(answers.proptype===&#39;investment&#39;){&#xA;      docs.push({name:&#39;Rental agreement / lease&#39;,note:&#39;Current or projected&#39;});&#xA;      docs.push({name:&#39;Rental income history&#39;,note:&#39;If existing rental - last 2 years of T776&#39;});&#xA;    }&#xA;&#xA;    var el=document.getElementById(&#39;check-tool&#39;);&#xA;    var h=&#39;&lt;div class=&#34;checklist-results&#34;&gt;&lt;h3&gt;Your Personalized Checklist&lt;/h3&gt;&#39;;&#xA;    h+=&#39;&lt;div class=&#34;checklist-summary&#34;&gt;&#39;+answers.situation.charAt(0).toUpperCase()+answers.situation.slice(1)+&#39; · &#39;+answers.employment.replace(&#39;selfemployed&#39;,&#39;Self-employed&#39;)+&#39; · &#39;+(answers.proptype===&#39;primary&#39;?&#39;Primary residence&#39;:answers.proptype===&#39;investment&#39;?&#39;Investment property&#39;:&#39;Second home&#39;)+&#39;&lt;/div&gt;&#39;;&#xA;    h+=&#39;&lt;h4&gt;Documents You\&#39;ll Need&lt;/h4&gt;&lt;div class=&#34;checklist-items&#34;&gt;&#39;;&#xA;    docs.forEach(function(d,i){&#xA;      h+=&#39;&lt;div class=&#34;checklist-item&#34;&gt;&lt;input type=&#34;checkbox&#34; id=&#34;ci&#39;+i+&#39;&#34;&gt;&lt;label for=&#34;ci&#39;+i+&#39;&#34;&gt;&lt;strong&gt;&#39;+d.name+&#39;&lt;/strong&gt;&lt;span&gt;&#39;+d.note+&#39;&lt;/span&gt;&lt;/label&gt;&lt;/div&gt;&#39;;&#xA;    });&#xA;    h+=&#39;&lt;/div&gt;&#39;;&#xA;    if(notNeeded.length){&#xA;      h+=&#39;&lt;h4&gt;You Won\&#39;t Need&lt;/h4&gt;&lt;div class=&#34;not-needed&#34;&gt;&#39;;&#xA;      notNeeded.forEach(function(n){ h+=&#39;&lt;div class=&#34;nn-item&#34;&gt;✖️ &#39;+n+&#39;&lt;/div&gt;&#39;; });&#xA;      h+=&#39;&lt;/div&gt;&#39;;&#xA;    }&#xA;    if(timeline){h+=&#39;&lt;h4&gt;Expected Timeline&lt;/h4&gt;&lt;p&gt;&#39;+timeline+&#39;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
