diff --git a/vilesci/personen/aliquote_reduktion.php b/vilesci/personen/aliquote_reduktion.php index 6b54d209f..afc85b84d 100644 --- a/vilesci/personen/aliquote_reduktion.php +++ b/vilesci/personen/aliquote_reduktion.php @@ -74,6 +74,7 @@ aqr.studiengaenge = []; aqr.studiensemester = []; aqr.studienplaetze = []; + aqr.actualSequence = 1; SERVICE_TARGET = "aliquote_reduktion.json.php" if(!aqr.studiensemester_kurzbz) @@ -180,6 +181,7 @@ aqr.loadStudenten = function() { + aqr.actualSequence = 1; aqr.studenten=[]; if(aqr.selectedStudienplatz && aqr.selectedStudienplatz.studienplan_id) AJAXCall({action:"getStudenten",studiengang_kz:aqr.selectedStudiengang.studiengang_kz,studienplan_id:aqr.selectedStudienplatz.studienplan_id,studiensemester_kurzbz:aqr.selectedStudiensemester.studiensemester_kurzbz},function(res) @@ -224,6 +226,7 @@ { if(parseInt(aqr.selectedStudienplatz.apz) >= 0) { + aqr.studenten.sort(sortStudentenRTP); var zgvs = aqr.getZGVArray(); var neededStudentsCount = aqr.selectedStudienplatz.apz - aqr.getAcceptedCount(); @@ -234,54 +237,97 @@ { zgvElems.push({name:i,needed:perZGV}); }); + var residual = perZGV * zgvs.length; + var resDiff = neededStudentsCount - residual; - aqr.studenten.sort(sortStudentenRTP); - aqr.recursiveChoose(neededStudentsCount, zgvElems); + // distribute the remaining places + while(resDiff > 0) + { + zgvElems.forEach(function(i) + { + if(resDiff > 0) + { + i.needed ++; + resDiff --; + } + }); + } + aqr.recursiveChoose(aqr.selectedStudienplatz.apz, zgvElems); } } + aqr.getActualSeq = function() + { + aqr.actualSequence ++; + return aqr.actualSequence; + } + aqr.setSequence = function(elem) + { + if(!elem.seqPlace) + { + elem.seqPlace = aqr.actualSequence; + } + aqr.actualSequence ++; + } + aqr.recursiveChoose = function(needed, zgvElems) { - var beginNeeded = JSON.parse(JSON.stringify(needed)); - aqr.studenten.forEach(function(i) + var beginNeeded = needed; + + for(var i=0; i < zgvElems.length; i++) { - if(i.laststatus=='Wartender'||i.laststatus=='Bewerber') + for(var j in aqr.studenten) { - zgvElems.forEach(function(j) + if( + aqr.studenten[j].laststatus!='Abgewiesener' + && aqr.studenten[j].laststatus!='Abbrecher' + && zgvElems[i].needed > 0 + && aqr.studenten[j].bezeichnung == zgvElems[i].name + && !aqr.studenten[j].seqPlace) { - if(j.needed > 0 && !i.selected && i.bezeichnung == j.name) + aqr.setSequence(aqr.studenten[j]); + zgvElems[i].needed --; + aqr.studenten[j].selected = true; + needed --; + break; + } + } + } + + if(needed < 1 || beginNeeded == needed) + { + for(var j in aqr.studenten) + { + if(!aqr.studenten[j].selected && aqr.studenten[j].bezeichnung) + { + aqr.setSequence(aqr.studenten[j]); + if(needed > 0 && (aqr.studenten[j].laststatus=='Wartender'||aqr.studenten[j].laststatus=='Bewerber')) { - i.selected = true; - j.needed --; + aqr.studenten[j].selected = true; needed --; } - }); - } - }); - - if(beginNeeded == needed) - { - var endless = true; - zgvElems.forEach(function(j) - { - if(j.needed < 1) - { - j.needed ++; - endless = false; } - }); - } - if(endless) - { - //prevent deadlock(should never happen) - alert("Die Automatische Selektierung konnte nicht abgeschlossen werden!"); + } + for(var j in aqr.studenten) + { + if(!aqr.studenten[j].selected && !aqr.studenten[j].bezeichnung) + { + aqr.setSequence(aqr.studenten[j]); + if(needed > 0 && (aqr.studenten[j].laststatus=='Wartender'||aqr.studenten[j].laststatus=='Bewerber')) + { + aqr.studenten[j].selected = true; + needed --; + } + } + } + if(needed > 0) + alert("Es werden mehr Studenten benötigt, als es Bewerber gibt!"); return; } - if(needed > 0) - aqr.recursiveChoose(needed, zgvElems); else { + aqr.recursiveChoose(needed, zgvElems); } } }); @@ -305,8 +351,9 @@