{"id":14883,"date":"2026-02-19T14:32:54","date_gmt":"2026-02-19T19:32:50","guid":{"rendered":"https:\/\/dev.nsira-ossnr.gc.ca\/annual-reports-2\/"},"modified":"2026-04-17T15:20:31","modified_gmt":"2026-04-17T19:20:31","slug":"recommendation-tracker","status":"publish","type":"page","link":"https:\/\/nsira-ossnr.gc.ca\/fr\/publications\/suivi-des-recommandations\/","title":{"rendered":"Recommendations Tracker"},"content":{"rendered":"<section id=\"gm8c4559e\" class=\"wp-block-gutentor-m4 section-gm8c4559e gutentor-module gutentor-advanced-columns\"><div class=\"grid-container\"><div class=\"grid-row\">\n<div id=\"col-gm1a43c1\" class=\"wp-block-gutentor-m4-col col-gm1a43c1 gutentor-single-column  grid-lg-12 grid-md-12 grid-12\"><div id=\"section-gm1a43c1\" class=\"section-gm1a43c1 gutentor-col-wrap\">\n<h1 class=\"wp-block-heading title-accent h1 mrgn-tp-lg mrgn-bttm-lg\">NSIRA Recommendations<\/h1>\n<\/div><\/div>\n<\/div><\/div><\/section>\n\n\n\n    \r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.3\/dist\/chart.umd.min.js\"><\/script>\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chartjs-plugin-datalabels@2.2.0\"><\/script>\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/xlsx@0.18.5\/dist\/xlsx.full.min.js\"><\/script>\r\n\r\n    <div id=\"nsira-recommendations-dashboard\" class=\"nsira-wrap container-fluid py-4 px-3 px-md-4\">\r\n        \r\n        <div class=\"row g-4 mb-4 align-items-center\">\r\n            <div class=\"col-12 col-lg-7\">\r\n                <div class=\"chart-card\">\r\n                    <h2 class=\"section-title\" data-en=\"Recommendations Issued by Year\" data-fr=\"Recommandations \u00e9mises par ann\u00e9e\">Recommandations \u00e9mises par ann\u00e9e<\/h2>\r\n                    <div class=\"chart-box chart-box-lg\"><canvas id=\"issuedByYearChart\"><\/canvas><\/div>\r\n                <\/div>\r\n            <\/div>\r\n            <div class=\"col-12 col-lg-5 text-center\">\r\n                <div class=\"chart-card\">\r\n                    <h2 class=\"section-title\" data-en=\"Total Recommendations Issued\" data-fr=\"Total des recommandations \u00e9mises\">Nombre total de recommandations \u00e9mises<\/h2>\r\n                    <div id=\"grand-total-display\" class=\"grand-total\">...<\/div>\r\n                    <div class=\"pie-container-small\"><canvas id=\"totalRecommendationsPie\"><\/canvas><\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"row mb-4\">\r\n            <div class=\"col-12\">\r\n                <div class=\"chart-card position-relative\">\r\n                    <h2 class=\"section-title mb-0\" data-en=\"Departmental Response to Recommendations\" data-fr=\"R\u00e9ponse minist\u00e9rielle aux recommandations\">R\u00e9ponse du minist\u00e8re aux recommandations<\/h2>\r\n                    <div class=\"section-subnote\" data-en=\"* Disagree also includes agree in principle and partially agree\" data-fr=\"* \u00ab D\u00e9saccord \u00bb comprend \u00e9galement l'accord de principe et l'accord partiel\">Le d\u00e9saccord inclut \u00e9galement l'accord de principe et l'accord partiel.<\/div>\r\n                    \r\n                    <div class=\"pie-overlay\"><canvas id=\"responseSummaryPie\"><\/canvas><\/div>\r\n                    <div class=\"chart-box chart-box-lg\"><canvas id=\"deptResponseChart\"><\/canvas><\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"row\">\r\n            <div class=\"col-12\">\r\n                <div class=\"chart-card\">\r\n                    <h2 class=\"section-title mb-0\" data-en=\"Departmental Response to Recommendations\" data-fr=\"R\u00e9ponse minist\u00e9rielle aux recommandations\">R\u00e9ponse du minist\u00e8re aux recommandations<\/h2>\r\n                    <div class=\"chart-box chart-box-lg\"><canvas id=\"implementationStatusChart\"><\/canvas><\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <style>\r\n        .section-title { font-size: 1.4em;\r\n            font-weight: 700;\r\n            margin-bottom: 40px;\r\n            margin-top: 10px; \r\n        }\r\n        .nsira-wrap { padding: 10px 80px !important; font-family: \"Inter\", Arial, sans-serif; color: #222; max-width: 1400px; margin: 0 auto; }\r\n        .section-subnote { font-size: 1.4rem; color: #555; margin-bottom: 15px; font-style: italic; }\r\n        .grand-total { font-size: 3.5rem; font-weight: 800; color: #222; margin: 5px 0; }\r\n        .chart-card { background: #fff; padding: 15px; border-radius: 8px; position: relative; }\r\n        .chart-box-lg { height: 420px; position: relative; width: 100%; }\r\n        \r\n        .pie-container-small { width: 260px; height: 260px; margin: 0 auto; position: relative; }\r\n        \r\n        .pie-overlay {\r\n            position: absolute;\r\n            top: 120px;\r\n            right: 120px;\r\n            width: 275px;\r\n            height: 275px;\r\n            z-index: 10;\r\n            background: rgba(255,255,255,0.7); \/* Slight fade to keep bar labels readable behind it *\/\r\n            border-radius: 50%;\r\n        }\r\n\r\n        @media (max-width: 991px) { \r\n            .nsira-wrap { padding: 10px 20px !important; } \r\n            .pie-overlay { position: relative; margin: 20px auto 0; top: 0; right: 0; width: 220px; height: 220px; background: transparent; }\r\n            .chart-box-lg { height: 320px; }\r\n        }\r\n    <\/style>\r\n\r\n    <script>\r\n    (() => {\r\n        Chart.register(ChartDataLabels);\r\n        \r\n        \/\/ 1. LANGUAGE DETECTION\r\n        const isFrench = window.location.pathname.includes('\/fr\/');\r\n\r\n        \/\/ 2. DICTIONARIES\r\n        const depts = {\r\n            \"CSIS\": isFrench ? \"SCRS\" : \"CSIS\",\r\n            \"CSE\": isFrench ? \"CST\" : \"CSE\",\r\n            \"DND\/CAF\": isFrench ? \"MDN\/FAC\" : \"DND\/CAF\",\r\n            \"GAC\": isFrench ? \"AMC\" : \"GAC\",\r\n            \"PCO\": isFrench ? \"BCP\" : \"PCO\",\r\n            \"FINTRAC\": isFrench ? \"CANAFE\" : \"FINTRAC\",\r\n            \"CRA\": isFrench ? \"ARC\" : \"CRA\",\r\n            \"CBSA\": isFrench ? \"ASFC\" : \"CBSA\",\r\n            \"RCMP\": isFrench ? \"GRC\" : \"RCMP\",\r\n            \"TC\": isFrench ? \"TC\" : \"TC\",\r\n            \"DFO\": isFrench ? \"MPO\" : \"DFO\",\r\n            \"IRCC\": isFrench ? \"IRCC\" : \"IRCC\",\r\n            \"JUS\": isFrench ? \"JUS\" : \"JUS\",\r\n            \"PS\": isFrench ? \"SP\" : \"PS\",\r\n            \"FIN\": isFrench ? \"MDF\" : \"FIN\",\r\n            \"TBS\": isFrench ? \"SCT\" : \"TBS\",\r\n            \"CFIA\": isFrench ? \"ACIA\" : \"CFIA\"\r\n        };\r\n\r\n        const i18n = {\r\n            review: isFrench ? \"Examen\" : \"Review\",\r\n            investigation: isFrench ? \"Enqu\u00eate\" : \"Investigation\",\r\n            agree: isFrench ? \"Accord\" : \"Agree\",\r\n            awaiting: isFrench ? \"En attente\" : \"Awaiting\",\r\n            disagree: isFrench ? \"D\u00e9saccord*\" : \"Disagree*\",\r\n            noIntend: isFrench ? \"N'a pas l'intention de mettre en \u0153uvre\" : \"Do not intend to implement\",\r\n            implemented: isFrench ? \"Mis en \u0153uvre\" : \"Implemented\",\r\n            onHold: isFrench ? \"En suspens\" : \"On hold\",\r\n            ongoing: isFrench ? \"En cours\" : \"Ongoing\",\r\n            noResponse: isFrench ? \"R\u00e9ponses non fournies\" : \"Responses not provided\"\r\n        };\r\n\r\n        const fileUrl = \"\/wp-content\/uploads\/nsira_data_template.xlsx\";\r\n        const COLORS = { navy: \"#1E2B3F\", maroon: \"#73444F\", lightBlue: \"#95B2D1\", pink: \"#CFA0A8\", lightGray: \"#D9D9D9\", grid: \"#E5E5E5\" };\r\n\r\n        async function initDashboard() {\r\n            try {\r\n                \/\/ --- TITLE TRANSLATION LOGIC ---\r\n                document.querySelectorAll('[data-en]').forEach(el => {\r\n                    el.textContent = isFrench ? el.getAttribute('data-fr') : el.getAttribute('data-en');\r\n                });\r\n\r\n                const response = await fetch(fileUrl);\r\n                const arrayBuffer = await response.arrayBuffer();\r\n                const workbook = XLSX.read(arrayBuffer, { type: 'buffer' });\r\n                const getSheet = (name) => XLSX.utils.sheet_to_json(workbook.Sheets[name]);\r\n\r\n                const stackedOptions = {\r\n                    responsive: true, maintainAspectRatio: false,\r\n                    plugins: {\r\n                        legend: { position: 'bottom', labels: { usePointStyle: true, font: { weight: '600' } } },\r\n                        datalabels: { color: \"#fff\", backgroundColor: \"rgba(0,0,0,0.4)\", borderRadius: 4, font: { weight: 'bold' }, formatter: (v) => v > 0 ? v : null }\r\n                    },\r\n                    scales: {\r\n                        x: { stacked: true, grid: { display: false }, ticks: { font: { weight: 'bold' } } },\r\n                        y: { stacked: true, beginAtZero: true, grid: { color: COLORS.grid } }\r\n                    }\r\n                };\r\n\r\n                \/\/ 1. Issued By Year\r\n                const yearData = getSheet(\"IssuedByYear\").filter(r => r.Year && r.Year !== 'Unknown');\r\n                new Chart(document.getElementById('issuedByYearChart'), {\r\n                    type: 'bar',\r\n                    data: {\r\n                        labels: yearData.map(r => r.Year),\r\n                        datasets: [\r\n                            { label: i18n.investigation, data: yearData.map(r => r.Investigation), backgroundColor: COLORS.navy },\r\n                            { label: i18n.review, data: yearData.map(r => r.Review), backgroundColor: COLORS.maroon }\r\n                        ]\r\n                    },\r\n                    options: stackedOptions\r\n                });\r\n\r\n                \/\/ 2. Dept Response\r\n                const deptData = getSheet(\"DeptResponse\");\r\n                new Chart(document.getElementById('deptResponseChart'), {\r\n                    type: 'bar',\r\n                    data: {\r\n                        labels: deptData.map(r => depts[r.Dept] || r.Dept),\r\n                        datasets: [\r\n                            { label: i18n.agree, data: deptData.map(r => r.Agree), backgroundColor: COLORS.lightBlue },\r\n                            { label: i18n.awaiting, data: deptData.map(r => r.Awaiting), backgroundColor: COLORS.maroon },\r\n                            { label: i18n.disagree, data: deptData.map(r => r.Disagree), backgroundColor: COLORS.navy }\r\n                        ]\r\n                    },\r\n                    options: stackedOptions\r\n                });\r\n\r\n                \/\/ 3. Implementation Status\r\n                const implData = getSheet(\"ImplementationStatus\");\r\n                new Chart(document.getElementById('implementationStatusChart'), {\r\n                    type: 'bar',\r\n                    data: {\r\n                        labels: implData.map(r => depts[r.Dept] || r.Dept),\r\n                        datasets: [\r\n                            { label: i18n.implemented, data: implData.map(r => r.Implemented), backgroundColor: COLORS.lightBlue },\r\n                            { label: i18n.ongoing, data: implData.map(r => r.Ongoing), backgroundColor: COLORS.pink },\r\n                            { label: i18n.onHold, data: implData.map(r => r.OnHold), backgroundColor: COLORS.lightGray },\r\n                            { label: i18n.noIntend, data: implData.map(r => r.NoIntend), backgroundColor: COLORS.navy },\r\n                            { label: i18n.noResponse, data: implData.map(r => r.NoResponse), backgroundColor: COLORS.maroon }\r\n                        ]\r\n                    },\r\n                    options: stackedOptions\r\n                });\r\n\r\n                \/\/ 4. Pie Charts\r\n                const pieConf = {\r\n                    responsive: true, maintainAspectRatio: true,\r\n                    plugins: {\r\n                        legend: { display: false },\r\n                        datalabels: { color: '#ffffff', font: { weight: 'bold', size: 10 }, textAlign: 'center', formatter: (v, ctx) => ctx.chart.data.labels[ctx.dataIndex] + '\\n' + v }\r\n                    }\r\n                };\r\n\r\n                const totalData = getSheet(\"TotalIssued\");\r\n                document.getElementById('grand-total-display').innerText = totalData.reduce((a, b) => a + b.Count, 0);\r\n                new Chart(document.getElementById('totalRecommendationsPie'), {\r\n                    type: 'pie',\r\n                    data: {\r\n                        labels: totalData.map(r => i18n[r.ActivityType.toLowerCase()] || r.ActivityType),\r\n                        datasets: [{ data: totalData.map(r => r.Count), backgroundColor: [COLORS.maroon, COLORS.navy] }]\r\n                    },\r\n                    options: pieConf\r\n                });\r\n\r\n                const respPie = getSheet(\"DeptResponsePie\");\r\n                new Chart(document.getElementById('responseSummaryPie'), {\r\n                    type: 'pie',\r\n                    data: {\r\n                        labels: respPie.map(r => i18n[r.FinalResponse.toLowerCase()] || r.FinalResponse),\r\n                        datasets: [{ data: respPie.map(r => r.Count), backgroundColor: [COLORS.lightBlue, COLORS.maroon, COLORS.navy] }]\r\n                    },\r\n                    options: pieConf\r\n                });\r\n\r\n            } catch (err) { console.error(\"Dashboard error:\", err); }\r\n        }\r\n        initDashboard();\r\n    })();\r\n    <\/script>\r\n    \n\n\n\n<!--\n<object data=\"\/wp-content\/uploads\/Recommendations_Dashboard_2026-03-21.pdf\" type=\"application\/pdf\" width=\"100%\" height=\"1200px\">\n    <p>It appears you don't have a PDF plugin for this browser.\n    No biggie... you can <a href=\"https:\/\/your-site.com\/file.pdf\">click here to\n    download the PDF file.<\/a><\/p>\n<\/object>\n-->","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":11552,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-nsira-subpages.php","meta":{"inline_featured_image":false},"categories":[24],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Recommendations Tracker - National Security and Intelligence Review Agency<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nsira-ossnr.gc.ca\/fr\/publications\/suivi-des-recommandations\/\" \/>\n<meta property=\"og:locale\" content=\"fr_CA\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Recommendations Tracker - National Security and Intelligence Review Agency\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nsira-ossnr.gc.ca\/fr\/publications\/suivi-des-recommandations\/\" \/>\n<meta property=\"og:site_name\" content=\"National Security and Intelligence Review Agency\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-17T19:20:31+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimation du temps de lecture\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/\",\"url\":\"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/\",\"name\":\"Recommendations Tracker - National Security and Intelligence Review Agency\",\"isPartOf\":{\"@id\":\"https:\/\/nsira-ossnr.gc.ca\/#website\"},\"datePublished\":\"2026-02-19T19:32:50+00:00\",\"dateModified\":\"2026-04-17T19:20:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/#breadcrumb\"},\"inLanguage\":\"fr-CA\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Publications\",\"item\":\"\/publications\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Recommendations Tracker\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nsira-ossnr.gc.ca\/#website\",\"url\":\"https:\/\/nsira-ossnr.gc.ca\/\",\"name\":\"National Security and Intelligence Review Agency\",\"description\":\"Official Website\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nsira-ossnr.gc.ca\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-CA\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Recommendations Tracker - National Security and Intelligence Review Agency","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nsira-ossnr.gc.ca\/fr\/publications\/suivi-des-recommandations\/","og_locale":"fr_CA","og_type":"article","og_title":"Recommendations Tracker - National Security and Intelligence Review Agency","og_url":"https:\/\/nsira-ossnr.gc.ca\/fr\/publications\/suivi-des-recommandations\/","og_site_name":"National Security and Intelligence Review Agency","article_modified_time":"2026-04-17T19:20:31+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimation du temps de lecture":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/","url":"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/","name":"Recommendations Tracker - National Security and Intelligence Review Agency","isPartOf":{"@id":"https:\/\/nsira-ossnr.gc.ca\/#website"},"datePublished":"2026-02-19T19:32:50+00:00","dateModified":"2026-04-17T19:20:31+00:00","breadcrumb":{"@id":"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/#breadcrumb"},"inLanguage":"fr-CA","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nsira-ossnr.gc.ca\/publications\/recommendation-tracker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Publications","item":"\/publications\/"},{"@type":"ListItem","position":2,"name":"Recommendations Tracker"}]},{"@type":"WebSite","@id":"https:\/\/nsira-ossnr.gc.ca\/#website","url":"https:\/\/nsira-ossnr.gc.ca\/","name":"National Security and Intelligence Review Agency","description":"Official Website","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nsira-ossnr.gc.ca\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-CA"}]}},"_links":{"self":[{"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/pages\/14883"}],"collection":[{"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/comments?post=14883"}],"version-history":[{"count":151,"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/pages\/14883\/revisions"}],"predecessor-version":[{"id":16651,"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/pages\/14883\/revisions\/16651"}],"up":[{"embeddable":true,"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/pages\/11552"}],"wp:attachment":[{"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/media?parent=14883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/categories?post=14883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nsira-ossnr.gc.ca\/fr\/wp-json\/wp\/v2\/tags?post=14883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}