REST Service for POPCORN - ILIAS
alex
10 hours ago db2a97df620408dc8d76cf37c287bc5e7bf0e14d
lib/libLp.js
@@ -1,9 +1,12 @@
const _ = require("lodash")
const dayjs = require("dayjs")
/////////////////////////////////////////////////////////////////////////
module.exports = {
    alleAuswerten,
   auswerten,
   partitionDates,
}
/////////////////////////////////////////////////////////////////////////
@@ -18,10 +21,14 @@
    const ret = []
    for (const items of Object.values(grouped)) {
        if (!items.length) continue
        const unterStatusse = items.map(it => it.status)
      // const unterStatusse = items.map(it => it.status)
      // const newStatus = auswerten(unterStatusse)
      // const status_changed = _.max(items.map(u => u.status_changed))
        // TODO GS-2555 Datum berücksichtigen für die Auswertung
        const newStatus = auswerten(unterStatusse)
      const statusData = items.map(({status_changed, status}) => ({status_changed, status}))
      const newStatus = auswerten(statusData)
        const status_changed = _.max(items.map(u => u.status_changed))
        const {usr_id, login, firstname, lastname,} = items[0]
@@ -33,30 +40,44 @@
    return ret
}
function auswerten(unterStatusse) {
/**
 * Neuen Status berechnen
 * @param {{status,status_changed}[]} statusData
 * @return {number}
 */
function auswerten(statusData) {
    // unter Status auswerten
    // 0 = noch nicht bearbeitet
    // 1 = in Bearbeitung
    // 2 = bestanden
    // 3 = nicht bestanden
    // Fall 1: keine Unterstatussse vorhanden -> 0
    if (!unterStatusse.length) {
   if (!statusData.length) {
        return 0
    }
   const maxDate = dayjs(_.max(statusData.map(it => it.status_changed)))
   const {inside, outside} = partitionDates(maxDate, statusData)
    // Fall 2: eines nicht bestanden -> alles nicht bestanden // 0,1,2,3 -> 3
    if (unterStatusse.some(u => u === 3)) {
   // hier kommt es nicht darauf an ob noch Daten in outside sind
   if (inside.map(it => it.status).some(u => u === 3)) {
        return 3
    }
    // Fall 3: alle statusse gleich -> status // 0,0,0 1,1,1 2,2,2 3,3,3
    if (isAllSame(unterStatusse)) {
        return unterStatusse[0]
   // wenn outside nicht leer ist -> in Bearbeitung
   if (isAllSame(inside.map(it => it.status))) {
      // wenn keine Einträge in outside vorhanden sind einfach den Status zurückgeben
      if(!outside.length) return statusData[0].status
      // ansonsten in Bearbeitung
      return 1
    }
    // Fall 4: wenn eines in Bearbeitung -> in Bearbeitung // 0,1,0 2,1,2
    if (unterStatusse.some(u => u === 1 || u === 2)) {
   if (inside.map(it=>it.status).some(u => u === 1 || u === 2)) {
        return 1
    }
@@ -64,6 +85,23 @@
    return 0
}
/**
 * @param  {Date} maxDate
 * @param {{status, status_changed}[]} items
 */
function partitionDates(maxDate, items) {
   const [inside, outside] = _.partition(items, function (it) {
      return isInBallpark(maxDate, it.status_changed)
   })
   return {inside, outside}
}
function isInBallpark(maxDate, date) {
   const ballpark = {value: 1, unit: "month"}
   const diff = maxDate.diff(date, ballpark.unit, true)
   return diff <= ballpark.value
}
function isAllSame(items) {
    if (!items.length) return false
    const first = items[0]