REST Service for POPCORN - ILIAS
alex
2025-10-23 951966febb19bad7a8581393fe09ee34909cc621
GS-2375
2 files modified
85 ■■■■■ changed files
lib/db.js 77 ●●●●● patch | view | raw | blame | history
test/testKursLp.js 8 ●●●● patch | view | raw | blame | history
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")
@@ -406,7 +407,83 @@
}
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) {
test/testKursLp.js
@@ -21,7 +21,7 @@
    describe("the function getKursUnterobjektLp", function () {
        it("should deliver the LP for the Kurs Unterobjekte", async function () {
            const res = await db.getKursUnterobjektLp(kursId)
            console.table(res)
            // console.table(res)
            expect(res).to.be.a("array")
            for(const item of res) {
                expect(item).to.have.property("obj_id").and.to.be.a("number")
@@ -35,6 +35,12 @@
        })
    })
    describe("the function getKursLp", function () {
        it("should return the unified LP of a Kurs", async function () {
            const res = await db.getKursLp(kursId)
            console.table(res)
        })
    })
})