const _ = require("lodash") ///////////////////////////////////////////////////////////////////////// module.exports = { alleAuswerten, } ///////////////////////////////////////////////////////////////////////// /** * Unterobjekte auswerten und LF kombinieren pro user * @param {[usr_id,login,firstname,lastname,obj_id,item_id,item_obj_id,status,status_changed]} data * @return {[usr_id,firstname,lastname,status,status_changed]} */ function alleAuswerten(data) { const grouped = _.groupBy(data, "usr_id") const ret = [] for (const items of Object.values(grouped)) { // console.log(items) if (!items.length) continue const unterStatusse = items.map(it => it.status) const newStatus = auswerten(unterStatusse) const status_changed = _.max(items.map(u => u.status_changed)) const {usr_id, login, firstname, lastname,} = items[0] const newItem = { usr_id, login, firstname, lastname, status: newStatus, status_changed } ret.push(newItem) } console.log(ret) return ret } function auswerten(unterStatusse) { // unter Status auswerten // 0 = noch nicht bearbeitet // 1 = in Bearbeitung // 2 = bestanden // 3 = nicht bestanden // Fall 1: keine Unterstatussse vorhanden -> 0 if (!unterStatusse.length) { return 0 } // Fall 2: eines nicht bestanden -> alles nicht bestanden // 0,1,2,3 -> 3 if (unterStatusse.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] } // Fall 4: wenn eines in Bearbeitung -> in Bearbeitung // 0,1,0 2,1,2 if (unterStatusse.some(u => u === 1)) { return 1 } // Fall 5: sonst 0 return 0 } function isAllSame(items) { if (!items.length) return false const first = items[0] return items.every(it => it === first) }