diff --git a/cis/testtool/admin/edit_gebiet.php b/cis/testtool/admin/edit_gebiet.php index 80a205574..5610679b4 100644 --- a/cis/testtool/admin/edit_gebiet.php +++ b/cis/testtool/admin/edit_gebiet.php @@ -259,12 +259,16 @@ if ($gebiet_id != '') echo 'Maximale Punkteanzahl'.$hinweis.''; echo ''; // empfohlene offsetpunkte berechnen und anzeigen + $offsethinweis = ''; $offsetpunkte = $gebiet->berechneOffsetpunkte($gebiet_id); - if ($gebiet->offsetpunkte != $offsetpunkte) - $hinweis = ' empfohlene Offsetpunkteanzahl: '.round($offsetpunkte).(round($offsetpunkte) != $offsetpunkte?' ('.$offsetpunkte.' gerundet)':'').''; - else - $hinweis = ''; - echo 'Offsetpunkte (minimale Punkteanzahl)'.$hinweis.''; + if ($offsetpunkte) + { + $offsetwarnung = strlen($gebiet->errormsg) > 0 ? ' (HINWEIS: '.$gebiet->errormsg.')' : ''; + + if ($gebiet->offsetpunkte != $offsetpunkte) + $offsethinweis = ' empfohlene Offsetpunkteanzahl: '.round($offsetpunkte).(round($offsetpunkte) != $offsetpunkte ? ' ('.$offsetpunkte.' gerundet)' : '').$offsetwarnung.''; + } + echo 'Offsetpunkte (minimale Punkteanzahl)'.$offsethinweis.''; echo ''; echo 'Maximale Fragenanzahl'; echo ''; diff --git a/include/gebiet.class.php b/include/gebiet.class.php index 0268944cc..dbdd50b3d 100644 --- a/include/gebiet.class.php +++ b/include/gebiet.class.php @@ -632,6 +632,49 @@ class gebiet extends basis_db if(!$this->load($gebiet_id)) return false; + $checkqry = "SELECT COUNT (uniquepoints) AS count_uniquepoints + FROM ( + SELECT gebiet_id, + level, + count(DISTINCT punkte), + CASE WHEN count(DISTINCT punkte) > 1 THEN FALSE ELSE TRUE END AS uniquepoints + FROM ( + SELECT tbl_frage.gebiet_id, + tbl_frage.level, + CASE WHEN multipleresponse THEN sum(punkte) ELSE min(punkte) END AS punkte + FROM testtool.tbl_frage + JOIN testtool.tbl_vorschlag USING (frage_id) + JOIN testtool.tbl_gebiet USING (gebiet_id) + WHERE tbl_vorschlag.aktiv + AND tbl_vorschlag.punkte < 0 + AND tbl_frage.demo = false + AND tbl_frage.aktiv + AND gebiet_id = ".$this->db_add_param($gebiet_id, FHC_INTEGER)." + GROUP BY tbl_frage.gebiet_id, multipleresponse, tbl_frage.level, tbl_frage.frage_id + ) p + GROUP BY gebiet_id, level + ) pu + WHERE uniquepoints = FALSE"; + + if($this->db_query($checkqry)) + { + if($row = $this->db_fetch_object()) + { + if (!is_numeric($row->count_uniquepoints) || $row->count_uniquepoints > 0) + $this->errormsg = 'Negativpunkte sind nicht für alle Fragen gleich hoch!'; + } + else + { + $this->errormsg = 'Fehler beim Prüfen der Offsetpunkte'; + return false; + } + } + else + { + $this->errormsg = 'Fehler beim Prüfen der Offsetpunkte'; + return false; + } + $qry = " WITH fragen AS ( SELECT tbl_frage.frage_id, tbl_frage.gebiet_id, tbl_frage.level, punkte @@ -688,7 +731,7 @@ class gebiet extends basis_db AND frage_id = (SELECT min(frage_id) FROM fragen fr WHERE fr.gebiet_id = fragen.gebiet_id AND fr.level = fragen.level) GROUP BY fragen.gebiet_id, level ) pkteprolevel) - END) *(-1) + END) WHEN tbl_gebiet.level_start IS NOT NULL THEN (CASE WHEN tbl_gebiet.multipleresponse=false THEN ( @@ -696,31 +739,31 @@ class gebiet extends basis_db FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id AND fragen.level = tbl_gebiet.level_start - ) * (SELECT fragenanzahl.anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1) + ) * (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1) ELSE (SELECT sum(punkte) FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id AND frage_id = (SELECT min(frage_id) FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id) AND fragen.level = tbl_gebiet.level_start - )* (SELECT fragenanzahl.anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1) - END) *(-1) + )* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id AND fragenanzahl.level = tbl_gebiet.level_start LIMIT 1) + END) ELSE (CASE WHEN tbl_gebiet.multipleresponse=false THEN ( SELECT min(punkte) FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id - ) * (SELECT fragenanzahl.anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) + ) * (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) ELSE (SELECT sum(punkte) FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id AND frage_id = (SELECT min(frage_id) FROM fragen WHERE fragen.gebiet_id = tbl_gebiet.gebiet_id) - )* (SELECT fragenanzahl.anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) - END) *(-1) + )* (SELECT anzahl FROM fragenanzahl WHERE fragenanzahl.gebiet_id = tbl_gebiet.gebiet_id LIMIT 1) + END) - END) AS offsetpunkte + END) * (-1) AS offsetpunkte FROM testtool.tbl_gebiet WHERE