{"id":5691,"date":"2026-03-28T09:19:04","date_gmt":"2026-03-28T09:19:04","guid":{"rendered":"https:\/\/infocplus.com\/calculators\/"},"modified":"2026-03-28T13:05:16","modified_gmt":"2026-03-28T13:05:16","slug":"calculators","status":"publish","type":"page","link":"https:\/\/infocplus.com\/fr\/calculators\/","title":{"rendered":"Calculatrices"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container has-pattern-background has-mask-background nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1310.4px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:20px;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-1 fusion-sep-none fusion-title-center fusion-title-text fusion-title-size-one\"><h1 class=\"fusion-title-heading title-heading-center fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:60;line-height:var(--awb-typography1-line-height);\"><h3><strong class=\"Yjhzub\" data-sfc-root=\"c\" data-sfc-cb=\"\" data-complete=\"true\" aria-owns=\"action-menu-parent-container\">Calculateur de TPS et de TVQ<\/strong><\/h3><\/h1><\/div>        <div id=\"infocplus-tax-calc-fr-1\" class=\"infocplus-tax-wrap\">\r\n            <div class=\"infocplus-tax-card\">\r\n                <div class=\"infocplus-tax-header\">\r\n                    <span class=\"infocplus-tax-kicker\">Info C Plus<\/span>\r\n                    <h2>Calculatrice des taxes de vente au Canada<\/h2>\r\n                    <p>Calculez la TPS, la TVH, la TVP, la TVQ et le calcul inverse des taxes pour toute province ou tout territoire du Canada.<\/p>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-tax-grid\">\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-tax-calc-fr-1-mode\">Type de calcul<\/label>\r\n                        <select id=\"infocplus-tax-calc-fr-1-mode\">\r\n                            <option value=\"before\">Ajouter les taxes \u00e0 un montant avant taxes<\/option>\r\n                            <option value=\"after\">Retirer les taxes d'un total taxes incluses<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-tax-calc-fr-1-province\">Province \/ territoire<\/label>\r\n                        <select id=\"infocplus-tax-calc-fr-1-province\"><\/select>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field infocplus-field-wide\">\r\n                        <label for=\"infocplus-tax-calc-fr-1-amount\">Montant<\/label>\r\n                        <input id=\"infocplus-tax-calc-fr-1-amount\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"0.01\" placeholder=\"Entrez un montant\" \/>\r\n                        <small class=\"infocplus-help\">Prend en charge deux d\u00e9cimales. Exemple : 149,99<\/small>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-tax-actions\">\r\n                    <button type=\"button\" class=\"infocplus-btn infocplus-btn-primary\" data-action=\"calculate\">Calculer<\/button>\r\n                    <button type=\"button\" class=\"infocplus-btn\" data-action=\"swap\">Inverser le mode<\/button>\r\n                    <button type=\"button\" class=\"infocplus-btn\" data-action=\"clear\">Effacer<\/button>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-tax-results\" aria-live=\"polite\">\r\n                    <div class=\"infocplus-summary\">\r\n                        <div class=\"infocplus-summary-box\">\r\n                            <span class=\"infocplus-summary-label\">Sous-total \/ Avant taxes<\/span>\r\n                            <strong data-output=\"subtotal\">0,00 $<\/strong>\r\n                        <\/div>\r\n                        <div class=\"infocplus-summary-box infocplus-summary-box-accent\">\r\n                            <span class=\"infocplus-summary-label\">Total \/ Apr\u00e8s taxes<\/span>\r\n                            <strong data-output=\"total\">0,00 $<\/strong>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-breakdown\">\r\n                        <div class=\"infocplus-breakdown-row\">\r\n                            <span data-output=\"tax1Label\">TPS \/ TVH<\/span>\r\n                            <strong data-output=\"tax1Amount\">0,00 $<\/strong>\r\n                        <\/div>\r\n                        <div class=\"infocplus-breakdown-row\">\r\n                            <span data-output=\"tax2Label\">Taxe provinciale<\/span>\r\n                            <strong data-output=\"tax2Amount\">0,00 $<\/strong>\r\n                        <\/div>\r\n                        <div class=\"infocplus-breakdown-row infocplus-breakdown-total\">\r\n                            <span>Total des taxes<\/span>\r\n                            <strong data-output=\"totalTax\">0,00 $<\/strong>\r\n                        <\/div>\r\n                        <div class=\"infocplus-rate-note\" data-output=\"rateNote\">S\u00e9lectionnez une province pour voir le taux de taxe applicable.<\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-disclaimer\">\r\n                    <p><strong>Note :<\/strong> Cet outil fournit une estimation pour les ventes taxables courantes. Certains produits et services peuvent \u00eatre d\u00e9tax\u00e9s, exon\u00e9r\u00e9s ou assujettis \u00e0 des r\u00e8gles particuli\u00e8res.<\/p>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <style>\r\n            #infocplus-tax-calc-fr-1 {\r\n                --icp-primary: #0f766e;\r\n                --icp-primary-dark: #115e59;\r\n                --icp-text: #0f172a;\r\n                --icp-muted: #475569;\r\n                --icp-border: #dbe4ea;\r\n                --icp-bg: #f8fafc;\r\n                --icp-white: #ffffff;\r\n                margin: 32px 0;\r\n                font-family: inherit;\r\n                color: var(--icp-text);\r\n            }\r\n            #infocplus-tax-calc-fr-1 * { box-sizing: border-box; }\r\n            #infocplus-tax-calc-fr-1 .infocplus-tax-card {\r\n                background: linear-gradient(180deg, #ffffff 0%, #f8fbfb 100%);\r\n                border: 1px solid var(--icp-border);\r\n                border-radius: 20px;\r\n                box-shadow: 0 18px 40px rgba(15, 23, 42, 0.08);\r\n                padding: 28px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-tax-header {\r\n                margin-bottom: 22px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-tax-kicker {\r\n                display: inline-block;\r\n                font-size: 12px;\r\n                font-weight: 700;\r\n                letter-spacing: 0.08em;\r\n                text-transform: uppercase;\r\n                color: var(--icp-primary);\r\n                margin-bottom: 10px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 h2 {\r\n                font-size: 32px;\r\n                line-height: 1.15;\r\n                margin: 0 0 10px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 p {\r\n                margin: 0;\r\n                color: var(--icp-muted);\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-tax-grid {\r\n                display: grid;\r\n                grid-template-columns: repeat(2, minmax(0, 1fr));\r\n                gap: 16px;\r\n                margin: 22px 0 18px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-field {\r\n                display: flex;\r\n                flex-direction: column;\r\n                gap: 8px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-field-wide {\r\n                grid-column: 1 \/ -1;\r\n            }\r\n            #infocplus-tax-calc-fr-1 label {\r\n                font-size: 14px;\r\n                font-weight: 600;\r\n                color: var(--icp-text);\r\n            }\r\n            #infocplus-tax-calc-fr-1 select,\r\n            #infocplus-tax-calc-fr-1 input {\r\n                width: 100%;\r\n                border: 1px solid var(--icp-border);\r\n                background: var(--icp-white);\r\n                border-radius: 12px;\r\n                min-height: 50px;\r\n                padding: 0 14px;\r\n                font: inherit;\r\n                color: var(--icp-text);\r\n                transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n            }\r\n            #infocplus-tax-calc-fr-1 select:focus,\r\n            #infocplus-tax-calc-fr-1 input:focus {\r\n                outline: none;\r\n                border-color: var(--icp-primary);\r\n                box-shadow: 0 0 0 4px rgba(15, 118, 110, 0.12);\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-help {\r\n                color: var(--icp-muted);\r\n                font-size: 12px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-tax-actions {\r\n                display: flex;\r\n                flex-wrap: wrap;\r\n                gap: 12px;\r\n                margin-bottom: 20px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-btn {\r\n                border: 1px solid var(--icp-border);\r\n                background: #fff;\r\n                color: var(--icp-text);\r\n                border-radius: 999px;\r\n                min-height: 46px;\r\n                padding: 0 18px;\r\n                font: inherit;\r\n                font-weight: 700;\r\n                cursor: pointer;\r\n                transition: transform 0.15s ease, background 0.2s ease, border-color 0.2s ease;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-btn:hover {\r\n                transform: translateY(-1px);\r\n                border-color: #c4d2db;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-btn-primary {\r\n                background: var(--icp-primary);\r\n                color: #fff;\r\n                border-color: var(--icp-primary);\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-btn-primary:hover {\r\n                background: var(--icp-primary-dark);\r\n                border-color: var(--icp-primary-dark);\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-tax-results {\r\n                background: var(--icp-bg);\r\n                border: 1px solid var(--icp-border);\r\n                border-radius: 18px;\r\n                padding: 18px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-summary {\r\n                display: grid;\r\n                grid-template-columns: repeat(2, minmax(0, 1fr));\r\n                gap: 14px;\r\n                margin-bottom: 16px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-summary-box {\r\n                border-radius: 16px;\r\n                background: #fff;\r\n                border: 1px solid var(--icp-border);\r\n                padding: 16px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-summary-box-accent {\r\n                background: linear-gradient(180deg, rgba(15, 118, 110, 0.08) 0%, rgba(15, 118, 110, 0.14) 100%);\r\n                border-color: rgba(15, 118, 110, 0.18);\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-summary-label {\r\n                display: block;\r\n                font-size: 13px;\r\n                color: var(--icp-muted);\r\n                margin-bottom: 6px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-summary-box strong {\r\n                font-size: 28px;\r\n                line-height: 1.15;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-breakdown {\r\n                background: #fff;\r\n                border-radius: 16px;\r\n                border: 1px solid var(--icp-border);\r\n                padding: 8px 16px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-breakdown-row {\r\n                display: flex;\r\n                justify-content: space-between;\r\n                align-items: center;\r\n                gap: 16px;\r\n                padding: 14px 0;\r\n                border-bottom: 1px solid #edf2f7;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-breakdown-row:last-of-type {\r\n                border-bottom: 0;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-breakdown-total span,\r\n            #infocplus-tax-calc-fr-1 .infocplus-breakdown-total strong {\r\n                font-weight: 800;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-rate-note {\r\n                padding: 10px 0 6px;\r\n                color: var(--icp-muted);\r\n                font-size: 13px;\r\n            }\r\n            #infocplus-tax-calc-fr-1 .infocplus-disclaimer {\r\n                margin-top: 16px;\r\n                font-size: 13px;\r\n            }\r\n            @media (max-width: 767px) {\r\n                #infocplus-tax-calc-fr-1 .infocplus-tax-card { padding: 20px; }\r\n                #infocplus-tax-calc-fr-1 .infocplus-tax-grid,\r\n                #infocplus-tax-calc-fr-1 .infocplus-summary {\r\n                    grid-template-columns: 1fr;\r\n                }\r\n                #infocplus-tax-calc-fr-1 h2 {\r\n                    font-size: 26px;\r\n                }\r\n                #infocplus-tax-calc-fr-1 .infocplus-summary-box strong {\r\n                    font-size: 24px;\r\n                }\r\n            }\r\n        <\/style>\r\n\r\n        <script>\r\n            (function () {\r\n                const root = document.getElementById(\"infocplus-tax-calc-fr-1\");\r\n                if (!root) return;\r\n\r\n                const rates = {\r\n                    AB: { name: 'Alberta', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    BC: { name: 'Colombie-Britannique', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'TVP (7 %)', tax2: 0.07 },\r\n                    MB: { name: 'Manitoba', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'TVD (7 %)', tax2: 0.07 },\r\n                    NB: { name: 'Nouveau-Brunswick', tax1Label: 'TVH (15 %)', tax1: 0.15, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    NL: { name: 'Terre-Neuve-et-Labrador', tax1Label: 'TVH (15 %)', tax1: 0.15, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    NS: { name: 'Nouvelle-Ecosse', tax1Label: 'TVH (14 %)', tax1: 0.14, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    NT: { name: 'Territoires du Nord-Ouest', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    NU: { name: 'Nunavut', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    ON: { name: 'Ontario', tax1Label: 'TVH (13 %)', tax1: 0.13, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    PE: { name: 'Ile-du-Prince-Edouard', tax1Label: 'TVH (15 %)', tax1: 0.15, tax2Label: 'Taxe provinciale', tax2: 0 },\r\n                    QC: { name: 'Quebec', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'TVQ (9,975 %)', tax2: 0.09975 },\r\n                    SK: { name: 'Saskatchewan', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'TVP (6 %)', tax2: 0.06 },\r\n                    YT: { name: 'Yukon', tax1Label: 'TPS (5 %)', tax1: 0.05, tax2Label: 'Taxe provinciale', tax2: 0 }\r\n                };\r\n\r\n                const texts = {\r\n                    defaultTax2Label: 'Taxe provinciale',\r\n                    ratePrefix: 'Taux de taxe de vente pour ',\r\n                    rateSuffix: ' au total.'\r\n                };\r\n\r\n                const provinceSelect = root.querySelector('#infocplus-tax-calc-fr-1-province');\r\n                const modeSelect = root.querySelector('#infocplus-tax-calc-fr-1-mode');\r\n                const amountInput = root.querySelector('#infocplus-tax-calc-fr-1-amount');\r\n\r\n                const outputs = {\r\n                    subtotal: root.querySelector('[data-output=\"subtotal\"]'),\r\n                    total: root.querySelector('[data-output=\"total\"]'),\r\n                    tax1Label: root.querySelector('[data-output=\"tax1Label\"]'),\r\n                    tax1Amount: root.querySelector('[data-output=\"tax1Amount\"]'),\r\n                    tax2Label: root.querySelector('[data-output=\"tax2Label\"]'),\r\n                    tax2Amount: root.querySelector('[data-output=\"tax2Amount\"]'),\r\n                    totalTax: root.querySelector('[data-output=\"totalTax\"]'),\r\n                    rateNote: root.querySelector('[data-output=\"rateNote\"]')\r\n                };\r\n\r\n                const money = new Intl.NumberFormat('fr-CA', {\r\n                    style: 'currency',\r\n                    currency: 'CAD',\r\n                    minimumFractionDigits: 2,\r\n                    maximumFractionDigits: 2\r\n                });\r\n\r\n                function round2(value) {\r\n                    return Math.round((value + Number.EPSILON) * 100) \/ 100;\r\n                }\r\n\r\n                function format(value) {\r\n                    return money.format(Number.isFinite(value) ? value : 0);\r\n                }\r\n\r\n                function formatRatePercent(rate) {\r\n                    return ((rate * 100).toFixed(3).replace(\/\\.000$\/, '')).replace('.', ',') + ' %';\r\n                }\r\n\r\n                function fillProvinceOptions() {\r\n                    const preferredOrder = ['QC', 'ON', 'NB', 'NS', 'PE', 'NL', 'BC', 'MB', 'SK', 'AB', 'YT', 'NT', 'NU'];\r\n                    provinceSelect.innerHTML = preferredOrder.map(code => {\r\n                        return '<option value=\"' + code + '\">' + rates[code].name + '<\/option>';\r\n                    }).join('');\r\n                    provinceSelect.value = 'QC';\r\n                }\r\n\r\n                function updatePlaceholders() {\r\n                    if (modeSelect.value === 'before') {\r\n                        amountInput.placeholder = 'Entrez un montant avant taxes';\r\n                    } else {\r\n                        amountInput.placeholder = 'Entrez un montant taxes incluses';\r\n                    }\r\n                }\r\n\r\n                function calculate() {\r\n                    const amount = parseFloat(amountInput.value);\r\n                    const current = rates[provinceSelect.value] || rates.QC;\r\n                    const combinedRate = current.tax1 + current.tax2;\r\n\r\n                    outputs.tax1Label.textContent = current.tax1Label;\r\n                    outputs.tax2Label.textContent = current.tax2 > 0 ? current.tax2Label : texts.defaultTax2Label;\r\n                    outputs.rateNote.textContent = texts.ratePrefix + current.name + ' : ' + formatRatePercent(combinedRate) + texts.rateSuffix;\r\n\r\n                    if (!Number.isFinite(amount) || amount < 0) {\r\n                        outputs.subtotal.textContent = format(0);\r\n                        outputs.total.textContent = format(0);\r\n                        outputs.tax1Amount.textContent = format(0);\r\n                        outputs.tax2Amount.textContent = format(0);\r\n                        outputs.totalTax.textContent = format(0);\r\n                        return;\r\n                    }\r\n\r\n                    let subtotal = 0;\r\n                    let total = 0;\r\n                    let tax1Amount = 0;\r\n                    let tax2Amount = 0;\r\n                    let totalTax = 0;\r\n\r\n                    if (modeSelect.value === 'before') {\r\n                        subtotal = round2(amount);\r\n                        tax1Amount = round2(subtotal * current.tax1);\r\n                        tax2Amount = round2(subtotal * current.tax2);\r\n                        totalTax = round2(tax1Amount + tax2Amount);\r\n                        total = round2(subtotal + totalTax);\r\n                    } else {\r\n                        total = round2(amount);\r\n                        subtotal = round2(total \/ (1 + combinedRate));\r\n                        tax1Amount = round2(subtotal * current.tax1);\r\n                        tax2Amount = round2(subtotal * current.tax2);\r\n                        totalTax = round2(total - subtotal);\r\n                    }\r\n\r\n                    outputs.subtotal.textContent = format(subtotal);\r\n                    outputs.total.textContent = format(total);\r\n                    outputs.tax1Amount.textContent = format(tax1Amount);\r\n                    outputs.tax2Amount.textContent = format(tax2Amount);\r\n                    outputs.totalTax.textContent = format(totalTax);\r\n                }\r\n\r\n                root.querySelector('[data-action=\"calculate\"]').addEventListener('click', calculate);\r\n                root.querySelector('[data-action=\"swap\"]').addEventListener('click', function () {\r\n                    modeSelect.value = modeSelect.value === 'before' ? 'after' : 'before';\r\n                    updatePlaceholders();\r\n                    calculate();\r\n                });\r\n                root.querySelector('[data-action=\"clear\"]').addEventListener('click', function () {\r\n                    amountInput.value = '';\r\n                    updatePlaceholders();\r\n                    calculate();\r\n                    amountInput.focus();\r\n                });\r\n\r\n                provinceSelect.addEventListener('change', calculate);\r\n                modeSelect.addEventListener('change', function () {\r\n                    updatePlaceholders();\r\n                    calculate();\r\n                });\r\n                amountInput.addEventListener('input', calculate);\r\n                amountInput.addEventListener('keydown', function (event) {\r\n                    if (event.key === 'Enter') {\r\n                        event.preventDefault();\r\n                        calculate();\r\n                    }\r\n                });\r\n\r\n                fillProvinceOptions();\r\n                updatePlaceholders();\r\n                calculate();\r\n            })();\r\n        <\/script>\r\n        <\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_2 1_2 fusion-flex-column\" style=\"--awb-bg-size:cover;--awb-width-large:50%;--awb-margin-top-large:20px;--awb-spacing-right-large:3.84%;--awb-margin-bottom-large:20px;--awb-spacing-left-large:3.84%;--awb-width-medium:50%;--awb-order-medium:0;--awb-spacing-right-medium:3.84%;--awb-spacing-left-medium:3.84%;--awb-width-small:100%;--awb-order-small:0;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-title title fusion-title-2 fusion-sep-none fusion-title-center fusion-title-text fusion-title-size-one\"><h1 class=\"fusion-title-heading title-heading-center fusion-responsive-typography-calculated\" style=\"margin:0;--fontSize:60;line-height:var(--awb-typography1-line-height);\"><h3>Calculatrice hypoth\u00e9caire<\/h3><\/h1><\/div>        <div id=\"infocplus-mortgage-calc-fr-1\" class=\"infocplus-mortgage-wrap\">\r\n            <div class=\"infocplus-mortgage-card\">\r\n                <div class=\"infocplus-mortgage-header\">\r\n                    <span class=\"infocplus-mortgage-kicker\">Info C Plus<\/span>\r\n                    <h2>Calculatrice hypoth\u00e9caire<\/h2>\r\n                    <p>Estimez votre paiement hypoth\u00e9caire, votre co\u00fbt d'int\u00e9r\u00eat, votre solde \u00e0 la fin du terme et l'impact des remboursements anticip\u00e9s.<\/p>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-mortgage-grid\">\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-price\">Prix de la propri\u00e9t\u00e9<\/label>\r\n                        <input id=\"infocplus-mortgage-calc-fr-1-price\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"1000\" value=\"500000\" \/>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-down\">Mise de fonds<\/label>\r\n                        <input id=\"infocplus-mortgage-calc-fr-1-down\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"1000\" value=\"100000\" \/>\r\n                        <small class=\"infocplus-help\">Le montant hypoth\u00e9caire sera calcul\u00e9 automatiquement.<\/small>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-rate\">Taux d'int\u00e9r\u00eat annuel nominal (%)<\/label>\r\n                        <input id=\"infocplus-mortgage-calc-fr-1-rate\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"0.01\" value=\"4.99\" \/>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-frequency\">Fr\u00e9quence des paiements<\/label>\r\n                        <select id=\"infocplus-mortgage-calc-fr-1-frequency\">\r\n                            <option value=\"12\">Mensuelle<\/option>\r\n                            <option value=\"24\">Semi-mensuelle<\/option>\r\n                            <option value=\"26\">Aux 2 semaines<\/option>\r\n                            <option value=\"52\">Hebdomadaire<\/option>\r\n                        <\/select>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-amort-years\">Amortissement<\/label>\r\n                        <div class=\"infocplus-inline-grid\">\r\n                            <input id=\"infocplus-mortgage-calc-fr-1-amort-years\" type=\"number\" inputmode=\"numeric\" min=\"1\" max=\"35\" step=\"1\" value=\"25\" \/>\r\n                            <input id=\"infocplus-mortgage-calc-fr-1-amort-months\" type=\"number\" inputmode=\"numeric\" min=\"0\" max=\"11\" step=\"1\" value=\"0\" \/>\r\n                        <\/div>\r\n                        <small class=\"infocplus-help\">Ann\u00e9es et mois.<\/small>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-term\">Terme hypoth\u00e9caire (ann\u00e9es)<\/label>\r\n                        <input id=\"infocplus-mortgage-calc-fr-1-term\" type=\"number\" inputmode=\"numeric\" min=\"1\" max=\"10\" step=\"1\" value=\"5\" \/>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-lump\">Paiement forfaitaire annuel (optionnel)<\/label>\r\n                        <input id=\"infocplus-mortgage-calc-fr-1-lump\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"500\" value=\"0\" \/>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-field\">\r\n                        <label for=\"infocplus-mortgage-calc-fr-1-increase\">Augmentation annuelle du paiement (%)<\/label>\r\n                        <input id=\"infocplus-mortgage-calc-fr-1-increase\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"0.1\" value=\"0\" \/>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-mortgage-actions\">\r\n                    <button type=\"button\" class=\"infocplus-btn infocplus-btn-primary\" data-action=\"calculate\">Calculer<\/button>\r\n                    <button type=\"button\" class=\"infocplus-btn\" data-action=\"reset\">R\u00e9initialiser<\/button>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-mortgage-results\" aria-live=\"polite\">\r\n                    <div class=\"infocplus-summary-grid\">\r\n                        <div class=\"infocplus-summary-box infocplus-summary-box-accent\">\r\n                            <span class=\"infocplus-summary-label\">Paiement estim\u00e9<\/span>\r\n                            <strong data-output=\"payment\">0,00 $<\/strong>\r\n                            <small data-output=\"paymentLabel\">par mois<\/small>\r\n                        <\/div>\r\n                        <div class=\"infocplus-summary-box\">\r\n                            <span class=\"infocplus-summary-label\">Montant hypoth\u00e9caire<\/span>\r\n                            <strong data-output=\"mortgageAmount\">0,00 $<\/strong>\r\n                            <small data-output=\"downPaymentRatio\">0 % de mise de fonds<\/small>\r\n                        <\/div>\r\n                        <div class=\"infocplus-summary-box\">\r\n                            <span class=\"infocplus-summary-label\">Solde \u00e0 la fin du terme<\/span>\r\n                            <strong data-output=\"balanceAtTerm\">0,00 $<\/strong>\r\n                            <small>Estimation si le taux demeure inchang\u00e9.<\/small>\r\n                        <\/div>\r\n                        <div class=\"infocplus-summary-box\">\r\n                            <span class=\"infocplus-summary-label\">Dur\u00e9e estim\u00e9e totale<\/span>\r\n                            <strong data-output=\"payoffTime\">0 an<\/strong>\r\n                            <small data-output=\"timeSaved\">Aucun raccourcissement pour l'instant<\/small>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-result-panels\">\r\n                        <div class=\"infocplus-panel\">\r\n                            <h3>R\u00e9sum\u00e9 du co\u00fbt<\/h3>\r\n                            <div class=\"infocplus-breakdown-row\">\r\n                                <span>Total des versements<\/span>\r\n                                <strong data-output=\"totalPaid\">0,00 $<\/strong>\r\n                            <\/div>\r\n                            <div class=\"infocplus-breakdown-row\">\r\n                                <span>Int\u00e9r\u00eats totaux<\/span>\r\n                                <strong data-output=\"totalInterest\">0,00 $<\/strong>\r\n                            <\/div>\r\n                            <div class=\"infocplus-breakdown-row\">\r\n                                <span>Int\u00e9r\u00eats \u00e9conomis\u00e9s<\/span>\r\n                                <strong data-output=\"interestSaved\">0,00 $<\/strong>\r\n                            <\/div>\r\n                            <div class=\"infocplus-breakdown-row\">\r\n                                <span>Paiements forfaitaires totaux<\/span>\r\n                                <strong data-output=\"totalLumpSum\">0,00 $<\/strong>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div class=\"infocplus-panel\">\r\n                            <h3>Hypoth\u00e8ses utilis\u00e9es<\/h3>\r\n                            <ul class=\"infocplus-notes\">\r\n                                <li>Calcul canadien avec capitalisation semestrielle, non \u00e0 l'avance.<\/li>\r\n                                <li>Le taux est suppos\u00e9 constant pendant toute la p\u00e9riode simul\u00e9e.<\/li>\r\n                                <li>Les paiements forfaitaires sont appliqu\u00e9s \u00e0 la fin de chaque ann\u00e9e.<\/li>\r\n                                <li>L'augmentation du paiement est appliqu\u00e9e une fois par ann\u00e9e.<\/li>\r\n                            <\/ul>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"infocplus-schedule-wrap\">\r\n                        <div class=\"infocplus-schedule-head\">\r\n                            <h3>Aper\u00e7u de l'amortissement par ann\u00e9e<\/h3>\r\n                            <p>Les 10 premi\u00e8res ann\u00e9es sont affich\u00e9es ci-dessous.<\/p>\r\n                        <\/div>\r\n                        <div class=\"infocplus-table-wrap\">\r\n                            <table>\r\n                                <thead>\r\n                                    <tr>\r\n                                        <th>Ann\u00e9e<\/th>\r\n                                        <th>Paiements<\/th>\r\n                                        <th>Int\u00e9r\u00eats<\/th>\r\n                                        <th>Capital rembours\u00e9<\/th>\r\n                                        <th>Solde<\/th>\r\n                                    <\/tr>\r\n                                <\/thead>\r\n                                <tbody data-output=\"scheduleRows\">\r\n                                    <tr>\r\n                                        <td colspan=\"5\">Entrez vos donn\u00e9es puis cliquez sur \u00ab Calculer \u00bb.<\/td>\r\n                                    <\/tr>\r\n                                <\/tbody>\r\n                            <\/table>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"infocplus-disclaimer\">\r\n                    <p><strong>Avis :<\/strong> Cette calculatrice fournit une estimation \u00e0 titre informatif seulement et ne remplace pas une offre hypoth\u00e9caire, un conseil financier, fiscal ou juridique.<\/p>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <style>\r\n            #infocplus-mortgage-calc-fr-1 {\r\n                --icp-primary: #0f766e;\r\n                --icp-primary-dark: #115e59;\r\n                --icp-text: #0f172a;\r\n                --icp-muted: #475569;\r\n                --icp-border: #dbe4ea;\r\n                --icp-bg: #f8fafc;\r\n                --icp-white: #ffffff;\r\n                margin: 32px 0;\r\n                font-family: inherit;\r\n                color: var(--icp-text);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 * { box-sizing: border-box; }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-card {\r\n                background: linear-gradient(180deg, #ffffff 0%, #f8fbfb 100%);\r\n                border: 1px solid var(--icp-border);\r\n                border-radius: 20px;\r\n                box-shadow: 0 18px 40px rgba(15, 23, 42, 0.08);\r\n                padding: 28px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-header {\r\n                margin-bottom: 22px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-kicker {\r\n                display: inline-block;\r\n                font-size: 12px;\r\n                font-weight: 700;\r\n                letter-spacing: 0.08em;\r\n                text-transform: uppercase;\r\n                color: var(--icp-primary);\r\n                margin-bottom: 10px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 h2 {\r\n                font-size: 32px;\r\n                line-height: 1.15;\r\n                margin: 0 0 10px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 h3 {\r\n                margin: 0 0 14px;\r\n                font-size: 18px;\r\n                line-height: 1.3;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 p {\r\n                margin: 0;\r\n                color: var(--icp-muted);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-grid {\r\n                display: grid;\r\n                grid-template-columns: repeat(2, minmax(0, 1fr));\r\n                gap: 16px;\r\n                margin: 22px 0 18px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-field {\r\n                display: flex;\r\n                flex-direction: column;\r\n                gap: 8px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-inline-grid {\r\n                display: grid;\r\n                grid-template-columns: repeat(2, minmax(0, 1fr));\r\n                gap: 10px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 label {\r\n                font-size: 14px;\r\n                font-weight: 600;\r\n                color: var(--icp-text);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 select,\r\n            #infocplus-mortgage-calc-fr-1 input {\r\n                width: 100%;\r\n                border: 1px solid var(--icp-border);\r\n                background: var(--icp-white);\r\n                border-radius: 12px;\r\n                min-height: 50px;\r\n                padding: 0 14px;\r\n                font: inherit;\r\n                color: var(--icp-text);\r\n                transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 select:focus,\r\n            #infocplus-mortgage-calc-fr-1 input:focus {\r\n                outline: none;\r\n                border-color: var(--icp-primary);\r\n                box-shadow: 0 0 0 4px rgba(15, 118, 110, 0.12);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-help {\r\n                color: var(--icp-muted);\r\n                font-size: 12px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-actions {\r\n                display: flex;\r\n                flex-wrap: wrap;\r\n                gap: 12px;\r\n                margin-bottom: 20px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-btn {\r\n                border: 1px solid var(--icp-border);\r\n                background: #fff;\r\n                color: var(--icp-text);\r\n                border-radius: 999px;\r\n                min-height: 46px;\r\n                padding: 0 18px;\r\n                font: inherit;\r\n                font-weight: 700;\r\n                cursor: pointer;\r\n                transition: transform 0.15s ease, background 0.2s ease, border-color 0.2s ease;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-btn:hover {\r\n                transform: translateY(-1px);\r\n                border-color: #c4d2db;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-btn-primary {\r\n                background: var(--icp-primary);\r\n                color: #fff;\r\n                border-color: var(--icp-primary);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-btn-primary:hover {\r\n                background: var(--icp-primary-dark);\r\n                border-color: var(--icp-primary-dark);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-results {\r\n                display: flex;\r\n                flex-direction: column;\r\n                gap: 18px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-summary-grid {\r\n                display: grid;\r\n                grid-template-columns: repeat(2, minmax(0, 1fr));\r\n                gap: 14px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-summary-box {\r\n                border-radius: 16px;\r\n                background: #fff;\r\n                border: 1px solid var(--icp-border);\r\n                padding: 16px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-summary-box-accent {\r\n                background: linear-gradient(180deg, rgba(15, 118, 110, 0.08) 0%, rgba(15, 118, 110, 0.14) 100%);\r\n                border-color: rgba(15, 118, 110, 0.18);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-summary-label {\r\n                display: block;\r\n                font-size: 13px;\r\n                color: var(--icp-muted);\r\n                margin-bottom: 6px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-summary-box strong {\r\n                display: block;\r\n                font-size: 28px;\r\n                line-height: 1.15;\r\n                margin-bottom: 6px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-summary-box small {\r\n                color: var(--icp-muted);\r\n                display: block;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-result-panels {\r\n                display: grid;\r\n                grid-template-columns: repeat(2, minmax(0, 1fr));\r\n                gap: 16px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-panel {\r\n                background: var(--icp-bg);\r\n                border: 1px solid var(--icp-border);\r\n                border-radius: 18px;\r\n                padding: 18px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-breakdown-row {\r\n                display: flex;\r\n                justify-content: space-between;\r\n                align-items: center;\r\n                gap: 12px;\r\n                padding: 10px 0;\r\n                border-bottom: 1px solid rgba(219, 228, 234, 0.8);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-breakdown-row:last-child {\r\n                border-bottom: none;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-breakdown-row span {\r\n                color: var(--icp-muted);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-notes {\r\n                margin: 0;\r\n                padding-left: 18px;\r\n                color: var(--icp-muted);\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-notes li + li {\r\n                margin-top: 8px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-schedule-wrap {\r\n                background: #fff;\r\n                border: 1px solid var(--icp-border);\r\n                border-radius: 18px;\r\n                overflow: hidden;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-schedule-head {\r\n                padding: 18px 18px 0;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-table-wrap {\r\n                width: 100%;\r\n                overflow-x: auto;\r\n                padding: 18px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 table {\r\n                width: 100%;\r\n                border-collapse: collapse;\r\n                min-width: 640px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 th,\r\n            #infocplus-mortgage-calc-fr-1 td {\r\n                text-align: left;\r\n                padding: 12px 10px;\r\n                border-bottom: 1px solid rgba(219, 228, 234, 0.8);\r\n                font-size: 14px;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 th {\r\n                color: var(--icp-muted);\r\n                font-weight: 700;\r\n                background: #f8fafc;\r\n            }\r\n            #infocplus-mortgage-calc-fr-1 .infocplus-disclaimer {\r\n                margin-top: 18px;\r\n                padding-top: 14px;\r\n                border-top: 1px solid rgba(219, 228, 234, 0.8);\r\n            }\r\n            @media (max-width: 860px) {\r\n                #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-grid,\r\n                #infocplus-mortgage-calc-fr-1 .infocplus-summary-grid,\r\n                #infocplus-mortgage-calc-fr-1 .infocplus-result-panels {\r\n                    grid-template-columns: 1fr;\r\n                }\r\n            }\r\n            @media (max-width: 640px) {\r\n                #infocplus-mortgage-calc-fr-1 .infocplus-mortgage-card {\r\n                    padding: 18px;\r\n                    border-radius: 16px;\r\n                }\r\n                #infocplus-mortgage-calc-fr-1 h2 {\r\n                    font-size: 28px;\r\n                }\r\n                #infocplus-mortgage-calc-fr-1 .infocplus-inline-grid {\r\n                    grid-template-columns: 1fr;\r\n                }\r\n                #infocplus-mortgage-calc-fr-1 .infocplus-summary-box strong {\r\n                    font-size: 24px;\r\n                }\r\n            }\r\n        <\/style>\r\n\r\n        <script>\r\n            (function() {\r\n                const root = document.getElementById('infocplus-mortgage-calc-fr-1');\r\n                if (!root) return;\r\n\r\n                const els = {\r\n                    price: root.querySelector('#infocplus-mortgage-calc-fr-1-price'),\r\n                    down: root.querySelector('#infocplus-mortgage-calc-fr-1-down'),\r\n                    rate: root.querySelector('#infocplus-mortgage-calc-fr-1-rate'),\r\n                    frequency: root.querySelector('#infocplus-mortgage-calc-fr-1-frequency'),\r\n                    amortYears: root.querySelector('#infocplus-mortgage-calc-fr-1-amort-years'),\r\n                    amortMonths: root.querySelector('#infocplus-mortgage-calc-fr-1-amort-months'),\r\n                    term: root.querySelector('#infocplus-mortgage-calc-fr-1-term'),\r\n                    lump: root.querySelector('#infocplus-mortgage-calc-fr-1-lump'),\r\n                    increase: root.querySelector('#infocplus-mortgage-calc-fr-1-increase'),\r\n                    payment: root.querySelector('[data-output=\"payment\"]'),\r\n                    paymentLabel: root.querySelector('[data-output=\"paymentLabel\"]'),\r\n                    mortgageAmount: root.querySelector('[data-output=\"mortgageAmount\"]'),\r\n                    downPaymentRatio: root.querySelector('[data-output=\"downPaymentRatio\"]'),\r\n                    balanceAtTerm: root.querySelector('[data-output=\"balanceAtTerm\"]'),\r\n                    payoffTime: root.querySelector('[data-output=\"payoffTime\"]'),\r\n                    timeSaved: root.querySelector('[data-output=\"timeSaved\"]'),\r\n                    totalPaid: root.querySelector('[data-output=\"totalPaid\"]'),\r\n                    totalInterest: root.querySelector('[data-output=\"totalInterest\"]'),\r\n                    interestSaved: root.querySelector('[data-output=\"interestSaved\"]'),\r\n                    totalLumpSum: root.querySelector('[data-output=\"totalLumpSum\"]'),\r\n                    scheduleRows: root.querySelector('[data-output=\"scheduleRows\"]')\r\n                };\r\n\r\n                const currency = new Intl.NumberFormat('fr-CA', {\r\n                    style: 'currency',\r\n                    currency: 'CAD',\r\n                    maximumFractionDigits: 2\r\n                });\r\n\r\n                const number = (value) => {\r\n                    const parsed = parseFloat(value);\r\n                    return Number.isFinite(parsed) ? parsed : 0;\r\n                };\r\n\r\n                const round2 = (value) => Math.round((value + Number.EPSILON) * 100) \/ 100;\r\n\r\n                const formatDuration = (periods, perYear) => {\r\n                    const totalMonths = (periods \/ perYear) * 12;\r\n                    let years = Math.floor(totalMonths \/ 12);\r\n                    let months = Math.round(totalMonths - (years * 12));\r\n                    if (months === 12) {\r\n                        years += 1;\r\n                        months = 0;\r\n                    }\r\n                    const yLabel = years > 1 ? 'ans' : 'an';\r\n                    const mLabel = months > 1 ? 'mois' : 'mois';\r\n                    if (years > 0 && months > 0) return `${years} ${yLabel} ${months} ${mLabel}`;\r\n                    if (years > 0) return `${years} ${yLabel}`;\r\n                    return `${months} ${mLabel}`;\r\n                };\r\n\r\n                const paymentLabel = (perYear) => {\r\n                    switch (perYear) {\r\n                        case 12: return 'par mois';\r\n                        case 24: return 'par demi-mois';\r\n                        case 26: return 'aux 2 semaines';\r\n                        case 52: return 'par semaine';\r\n                        default: return 'par p\u00e9riode';\r\n                    }\r\n                };\r\n\r\n                const periodicRateFromCanadianNominal = (annualRatePct, periodsPerYear) => {\r\n                    const annualRate = annualRatePct \/ 100;\r\n                    if (annualRate === 0) return 0;\r\n                    return Math.pow(1 + annualRate \/ 2, 2 \/ periodsPerYear) - 1;\r\n                };\r\n\r\n                const basePayment = (principal, periodicRate, totalPeriods) => {\r\n                    if (principal <= 0 || totalPeriods <= 0) return 0;\r\n                    if (periodicRate === 0) return principal \/ totalPeriods;\r\n                    return principal * periodicRate \/ (1 - Math.pow(1 + periodicRate, -totalPeriods));\r\n                };\r\n\r\n                const simulateMortgage = ({ principal, perYear, periodicRate, amortPeriods, termPeriods, annualLumpSum, annualIncreasePct }) => {\r\n                    let balance = principal;\r\n                    let payment = basePayment(principal, periodicRate, amortPeriods);\r\n                    const originalPayment = payment;\r\n                    let totalPaid = 0;\r\n                    let totalInterest = 0;\r\n                    let totalLumpSum = 0;\r\n                    let periods = 0;\r\n                    let balanceAtTerm = principal;\r\n                    let schedule = [];\r\n                    let yearInterest = 0;\r\n                    let yearPrincipal = 0;\r\n                    let yearPaid = 0;\r\n                    let currentYear = 1;\r\n                    const maxPeriods = Math.max(1, Math.ceil(amortPeriods * 2 + perYear * 5));\r\n\r\n                    while (balance > 0.005 && periods < maxPeriods) {\r\n                        periods += 1;\r\n                        const interest = balance * periodicRate;\r\n                        let principalPaid = payment - interest;\r\n\r\n                        if (principalPaid <= 0) {\r\n                            return {\r\n                                invalid: true,\r\n                                reason: 'Le paiement calcul\u00e9 est insuffisant pour couvrir les int\u00e9r\u00eats.'\r\n                            };\r\n                        }\r\n\r\n                        if (principalPaid > balance) {\r\n                            principalPaid = balance;\r\n                        }\r\n\r\n                        const actualPayment = interest + principalPaid;\r\n                        balance = Math.max(0, balance - principalPaid);\r\n                        totalPaid += actualPayment;\r\n                        totalInterest += interest;\r\n                        yearPaid += actualPayment;\r\n                        yearInterest += interest;\r\n                        yearPrincipal += principalPaid;\r\n\r\n                        if (periods === termPeriods) {\r\n                            balanceAtTerm = balance;\r\n                        }\r\n\r\n                        const isYearEnd = (periods % perYear === 0) || balance <= 0.005;\r\n\r\n                        if (isYearEnd) {\r\n                            if (balance > 0.005 && annualLumpSum > 0) {\r\n                                const lumpApplied = Math.min(balance, annualLumpSum);\r\n                                balance = Math.max(0, balance - lumpApplied);\r\n                                totalPaid += lumpApplied;\r\n                                totalLumpSum += lumpApplied;\r\n                                yearPaid += lumpApplied;\r\n                                yearPrincipal += lumpApplied;\r\n                            }\r\n\r\n                            schedule.push({\r\n                                year: currentYear,\r\n                                paid: yearPaid,\r\n                                interest: yearInterest,\r\n                                principal: yearPrincipal,\r\n                                balance: balance\r\n                            });\r\n\r\n                            if (balance > 0.005 && annualIncreasePct > 0) {\r\n                                payment = payment * (1 + (annualIncreasePct \/ 100));\r\n                            }\r\n\r\n                            currentYear += 1;\r\n                            yearInterest = 0;\r\n                            yearPrincipal = 0;\r\n                            yearPaid = 0;\r\n                        }\r\n                    }\r\n\r\n                    if (periods < termPeriods) {\r\n                        balanceAtTerm = 0;\r\n                    }\r\n\r\n                    return {\r\n                        invalid: false,\r\n                        payment: originalPayment,\r\n                        adjustedFinalPayment: payment,\r\n                        totalPaid,\r\n                        totalInterest,\r\n                        totalLumpSum,\r\n                        periods,\r\n                        balanceAtTerm,\r\n                        schedule\r\n                    };\r\n                };\r\n\r\n                const showMessageRow = (message) => {\r\n                    els.scheduleRows.innerHTML = `<tr><td colspan=\"5\">${message}<\/td><\/tr>`;\r\n                };\r\n\r\n                const calculate = () => {\r\n                    const propertyPrice = number(els.price.value);\r\n                    const downPayment = number(els.down.value);\r\n                    const annualRate = number(els.rate.value);\r\n                    const perYear = parseInt(els.frequency.value, 10) || 12;\r\n                    const amortYears = Math.max(0, Math.floor(number(els.amortYears.value)));\r\n                    const amortMonths = Math.min(11, Math.max(0, Math.floor(number(els.amortMonths.value))));\r\n                    const termYears = Math.max(1, Math.floor(number(els.term.value)));\r\n                    const annualLumpSum = Math.max(0, number(els.lump.value));\r\n                    const annualIncreasePct = Math.max(0, number(els.increase.value));\r\n\r\n                    if (propertyPrice <= 0) {\r\n                        showMessageRow('Veuillez entrer un prix de propri\u00e9t\u00e9 valide.');\r\n                        return;\r\n                    }\r\n\r\n                    if (downPayment < 0 || downPayment >= propertyPrice) {\r\n                        showMessageRow('La mise de fonds doit \u00eatre inf\u00e9rieure au prix de la propri\u00e9t\u00e9.');\r\n                        return;\r\n                    }\r\n\r\n                    const principal = propertyPrice - downPayment;\r\n                    const downRatio = propertyPrice > 0 ? (downPayment \/ propertyPrice) * 100 : 0;\r\n                    const amortPeriods = Math.round((amortYears + (amortMonths \/ 12)) * perYear);\r\n                    const termPeriods = Math.round(termYears * perYear);\r\n\r\n                    if (principal <= 0 || amortPeriods <= 0) {\r\n                        showMessageRow('Veuillez v\u00e9rifier le montant hypoth\u00e9caire et l\u2019amortissement.');\r\n                        return;\r\n                    }\r\n\r\n                    const periodicRate = periodicRateFromCanadianNominal(annualRate, perYear);\r\n                    const withOptions = simulateMortgage({\r\n                        principal,\r\n                        perYear,\r\n                        periodicRate,\r\n                        amortPeriods,\r\n                        termPeriods,\r\n                        annualLumpSum,\r\n                        annualIncreasePct\r\n                    });\r\n\r\n                    const baseline = simulateMortgage({\r\n                        principal,\r\n                        perYear,\r\n                        periodicRate,\r\n                        amortPeriods,\r\n                        termPeriods,\r\n                        annualLumpSum: 0,\r\n                        annualIncreasePct: 0\r\n                    });\r\n\r\n                    if (withOptions.invalid || baseline.invalid) {\r\n                        showMessageRow('Impossible de calculer ce sc\u00e9nario avec les donn\u00e9es entr\u00e9es.');\r\n                        return;\r\n                    }\r\n\r\n                    const timeSavedPeriods = Math.max(0, baseline.periods - withOptions.periods);\r\n                    const interestSaved = Math.max(0, baseline.totalInterest - withOptions.totalInterest);\r\n\r\n                    els.payment.textContent = currency.format(round2(withOptions.payment));\r\n                    els.paymentLabel.textContent = paymentLabel(perYear);\r\n                    els.mortgageAmount.textContent = currency.format(round2(principal));\r\n                    els.downPaymentRatio.textContent = `${downRatio.toFixed(1).replace('.', ',')} % de mise de fonds`;\r\n                    els.balanceAtTerm.textContent = currency.format(round2(withOptions.balanceAtTerm));\r\n                    els.payoffTime.textContent = formatDuration(withOptions.periods, perYear);\r\n                    els.timeSaved.textContent = timeSavedPeriods > 0\r\n                        ? `${formatDuration(timeSavedPeriods, perYear)} \u00e9conomis\u00e9${timeSavedPeriods > perYear ? 's' : ''}`\r\n                        : 'Aucun raccourcissement par rapport au sc\u00e9nario de base';\r\n                    els.totalPaid.textContent = currency.format(round2(withOptions.totalPaid));\r\n                    els.totalInterest.textContent = currency.format(round2(withOptions.totalInterest));\r\n                    els.interestSaved.textContent = currency.format(round2(interestSaved));\r\n                    els.totalLumpSum.textContent = currency.format(round2(withOptions.totalLumpSum));\r\n\r\n                    const rows = withOptions.schedule.slice(0, 10).map((row) => `\r\n                        <tr>\r\n                            <td>${row.year}<\/td>\r\n                            <td>${currency.format(round2(row.paid))}<\/td>\r\n                            <td>${currency.format(round2(row.interest))}<\/td>\r\n                            <td>${currency.format(round2(row.principal))}<\/td>\r\n                            <td>${currency.format(round2(row.balance))}<\/td>\r\n                        <\/tr>\r\n                    `).join('');\r\n\r\n                    els.scheduleRows.innerHTML = rows || '<tr><td colspan=\"5\">Aucune donn\u00e9e disponible.<\/td><\/tr>';\r\n                };\r\n\r\n                root.querySelectorAll('[data-action=\"calculate\"]').forEach((button) => {\r\n                    button.addEventListener('click', calculate);\r\n                });\r\n\r\n                root.querySelectorAll('[data-action=\"reset\"]').forEach((button) => {\r\n                    button.addEventListener('click', () => {\r\n                        els.price.value = '500000';\r\n                        els.down.value = '100000';\r\n                        els.rate.value = '4.99';\r\n                        els.frequency.value = '12';\r\n                        els.amortYears.value = '25';\r\n                        els.amortMonths.value = '0';\r\n                        els.term.value = '5';\r\n                        els.lump.value = '0';\r\n                        els.increase.value = '0';\r\n                        calculate();\r\n                    });\r\n                });\r\n\r\n                [els.price, els.down, els.rate, els.frequency, els.amortYears, els.amortMonths, els.term, els.lump, els.increase].forEach((field) => {\r\n                    field.addEventListener('change', calculate);\r\n                });\r\n\r\n                calculate();\r\n            })();\r\n        <\/script>\r\n        <\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5691","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/infocplus.com\/fr\/wp-json\/wp\/v2\/pages\/5691","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infocplus.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/infocplus.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/infocplus.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/infocplus.com\/fr\/wp-json\/wp\/v2\/comments?post=5691"}],"version-history":[{"count":0,"href":"https:\/\/infocplus.com\/fr\/wp-json\/wp\/v2\/pages\/5691\/revisions"}],"wp:attachment":[{"href":"https:\/\/infocplus.com\/fr\/wp-json\/wp\/v2\/media?parent=5691"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}