From d13e2360b6dad80da567348c1013353a2fc2297e Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Thu, 23 Oct 2025 14:28:10 +0000
Subject: [PATCH] GS-2375

---
 lib/db.js |  111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 109 insertions(+), 2 deletions(-)

diff --git a/lib/db.js b/lib/db.js
index 6f9922c..591b25f 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -1,5 +1,6 @@
 const mysql = require("mysql2/promise")
 const dayjs = require("dayjs")
+const _ = require("lodash")
 
 const log = require("../logger")
 const searchLib = require("./search")
@@ -42,6 +43,9 @@
     getKursTeilnehmer,
     getSingleKursTeilnehmer,
     getKursTeilnehmerCount,
+
+    getKursLp,
+    getKursUnterobjektLp,
 
     getKursOffline,
     setKursOffline,
@@ -402,10 +406,113 @@
     return results
 }
 
+async function getKursLp(obj_id) {
+    const {ref_id} = await getRefIdFromObjId(obj_id)
+    console.log(ref_id)
+    const teilnehmer = await getKursTeilnehmer(ref_id)
+    const tnUnter = await getKursUnterobjektLp(obj_id)
+    console.table(teilnehmer)
+    console.table(tnUnter)
+
+    /**
+     * Die beiden Datensätze mergen
+     *
+     *
+     */
+
+    const idx = _.groupBy(tnUnter, "usr_id")
+    for (const tn of teilnehmer) {
+        delete tn.parent_id
+        delete tn.type
+        delete tn.active
+
+        /** @type Array */
+        const unter = idx[tn.usr_id]
+        if (!unter) continue
+
+        /**
+         * wenn unter.status_changed neuer, wird unter tn.status_changed vorgezogen
+         * wenn unter.status neuer, überscheibt es tn.status
+         * tn.passed muss zurückgesetzt werden wenn tn.status überschrieben wird
+         */
+        tn.status_overwrite = false
+
+        // max unter status_changed finden
+        const unterStatusChanged = _.max(unter.map(u => u.status_changed))
+
+        // es muss nur überschrieben werden wenn das Unterdatum größer ist
+        if (unterStatusChanged > tn.status_changed) {
+            // unter Status auswerten
+            // 0 = noch nicht bearbeitet
+            // 1 = in Bearbeitung
+            // 2 = bestanden
+            // 3 = nicht bestanden
+
+            /** @type Array */
+            const unterStatusse = unter.map(u => u.status)
+            let newStatus = tn.status
+            const allSame = function () {
+                if (!unterStatusse.length) return false
+                const first = unterStatusse[0]
+                return unterStatusse.every(it => it === first)
+            }()
+            console.log({unterStatusse})
+            // Fall 1: keine Unterstatussse vorhanden -> status vom Kurs
+            if (!unterStatusse.length) {
+                newStatus = tn.status
+            }
+            // Fall 2: eines nicht bestanden -> nicht bestanden // 0,1,2,3 -> 3
+            if (unterStatusse.some(u => u === 3)) {
+                newStatus = 3
+            }
+            // Fall 3: alle statusse gleich -> status // 0,0,0 1,1,1 2,2,2 3,3,3
+            else if (allSame) {
+                newStatus = unterStatusse[0]
+            }
+            // Fall 4: wenn eines in Bearbeitung -> in Bearbeitung // 0,1,0 2,1,2
+            else if (unterStatusse.some(u => u === 1)) {
+                newStatus = 1
+            }
+            // Fall 5: sonst in Bearbeitung
+            else {
+                // newStatus = Math.max.apply(this, unterStatusse)
+                newStatus = 1
+            }
+            tn.status_changed = unterStatusChanged
+            tn.status = newStatus
+            tn.status_overwrite = true
+        }
+    }
+    return teilnehmer
+}
+
+async function getKursUnterobjektLp(obj_id) {
+    const pool = await poolP
+    const q = `SELECT ulc.obj_id,
+                      ulc.item_id,
+                      ulc.lpmode,
+                      t.obj_id as item_obj_id,
+                      ulm.usr_id,
+                      ulm.status,
+                      ulm.status_changed,
+                      ulm.percentage,
+                      ulm.completed
+               FROM ${database}.ut_lp_collections ulc
+                        INNER JOIN ${database}.object_reference t ON t.ref_id = ulc.item_id
+                        INNER JOIN ${database}.ut_lp_marks ulm ON ulm.obj_id = t.obj_id
+               WHERE ulc.obj_id = ${obj_id} # obj_id Kurs
+                    AND ulc.active = 1
+                    AND ulc.lpmode = 5  # nur mode 5
+    `
+    const [results] = await pool.query(q)
+    return results
+}
+
+
 async function getKursOffline(obj_id) {
     const pool = await poolP
-    const q = `SELECT offline 
-                FROM ${database}.object_data
+    const q = `SELECT offline
+               FROM ${database}.object_data
                WHERE obj_id = ${obj_id}
     `
     const [results] = await pool.query(q)

--
Gitblit v1.8.0