From 0a2afeb91d1ff61f9d9446999f8550969871becf Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Mon, 17 Nov 2025 16:27:49 +0000
Subject: [PATCH] GS-2373

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

diff --git a/lib/db.js b/lib/db.js
index 6f9922c..a9a41a7 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,129 @@
     return results
 }
 
+async function getKursLp(obj_id, raw = false) {
+    const {ref_id} = await getRefIdFromObjId(obj_id)
+    const tnUnter = await getKursUnterobjektLp(obj_id)
+
+    if (raw) {
+        return tnUnter
+    } else { // LP aller Unterobjekte zusammenfassen
+        const libLp = require("../lib/libLp")
+        const data = libLp.alleAuswerten(tnUnter)
+        return data
+    }
+
+    // const teilnehmer = await getKursTeilnehmer(ref_id)
+    // const tnUnter = await getKursUnterobjektLp(obj_id)
+    // console.table(teilnehmer)
+    // console.table(tnUnter)
+    //
+    // /**
+    //  * Die beiden Datensätze mergen
+    //  * NEIN - es reicht der
+    //  *
+    //  */
+    //
+    // 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 ud.usr_id,
+                      ud.login,
+                      ud.firstname,
+                      ud.lastname,
+                      ulc.obj_id,
+                      ulc.item_id,
+                      ulc.lpmode,
+                      t.obj_id as item_obj_id,
+                      od.type,
+                      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
+                        INNER JOIN ${database}.usr_data ud ON ud.usr_id = ulm.usr_id
+                        INNER JOIN ${database}.object_data od ON od.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
+               ORDER BY ud.usr_id, ulc.item_id
+    `
+    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