From 45023185a1dc1212f21c74de585f3aa736bddaa2 Mon Sep 17 00:00:00 2001
From: bdaneels <brecht.daneels@hotmail.com>
Date: Mon, 24 Mar 2025 16:36:07 +0100
Subject: [PATCH] adding coursesEnrolled.js as a functionality to check what
 courses have been taken up.

---
 coursesEnrolled.js           | 108 +++++++++++++++++++++++++++++++++++
 iterateOverDashboardTable.js |   7 ++-
 todo.md                      |   7 +++
 3 files changed, 121 insertions(+), 1 deletion(-)
 create mode 100644 coursesEnrolled.js
 create mode 100644 todo.md

diff --git a/coursesEnrolled.js b/coursesEnrolled.js
new file mode 100644
index 0000000..d96c03c
--- /dev/null
+++ b/coursesEnrolled.js
@@ -0,0 +1,108 @@
+const puppeteer = require('puppeteer');
+const IFRAME_SELECTOR = 'iframe[title="Hoofdinhoud"]';
+const wait = require("./wait");
+
+//Er zijn een aantal helperfuncties die nog verwijderd moeten worden
+//zo is de functie van de contentFrame te verwijderen want staat dubbel in evaluatestartpakket.js
+//de iframeselector is eveneens van belang om te verwijderen want staat ook dubbel in evaluatestartpakket.js
+
+
+
+async function coursesEnrolled(page) {
+    /*connection to local host
+    const browser = await puppeteer.connect({
+        browserURL: "http://localhost:9222", // Connect to the browser's debugging address
+    });
+
+// Get all open pages (tabs)
+    const pages = await browser.pages();
+    console.log(`Found ${pages.length} open pages on the browser.`);
+
+// Interact with the last tab (or any tab of choice)
+    let page = pages[pages.length - 1]; // Choose the last opened tab
+    console.log("Current URL:", page.url()); */
+
+    let contentFrame= await getContentFrame(page);
+    const uitvouwenButton = await contentFrame.$('input[id="DERIVED_SAA_DPR_SSS_EXPAND_ALL"]');
+    if (uitvouwenButton) {
+        await uitvouwenButton.click();
+        console.log("uitvouwen button clicked");
+        await wait(2000);
+        contentFrame= await getContentFrame(page)
+    }
+    const collapseArrows = await contentFrame.$$('a.PSHYPERLINK.PTCOLLAPSE_ARROW');
+    const excludedArrow = await contentFrame.$('a[title="Sectie samenvouwen AFSTUDEERVEREISTEN BACHELOR GESCHIEDENIS"]');
+    const excludedTbody = await excludedArrow.evaluate(el => el.closest('tbody'));
+
+    for (const arrow of collapseArrows) {
+        const isExcluded = await arrow.evaluate((el, excludedTbody) => {
+            const title = el.getAttribute('title');
+            const tbody = el.closest('tbody');
+            return title === 'Sectie samenvouwen AFSTUDEERVEREISTEN BACHELOR GESCHIEDENIS' || tbody === excludedTbody;
+        }, excludedTbody);
+
+        if (!isExcluded) {
+            const isStillInDOM = await arrow.evaluate(el => document.body.contains(el));
+            if (isStillInDOM) {
+                await arrow.click();
+                await wait(500); // Adjust the wait time as needed
+            }
+        }
+    }
+
+    contentFrame= await getContentFrame(page)
+
+    const rowData = await contentFrame.$$eval(
+        'span',
+        (spans) => {
+            const uniqueEntries = new Set();
+            return spans
+                .filter((span) => span.innerText.trim().includes('Academiejaar'))
+                .map((span) => {
+                    const tr = span.closest('tr');
+                    if (!tr) return null;
+                    const tds = tr.querySelectorAll('td');
+                    const getInnerHtml = (element) => {
+                        const aElement = element.querySelector('a');
+                        return aElement ? aElement.innerHTML.trim() : element.innerHTML.trim();
+                    };
+                    const studiegidsNummer = tds[0] ? getInnerHtml(tds[0].querySelector('span')) : '';
+                    const opleidingsOnderdeel = tds[1] ? getInnerHtml(tds[1].querySelector('span')) : '';
+                    const studiepunten = tds[2] ? getInnerHtml(tds[2].querySelector('span')) : '';
+                    if (uniqueEntries.has(studiegidsNummer)) return null;
+                    uniqueEntries.add(studiegidsNummer);
+                    return {
+                        studiegidsNummer,
+                        opleidingsOnderdeel,
+                        studiepunten,
+                    };
+                })
+                .filter((entry) => entry);
+        }
+    );
+
+    console.log(rowData);
+    const totalStudiepunten = sumStudiepunten(rowData);
+    console.log(`Total studiepunten: ${totalStudiepunten}`);
+    //return rowData;
+
+}
+
+function sumStudiepunten(rowData) {
+    return rowData.reduce((total, row) => {
+        const studiepunten = parseFloat(row.studiepunten) || 0;
+        return total + studiepunten;
+    }, 0);
+}
+
+async function getContentFrame(page) {
+    await page.waitForSelector(IFRAME_SELECTOR);
+    const iframe = await page.$(IFRAME_SELECTOR);
+    if (!iframe) {
+        throw new Error("Could not find iframe on the AA-page");
+    }
+    console.log("iframe found on AA-page");
+    return await iframe.contentFrame();
+}
+
+module.exports = coursesEnrolled;
\ No newline at end of file
diff --git a/iterateOverDashboardTable.js b/iterateOverDashboardTable.js
index 8b4f272..a8440bb 100644
--- a/iterateOverDashboardTable.js
+++ b/iterateOverDashboardTable.js
@@ -2,6 +2,7 @@
 open chrome in debug modus
 start chrome --remote-debugging-port=9222 --user-data-dir="C:\ChromeDebug"
 navigeer naar het dashboard en roep de lijst met startpakket studenten op die relevant zijn voor de test
+wees er zeker van dat de tab waarin je moet werken de meest rechtse tab is in de tabbladenbalk
 start dan het script
  */
 const puppeteer = require("puppeteer");
@@ -10,6 +11,7 @@ const fs = require("fs");
 const saveResultsToExcel = require("./saveResultsToExcel");
 const appendToExcel = require("./appendResultsToExcel");
 const wait = require("./wait");
+const courseEnrolled = require("./coursesEnrolled");
 
 async function iterateOverDashboardTable() {
   /*connection to local host */
@@ -137,12 +139,15 @@ async function iterateOverDashboardTable() {
         ErrorStr: error.message,
       };
     } finally {
-      await newPage.close();
+      //await newPage.close();
     }
     results.push(result);
     appendToExcel(result, filename);
+    await courseEnrolled(newPage)
+    await newPage.close()
   }
 
+
   console.log("All links processed.");
   saveResultsToExcel(results, "DashboardResults.xlsx");
   console.log("Results saved successfully to DashboardResults.xlsx");
diff --git a/todo.md b/todo.md
new file mode 100644
index 0000000..ee7df8a
--- /dev/null
+++ b/todo.md
@@ -0,0 +1,7 @@
+# TODO
+
+## High Priority
+- [ ] adviesrapport geeft geen buizen weer voor het huidige aj. Vakken verschijnen dan ook niet in de functie
+coursesenrolled. Hoe oplossen? Rapport deliberatie?
+  - dit is eig geen probleem voor het begin van het aj wanneer nog geen examenperiode heeft
+  plaatsgevonden.