From 3fce3e400fd44d3b6f345a31413e0ad2b7724107 Mon Sep 17 00:00:00 2001
From: alex <alex@alexloehr.net>
Date: Mon, 17 Nov 2025 17:42:43 +0000
Subject: [PATCH] GS-2373

---
 lib/db.js |  101 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 97 insertions(+), 4 deletions(-)

diff --git a/lib/db.js b/lib/db.js
index d02f06c..5a27371 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")
@@ -86,7 +87,7 @@
 }
 
 async function getUsers(offset = 0, limit = 10, search = null) {
-    log.info("++++++++++ get users", offset, limit, search)
+    // log.info("++++++++++ get users", offset, limit, search)
     limit = Number(limit) || 10
     offset = Number(offset) || 0
     // TODO check args for SQL Injection
@@ -405,17 +406,106 @@
     return results
 }
 
-async function getKursLp(obj_id) {
+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 ulc.obj_id,
+    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,
-                      ulm.usr_id,
+                      od.type,
                       ulm.status,
                       ulm.status_changed,
                       ulm.percentage,
@@ -423,9 +513,12 @@
                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

--
Gitblit v1.8.0